RSA-Verschlüsselung mit nicht exportierbarem Schlüssel in HSM mit C # / CSP

8

Ich versuche, einen symmetrischen Schlüssel mit einem RSA (Exchange-Schlüssel in CSP) in C # unter Verwendung dieses Codeabschnitts zu verschlüsseln (der RSA-Schlüssel CSP50C8C7CD ist nicht exportierbar und befindet sich in HSM):

%Vor%

Wenn ich das CSP-Protokoll sehe, bemerke ich, dass das C # versucht, den Schlüssel zu exportieren, um mit der Operation fortzufahren. Das CSP-Protokoll unten zeigt nur das Stück über rsa_dnet.Encrypt verwenden:

%Vor%

Windows SO ruft einen CryptExportKey auf, der PRIVATEKEYBLOB übergibt, um den privaten Schlüssel zu exportieren.

%Vor%

In HSM zeigt dieses Protokoll, dass Windows SO versucht, den privaten Schlüssel zu extrahieren (was ERRO bedeutet, weil der Schlüssel nicht exportierbar ist).

Wenn ich einen exportierbaren Schlüssel CSP50C8C7CE in HSM verwende, zeigt das Protokoll, dass alles in Ordnung ist:

%Vor%

Beachten Sie, dass in diesem Protokoll die Vorgänge des RSA-Schlüsselimports / -exports aufgeführt sind (Referenz: CSP50C8C7CE - Exportierbarer Schlüssel).

Frage: Die Encrypt-Funktion in der Bibliothek System.Cryptography benötigt den Schlüssel muss immer exportierbar sein? Oder mache ich einen Fehler in meinem Programm? Irgendwelche versäumten Parameter vielleicht?

    
Vasconcelos 19.12.2012, 18:40
quelle

1 Antwort

3

Sie können einen nicht exportierbaren Schlüssel in einem HSM nicht für die 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 sollte Ihnen eine API zur Verfügung stellen, die den PKCS11-Standard implementiert und oft in C geschrieben ist. Sie können Methoden aus dieser nicht verwalteten Bibliothek extern öffnen und sie in C # verwenden. Hier finden Sie eine in C # geschriebene PKCS11-Wrapper-Bibliothek.

    
Mehmet Ataş 19.12.2012 21:23
quelle