###実現したいこと
opensslコマンドによって作成したAESによる暗号文をJavaScriptで復号したいのですが、うまく行きません。
復号にはCryptJS v.3.1.2のaes.jsを使用しています。
secretとsaltから鍵とivを求める部分がopensslでの値と一致しないので、
その部分が問題だと思ってます。
javascriptでのバイナリの扱いが課題です。
###該当のソースコード
bash
1$ echo "rawdata" | openssl enc -e -aes-256-cbc -base64 -pass pass:password -p 2salt=420D3EFAD8B50CDA 3key=6DE400E56736822A64A0C714F15AD1917DB4EBE17A60305C37721488F03E7E40 4iv =F7D4A93D15A137F864866189F9D64DA1 5U2FsdGVkX19CDT762LUM2v9Er/lUtkGsle2RiY1nQdE=
html
1<html> 2<body> 3<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/rollups/aes.js"></script> 4<script src="./base64.js"></script> 5 6<script> 7var secret = "password"; // 事前に共有 8var encoded = "U2FsdGVkX19CDT762LUM2v9Er/lUtkGsle2RiY1nQdE="; 9var encrypted = Base64.decode(encoded); 10 11// 'Salted__'+'salt 8byte'+'encrypt data' 暗号文からsaltを分離 12var bin_salt = encrypted.slice(8, 15); 13var hex_salt = bin2hex(bin_salt); 14 15// secretとsaltからkey, iv生成 EVP_BytesToKey()もどき 16var hash1 = CryptoJS.MD5(secret + bin_salt); 17var hash2 = CryptoJS.MD5(hex2bin(hash1) + secret + bin_salt); 18var key = hash1 + hash2; 19var iv = CryptoJS.MD5(hex2bin(hash2) + secret + bin_salt); 20 21var options = {iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7}; 22var decrypted = CryptoJS.AES.decrypt(encrypted.slice(16), key, options); 23 24console.log("salt: "+ hex_salt); 25console.log("key: "+ key); 26console.log("iv : "+ iv); 27console.log("decrypted :"+ decrypted); 28 29 30function hex2bin(s) { 31 var ret = []; 32 var i = 0; 33 var l; 34 s += ''; 35 for (l = s.length; i < l; i += 2) { 36 var c = parseInt(s.substr(i, 1), 16); 37 var k = parseInt(s.substr(i + 1, 1), 16); 38 if (isNaN(c) || isNaN(k)) return false 39 ret.push((c << 4) | k); 40 } 41 return String.fromCharCode.apply(String, ret); 42} 43 44function bin2hex(s) { 45 var i; 46 var l; 47 var o = ''; 48 var n; 49 s += ''; 50 for (i = 0, l = s.length; i < l; i++) { 51 n = s.charCodeAt(i) 52 .toString(16) 53 o += n.length < 2 ? '0' + n : n; 54 } 55 return o; 56} 57 58</script> 59<body> 60</html> 61 62---実行結果--- 63salt: 420d3efa6350cda 64key: 8fda44f8e971f5d562256fb35fdb16bcacb16102974370d6077a926bd2cdb1b8 65iv : b61f1e1d76162994ef9e4951803560fa 66decrypted :
###試したこと
EVP_BytesToKey()もどきにおける鍵は以下でも同じものが生成できます。
javascript
1CryptoJS.kdf.OpenSSL.execute(secret, 8, 4, bin_salt).key);
###補足情報
Base64は https://github.com/dankogai/js-base64/blob/master/base64.js
hex2binは http://locutus.io/php/hex2bin/
から拝借してます。
最終的にはChrome拡張で使いたいと思っているので、jsで可能ならCryptJS以外の解決策でもお尋ねしたいです。
あなたの回答
tips
プレビュー