2013-07-28 1 views
1

j'ai un message chiffré créé avec cette commande openssl:AES-256 Déchiffrement-CBC (salé) cryptogramme avec Javascript

openssl enc -aes-256-cbc -salt -in plaintext.txt -out cipher.enc 

J'ai essayé CryptoJS et this aes library pour le déchiffrer en suivant les exemples. Tout ce que je sors est du charabia. Ma réponse est que le décryptage échoue parce que je ne sais pas comment dire au décryptage javascript que le chiffrement est salé ou parce qu'il est en mode "cbc". CryptoJS semble plus flexible, donc cela pourrait très bien fonctionner. Mais quel type de paramètres dois-je nourrir?

Note: Ceci est en cours d'exécution dans un navigateur, pas Node.js

+0

Un chiffre ne prend pas un sel; l'argument '-salt' ne s'applique qu'à la dérivation de clé basée sur un mot de passe. Un chiffrement en mode CBC prend une clé et un vecteur d'initialisation. Vous devez passer les arguments '-K' et' -iv' à OpenSSL (ou bien, si vous voulez utiliser un chiffrement basé sur un mot de passe, l'argument '-pass', mais vous pourriez avoir du mal à trouver une implémentation JavaScript du fonction de dérivation de clé applicable). De toute façon, avant de continuer, s'il vous plaît lire ceci: http://www.matasano.com/articles/javascript-cryptography/ – ntoskrnl

+0

Lire [cette page] (http://www.matasano.com/articles/javascript- cryptography /) pour quelques conseils sur pourquoi crypto dans le navigateur JavaScript est une mauvaise idée. –

+1

En fait, le navigateur est dans mon application PhoneGap/Cordova dans ce cas. Donc au moins tous ces dangers ne devraient pas s'appliquer. – auramo

Répondre

1

je mets "Message" dans un fichier en utilisant:

echo -n "Message" > plaintext.txt 

J'ai ensuite utilisé votre exemple, et comme password mon mot de passe

openssl enc -aes-256-cbc -salt -in plaintextut cipher.enc 
enter aes-256-cbc encryption password: 
Verifying - enter aes-256-cbc encryption password: 

Alors je besoin de la version base64 de cipher.enc

cat cipher.enc | base64 
U2FsdGVkX1/oA4O+uXXBXAjAenRJwpUV4UqQp4aYCpk= 

Enfin, ce sont les CryptoJS qui ont fonctionné pour moi:

var dec = CryptoJS.AES.decrypt("U2FsdGVkX1/oA4O+uXXBXAjAenRJwpUV4UqQp4aYCpk=", "password"); 
var plaintext = CryptoJS.enc.Latin1.stringify(dec); 
+0

Merci! On dirait que je manque une étape de base64-ifying alors. J'ai lu le fichier chiffré de la boîte de dépôt, donc je vais devoir encoder le chiffrement en base64 en Javascript. Mais ça ne devrait pas poser de problème, je vais essayer ça plus tard aujourd'hui. – auramo

+0

Ran dans ce bug CryptoJS méchant: https://code.google.com/p/crypto-js/issues/detail?id=38&can=1&q=openssl%20base64 Les âges dépensés en me cognant la tête au mur. Accidentellement, le décodage Latin1 des données utf8 produit correctement les premiers mots (contrairement au décodage utf8 qui vient de s'écraser) et commence seulement à avoir l'air bizarre. En fin de compte, je devais supprimer les nouvelles lignes des données cryptées base64 avant de les décrypter et cela commençait à fonctionner. Ouf. – auramo

+0

Le cryptage a également fonctionné, a lutté pour les caractères scandinaves (ils se sont mal codés). Cette balise meta dans mon code HTML l'a corrigé: . A également dû diviser base64 cryptée à 64 lignes de caractères afin que openssl était capable de lire la sortie. – auramo

Questions connexes