Ich versuche, einen symmetrischen Schlüssel mit einem RSA (Exchange-Schlüssel in CSP) in C# mit diesem Stück Code zu verschlüsseln (der RSA-Schlüssel CSP50C8C7CD ist nicht exportierbar, und es ist in HSM):RSA-Verschlüsselung mit nicht exportierbaren Schlüssel in HSM mit C#/CSP
CspParameters csp_dnet = new CspParameters(1, "HSM especific CSP");
csp_dnet.Flags = CspProviderFlags.UseNonExportableKey;
csp_dnet.KeyContainerName = "test";
RSACryptoServiceProvider rsa_dnet = new RSACryptoServiceProvider(csp_dnet);
// Create 3DES key
TripleDES tripleDES = new TripleDESCryptoServiceProvider();
// Encrypt 3DES with RSA
byte[] encryptedSessionKey = rsa_dnet.Encrypt(tripleDES.Key, false);
den CSP-Log sehen, stelle ich fest, dass die C# mit dem Betrieb fortfahren versucht, den Schlüssel zu exportieren. Das Protokoll CSP unten nur das Stück über Verwendung rsa_dnet.Encrypt zeigt:
LOG CSP
...
[12/12/2012 17:28:45] [3688] D [CryptExportKey] Blob type: PRIVATEKEYBLOB
...
[12/12/2012 17:28:45] [3688] E [CryptExportKey] Return: FALSE. An internal error occurred.
Windows-SO ruft eine CryptExportKey PRIVATEKEYBLOB vorbei bedeutet de privaten Schlüssel zu exportieren.
LOG HSM
...
2012/12/12 17:44:02 [4DD18140] new key 'test/CSP50C8C7CD', t: 6, a: 0
2012/12/12 17:44:14 [4DC2A1C0] 'test' auth ok, 10.0.87.19
2012/12/12 17:44:17 [4DC2A1C0] 'test/CSP50C8C7CD' not exportable, conn: 9 --- ERROR
In HSM dieses Protokoll zeigen, dass die Windows-SO versucht, den privaten Schlüssel zu extrahieren (was die ERRO bedeutet, da der Schlüssel nicht exportierbar ist).
Wenn ich einen exportierbaren Schlüssel CSP50C8C7CE in HSM, dem Show-Protokoll, das alles in Ordnung ist:
LOG HSM
...
2012/12/12 17:47:46 [4DEF4040] 'test' auth ok, IP: 10.0.87.19
2012/12/12 17:47:46 [4DEF4040] export: 'test/CSP50C8C7CE', 1462
2012/12/12 17:47:46 [4DEF4040] export: 'test/CSP50C8C7CE', 1462
2012/12/12 17:47:46 [4DEF4040] delete 'test/CSP50C8C7CE'
2012/12/12 17:47:46 [4DEF4040] import obj 'test/CSP50C8C7CE', 00000004
2012/12/12 17:47:46 [4DEF4040] pk test/CSP50C8C7CE [1]
2012/12/12 17:47:46 [4DEF4040] import obj 'cf1c34c8be5d2fa8a4575c63dd903454', 00000003
2012/12/12 17:47:46 [4DEF4040] delete 'test/CSP50C8C7CE'
2012/12/12 17:47:46 [4DEF4040] import obj 'test/CSP50C8C7CE', 00000006
2012/12/12 17:47:47 [4DEF4040] export: 'cf1c34c8be5d2fa8a4575c63dd903454', 24
2012/12/12 17:47:47 [4DEF4040] delete 'cf1c34c8be5d2fa8a4575c63dd903454'
Beachten Sie, dass dieses Protokoll zeigt viel von RSA-Schlüssel-Import/Export-Operationen (Referenz: CSP50C8C7CE - exportierbar Schlüssel).
Frage: Die Verschlüsselungsfunktion in der Bibliothek System.Cryptography muss der Schlüssel immer exportierbar sein? Oder mache ich einen Fehler in meinem Programm? Irgendwelche versäumten Parameter vielleicht?
die Idee ist, die Verschlüsselung auf HSM zu verwenden und CSP, dies zu tun zu verwenden. Der Zweck des Codes würde keine Verschlüsselung im Speicher vornehmen. Das HSM stellt einen CSP-Treiber bereit, der die spezifische API für ein solches Microsoft implementiert. Die Funktion ** rsa_dnet.Encrypt (tripleDES.Key, false) ** sollte nicht den privaten Schlüssel zu extrahieren versuchen, da das Flag CspProviderFlags.UseNonExportableKey aktiviert ist. – Vasconcelos