質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

暗号化

ネットワークを通じてデジタルデータをやり取りする際に、第三者に解読されることのないよう、アルゴリズムを用いてデータを変換すること。

Q&A

0回答

5203閲覧

JavaScriptでopensslによるAES暗号文を復号

Yukizakura

総合スコア7

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

暗号化

ネットワークを通じてデジタルデータをやり取りする際に、第三者に解読されることのないよう、アルゴリズムを用いてデータを変換すること。

0グッド

0クリップ

投稿2017/04/14 08:38

###実現したいこと
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以外の解決策でもお尋ねしたいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問