2017-08-08 1 views
0

Je cherche à mettre en place un script PowerShell pour déchiffrer les secrets qui ont été chiffrés avec le certificat de clé publique dans un environnement Linux en utilisant OpenSSL.Utilisation de certificats x509 pour déchiffrer le texte avec PowerShell qui a été chiffré avec OpenSSL

Le certificat avec la clé privée à utiliser dans le décryptage est sur le magasin de certificats de l'ordinateur local de Windows.

Jusqu'à présent, j'ai tenté d'utiliser [Security.Cryptography.RSACryptoServiceProvider].PrivateKey.Decrypt pour déchiffrer les octets du fichier crypté mais j'obtiens une erreur avec le rembourrage

$mycert.PrivateKey.Decrypt($bytes, $true) 
Exception calling "Decrypt" with "2" argument(s): "Error occurred while decoding OAEP padding." 
At line:1 char:1 
+ $mycert.PrivateKey.Decrypt($bytes, $true) 
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo   : NotSpecified: (:) [], MethodInvocationException 
    + FullyQualifiedErrorId : CryptographicException 

Puis-je avoir quelques conseils sur la façon de résoudre cette exception cryptographique?

Le fichier contenant le cryptogramme a été généré en utilisant l'exemple de commande openssl suivante dans Linux:

echo " Secret Text" | openssl rsautl -encrypt -inkey publickey.pem -pubin > secret.enc 

Il peut être déchiffré bien avec OpenSSL, mais nous obtenons toujours la même erreur lorsque vous essayez PowerShell.

+0

Essayez-vous de décrypter le fichier avec la clé publique ou privée? Basé sur l'erreur, il semble que vous utilisez le public, vous devez utiliser la clé privée. – Persistent13

+0

@ Persistent13, le texte en clair est crypté avec la clé publique tandis que le cryptogramme est déchiffré avec la clé privée. –

Répondre

0

openssl rsautl, sans le drapeau -oaep, est-padding PKCSv1_1.5, ce qui correspond à une valeur de false dans la méthode Decrypt que vous appelez.

Tangentally: Si vous avez accès à l'API .NET 4.6 dans votre champ d'powershell vous seriez mieux servis en changeant de coulée cert.PrivateKey à RSACryptoServiceProvider d'appeler cert.GetRSAPrivateKey() et en utilisant la plus récente RSA.Decrypt(data, RSAEncryptionPadding.Pkcs1). Il y a des certificats/clés pour lesquels l'ancienne méthode ne fonctionne pas, et la nouvelle méthode fonctionne.

+0

@bartonsjs. Je vous remercie. J'ai essayé l'argument $ false sur la méthode Decrypt avant de rencontrer votre réponse et cela l'a fait. Je vais modifier le code pour essayer l'API plus récente RSACryptoServiceProvider. Je ne pense pas que nous ayons accès à .NET 4.6 dans l'environnement que nous utilisons, jusqu'à 4.5.2 seulement. –

0

$ mycert.PrivateKey.Decrypt (bytes $, $ false) fonctionne quand il n'y a pas de remplissage spécifié dans la commande de chiffrement avec OpenSSL.