私は 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 を出荷するための余分なサイズのため、それについては夢中ではありません)、またはすべての暗号関数をピンボークする必要がありますか?