将加密 API 调用转换为 .NET
本文关键字:NET 转换 调用 加密 API | 更新日期: 2023-09-27 18:31:40
我在C++中有这段代码(AnsiString是char*缓冲区的包装器):
BOOL HashIt(AnsiString &pw,BYTE *buf,BYTE &len)
{
HCRYPTPROV cp;
CryptAcquireContext(&cp,NULL,NULL,PROV_RSA_AES,CRYPT_VERIFYCONTEXT);
HCRYPTHASH ch;
CryptCreateHash(cp,CALG_MD5,0,0,&ch);
CryptHashData(ch,(BYTE*)pw.c_str(),pw.Length(),0);
HCRYPTKEY kc;
CryptDeriveKey(cp,CALG_3DES,ch,CRYPT_EXPORTABLE,&kc);
CryptExportKey(kc,NULL,PLAINTEXTKEYBLOB,0,buf,&dwLen);
len = (BYTE) dwLen;
}
到目前为止,我已经将其转换为 .NET:
public static byte[] HashItB(string text)
{
byte[] textBytes = System.Text.Encoding.UTF8.GetBytes(text);
System.Security.Cryptography.MD5CryptoServiceProvider sp = new System.Security.Cryptography.MD5CryptoServiceProvider();
byte[] hashBytes = sp.ComputeHash(textBytes);
System.Security.Cryptography.PasswordDeriveBytes pdb = new System.Security.Cryptography.PasswordDeriveBytes(hashBytes, new byte[0]);
hashBytes = pdb.CryptDeriveKey("TripleDES", "SHA1", 192, hashBytes);
// Need to export key as plain text blob here, CryptExportKey
return (hashBytes);
}
假设上面的代码是正确的,我的最后一步是将CryptExportKey函数转换为.NET。 有人可以指出我的功能或示例吗? 我无法更改C++方法,我需要我的 .NET 代码来匹配旧版应用。 或者我应该放弃 .NET 方法并创建一个C++ DLL 并调用它(由于在我的小应用程序中运送另一个 DLL 的额外大小,对此并不疯狂),或者调用所有加密函数?
.
NET 方法PasswordDeriveBytes.CryptDeriveKey()
等效于 使用 Win32 CryptoAPI 方法对密码进行哈希处理、调用CryptDeriveKey
,最后通过调用CryptExportKey
导出密钥。
您的C++代码等效于:
byte[] textBytes = System.Text.Encoding.Default.GetBytes(text); // Default is the ANSI-code-page
System.Security.Cryptography.PasswordDeriveBytes pdb = new System.Security.Cryptography.PasswordDeriveBytes(textBytes, new byte[0]);
byte[] hashBytes = pdb.CryptDeriveKey("TripleDES", "MD5", 0, new byte[8]);
除了.NET 代码从导出的密钥(PLAINTEXTKEYBLOB 标头)中删除一些标头数据。对于 192 位 3DES 密钥,这是"08 02 00 00 03 66 00 00 18 00 00 00"
。您只需在 .网络代码,如果你需要它。
PasswordDeriveBytes.CryptDeriveKey 方法已经返回派生密钥,因此无需像C++代码中那样导出密钥。
感谢您的帮助,如果以后有人需要阅读这篇文章,这就是我最终得到的。 我确信字节数组构建可能会更好,但就我而言,这段代码不需要很快,所以我只是使用了我很容易阅读的内容:
public static byte[] HashIt(string text)
{
byte[] textBytes = System.Text.Encoding.UTF8.GetBytes(text);
System.Security.Cryptography.PasswordDeriveBytes pdb = new System.Security.Cryptography.PasswordDeriveBytes(textBytes, new byte[0]);
byte[] hashBytes = pdb.CryptDeriveKey("TripleDES", "MD5", 0, new byte[8]);
byte[] head = new byte[] { 0x08,0x02, 0x00, 0x00, 0x03, 0x66, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00 };
byte[] hashBytesWithHead = new byte[hashBytes.Length + head.Length];
head.CopyTo(hashBytesWithHead,0);
hashBytes.CopyTo(hashBytesWithHead,head.Length);
return (hashBytesWithHead);
}