2012-12-19 4 views
8

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?

Antwort

3

Sie können keine nicht exportierbare Schlüssel in einem HSM zur Verschlüsselung oder Entschlüsselung im Speicher verwenden. Da Sie versuchen, eine Verschlüsselung im Speicher durchzuführen, versucht .NET, den privaten Schlüssel in den Speicher zu holen, und er wird von HSM verhindert. Auf der anderen Seite können Sie das Handle des privaten Schlüssels haben und Ihre "zu verschlüsselnden/zu entschlüsselnden Daten" an HSM senden. Mit anderen Worten, Sie können HSM anweisen, Ihre Daten mit dem darin enthaltenen privaten Schlüssel zu verschlüsseln, indem Sie dessen Handle angeben.

Ihr HSM sollten Sie eine API zur Verfügung stellen, die PKCS11-Standard und oft geschrieben in C implementiert, kann Sie extern Methoden aus dieser nicht verwalteten Bibliothek und nutzen sie in C#. Here können Sie eine PKCS11 Wrapper-Bibliothek in C# geschrieben finden.

+0

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

Verwandte Themen