背景:
CAPICOM的全名是Cryptographic API Component Object Model,是微软的Windows操作系统里的元件。为了支持密码编译功能,微软在 Windows API 之中加入了 Cryptographic API (CryptoAPI)[1],然而 CryptoAPI 的使用方法相当复杂,为了简化 CryptoAPI 的使用,微软即将它以 COM 的方式包装成 CAPICOM[2],让应用程序只需要利用 COM 调用方式,即可使用 CryptoAPI。
前提:
MSDN中,提供了一个使用Cryptographic API进行加密和解密的例子,位置是:
security/example_c_program_decrypting_a_file.htm
security/example_c_program_encrypting_a_file.htm
提问:
我使用security/example_c_program_encrypting_a_file.htm中的例子将一个文件加密,是否能提供CAPICOM的程序,将该文件解密呢?
10 个解决方案
看你用什么方式加密。
如果采用当前用户的密钥容器中的密钥来加密,则该用户可以解密。
如果用固定的密码加密,则用该密码可以解密。
注:C#可以直接用System.Security.Cryptography命名空间下的类库而不必用C++程序。
使用固定的密码解密,使用CryptoAPI做这些事情都没问题。
使用CAPICOM也应该能解密CryptoAPI的文件,但我就是不知道脚本怎么写。
麻烦了。
MSDN上的例子
using System;
using System.Security.Cryptography;
using System.Text;
using System.IO;
class RijndaelSample
{
static void Main()
{
try
{
// Create a new Rijndael object to generate a key
// and initialization vector (IV).
Rijndael RijndaelAlg = Rijndael.Create();
// Create a string to encrypt.
string sData = "Here is some data to encrypt.";
string FileName = "CText.txt";
// Encrypt text to a file using the file name, key, and IV.
EncryptTextToFile(sData, FileName, RijndaelAlg.Key, RijndaelAlg.IV);
// Decrypt the text from a file using the file name, key, and IV.
string Final = DecryptTextFromFile(FileName, RijndaelAlg.Key, RijndaelAlg.IV);
// Display the decrypted string to the console.
Console.WriteLine(Final);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
Console.ReadLine();
}
public static void EncryptTextToFile(String Data, String FileName, byte[] Key, byte[] IV)
{
try
{
// Create or open the specified file.
FileStream fStream = File.Open(FileName, FileMode.OpenOrCreate);
// Create a new Rijndael object.
Rijndael RijndaelAlg = Rijndael.Create();
// Create a CryptoStream using the FileStream
// and the passed key and initialization vector (IV).
CryptoStream cStream = new CryptoStream(fStream,
RijndaelAlg.CreateEncryptor(Key, IV),
CryptoStreamMode.Write);
// Create a StreamWriter using the CryptoStream.
StreamWriter sWriter = new StreamWriter(cStream);
try
{
// Write the data to the stream
// to encrypt it.
sWriter.WriteLine(Data);
}
catch (Exception e)
{
Console.WriteLine("An error occurred: {0}", e.Message);
}
finally
{
// Close the streams and
// close the file.
sWriter.Close();
cStream.Close();
fStream.Close();
}
}
catch (CryptographicException e)
{
Console.WriteLine("A Cryptographic error occurred: {0}", e.Message);
}
catch (UnauthorizedAccessException e)
{
Console.WriteLine("A file error occurred: {0}", e.Message);
}
}
public static string DecryptTextFromFile(String FileName, byte[] Key, byte[] IV)
{
try
{
// Create or open the specified file.
FileStream fStream = File.Open(FileName, FileMode.OpenOrCreate);
// Create a new Rijndael object.
Rijndael RijndaelAlg = Rijndael.Create();
// Create a CryptoStream using the FileStream
// and the passed key and initialization vector (IV).
CryptoStream cStream = new CryptoStream(fStream,
RijndaelAlg.CreateDecryptor(Key, IV),
CryptoStreamMode.Read);
// Create a StreamReader using the CryptoStream.
StreamReader sReader = new StreamReader(cStream);
string val = null;
try
{
// Read the data from the stream
// to decrypt it.
val = sReader.ReadLine();
}
catch (Exception e)
{
Console.WriteLine("An error occurred: {0}", e.Message);
}
finally
{
// Close the streams and
// close the file.
sReader.Close();
cStream.Close();
fStream.Close();
}
// Return the string.
return val;
}
catch (CryptographicException e)
{
Console.WriteLine("A Cryptographic error occurred: {0}", e.Message);
return null;
}
catch (UnauthorizedAccessException e)
{
Console.WriteLine("A file error occurred: {0}", e.Message);
return null;
}
}
}
to:cpio
1 MSDN上C代码的加密算法是RC4,而.net中好像没有提供这个加解密算法。
2 MSDN上C代码加解密之前首先将密码进行了MD5散列,使用该散列作为真正的密码进行加解密,而你给出的例子好像不是。
微软CAPICOM安装之后就有各种语言的调用例子啊
QQ:476833461