Hallo,
Ich möchte Daten entschlüsseln die zertifikatsbasiert (asymmetrisch) verschlüsselt sind, ohne dass ein Passwort-Dialog aufpoppt. Das notwendige Passwort soll über das Programm bereitgestellt werden.
Zusammenfassung:
Ich habe ein x509 Softwarezertifikat in den persönlichen Zertifikatsstore unter hohen Sicherheitseinstellungen installiert. Die Verschlüsselung funktioniert, die Entschlüsselung funktioniert ebenfalls, nur wird hier das Passwort zum Zugriff auf den privaten Schlüssel via Dialogfenster abgefragt.
Wie kann ich das Passwort zum Zugriff auf den privaten Schlüssel im Vorhinein festlegen?
Aktueller Status:
Mit Hilfe der folgenden Funktion verschlüssele ich meine Daten. Das x509 Zertifikat wird aus dem persönlichen Zertifikatsstore importiert und an die Funktion übergeben.
Public Function EncryptWithCertPubKey(cert As _
System.Security.Cryptography.X509Certificates.X509Certificate2, data As Byte( _
)) As Byte()
Dim rsa As System.Security.Cryptography.RSACryptoServiceProvider = TryCast( _
cert.PublicKey.Key, System.Security.Cryptography.RSACryptoServiceProvider)
Return rsa.Encrypt(data, True)
End Function Entschlüsselung mit dem x509 Softwarezertifikat (cert) aus dem persönlichen Zertifikatsstore (es enthält natürlich den private Schlüssel)
Das Passwort (certPass) wurde festgelegt als das Zertifikat in den Store unter hoher Sicherheit installiert worden ist.
Ein Export in Raw-Data und anschließender Import (hier im Konstruktor) schien mir ein Weg um gleichzeitig das Passwort im Voraus angeben zu können.
Public Function DecryptWithCertKey(cert As _
System.Security.Cryptography.X509Certificates.X509Certificate2, certPass As _
String, data As Byte()) As Byte()
Dim rawdata As Byte() = cert.Export( _
Security.Cryptography.X509Certificates.X509ContentType.Pkcs12, certPass)
Dim cert2 As New System.Security.Cryptography.X509Certificates.X509Certificate2( _
rawdata, certPass)
Dim rsa2 As System.Security.Cryptography.RSACryptoServiceProvider = TryCast( _
cert2.PrivateKey, System.Security.Cryptography.RSACryptoServiceProvider)
Return rsa2.Decrypt(data, True)
End Function Leider erscheint der Passwortdialog schon beim Export, also den Zugriff auf den privaten Schlüssel, und das obwohl das Passwort übergeben wurde (Wird der Dialog mit dem Passwort bedient, dann funktioniert auch alles.)
cert.Export(Security.Cryptography.X509Certificates.X509ContentType.Pkcs12, _
certPass) Es gibt nun die Property KeyPassword bei den CSP Parametern. Diese Eigenschaft ist extra dafür gedacht ein betreffendes Passwort für z.B. eine Smartcard im Voraus zu setzen, so dass zur Nutzungszeit kein Dialog erscheint.
Z.B.:
Dim certPass As New System.Security.SecureString
Dim cspp As New System.Security.Cryptography.CspParameters(1, "Microsoft Strong" & _
"Cryptographic Provider")
cspp.KeyPassword = certPass Ich finde leider keine Möglichkeit die beiden Welten miteinander zu verheiraten. Irgendwie müssen die CSP-Parameter mit in das x509Certificate2 eingebracht werden (oder umgekehrt), ggf. auch über den RSACryptoprovider.
Falls jemand sich mit dem Thema auskennt, wäre etwas Unterstützung sehr willkommen.
PS: Aufgrund der geringen Resonanz auf die englischsprachige Variante dieser Anfrage, hier das Ganze noch einmal in Deutsch. Sorry für den Doppelpost und für den vorhergehenden Post in Englisch.
|