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

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

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

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

JavaScript

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

Q&A

解決済

1回答

9256閲覧

Javascript で AES -> Base64 暗号を復号できるライブラリあったら教えてください

kimurayu

総合スコア158

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

JavaScript

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

0グッド

0クリップ

投稿2017/09/30 08:57

編集2017/10/02 02:26

流れは、

Javascript から サーバに パスワード付きで GET -> Ruby でパスワードを使ってAES暗号化->Base64エンコード文字列生成
-> Javascript で受け取る -> AES復号化処理をする

です。
CryptoJS
des.js
を使おうと試みましたが、うまくできません。
他の方法があれば教えてください。

ruby-onetimekeyをjavascriptから受け取って暗号化

ruby

1salt = “\x00\x01\x02\x03\x04\x05\x06\x07” 2 enc = OpenSSL::Cipher.new(AES-128-CBC) 3 enc.encrypt 4 enc.key = OpenSSL::PKCS5.pbkdf2_hmac_sha1(onetimekey, salt, 65536, 128) 5 iv = enc.random_iv 6 a = enc.update(text) 7 b = enc.final 8require “base64" 9 return Base64.encode64 iv + a + b

Javascript

1var password = '6t70g5h624ero4b6ama7958829ck4f1l'; 2var xhr = new XMLHttpRequest(); 3xhr.onreadyStateChange = function() { 4 if(xhr.readyState === 4 && xhr.status === 200) { 5 var enctyptedData = xhr.response; 6 var decryptedData = 復号化する関数(password, enctyptedData); 7 } 8}; 9xmlHttpRequest.open('GET', 'http://hogehoge?' + password); 10 11

CryptJS では、

javascript

1decrypted = CryptoJS.AES.decrypt(xhr.response, password);

とやりましたが結果は

javascript

1init {words: Array(4), sigBytes: -226} 2sigBytes:-226 3words:(4) [-1167195665, -2012345878, -547270904, -1822799947] 4__proto__:Object

こういうものになりました。

得たい結果はjson文字列です

javascript

1string = decrypted.toString(CryptoJS.enc.Utf8);

を実行すると

javascript

1Uncaught Error: Malformed Utf8-data

とエラーとなります。
core.js - Utf8.stringifyの

javascript

1crypto-js/core.js 2 3 /** 4 * UTF-8 encoding strategy. 5 */ 6 var Utf8 = C_enc.Utf8 = { 7 /** 8 * Converts a word array to a UTF-8 string. 9 * 10 * @param {WordArray} wordArray The word array. 11 * 12 * @return {string} The UTF-8 string. 13 * 14 * @static 15 * 16 * @example 17 * 18 * var utf8String = CryptoJS.enc.Utf8.stringify(wordArray); 19 */ 20 stringify: function (wordArray) { 21 try { 22 return decodeURIComponent(escape(Latin1.stringify(wordArray))); 23 } catch (e) { 24 throw new Error('Malformed UTF-8 data'); 25 } 26 },

javascript

1decodeURIComponent(escape(Latin1.stringify(wordArray))

が試行エラーです

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

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

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

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

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

mit0223

2017/10/01 01:42

CryptoJSでどううまくできなかったのでしょうか?試みたソースコードとどううまく行かなかったを記載してもらえますか
kimurayu

2017/10/01 02:16

記載します。
mit0223

2017/10/01 08:17

エラーにならなかったのであれば復号化に成功しているのではないかと思いますが、結果というのはどこに出力されたものでしょうか?
kimurayu

2017/10/01 13:21 編集

結果はCryptoJS.AES.decrypt の結果をコンソールに出力しました。 init {words: Array(4), sigBytes: -113} 結果はjson文字列を取りたいのですがこのinitというオブジェクトが取れます。
guest

回答1

0

ベストアンサー

得たい結果はjson文字列です

CryptoJSを使ったクライアントとサーバー間の暗号化と復号化によると、

javascript

1console.log(decrypted.toString(CryptoJS.enc.Utf8));

とすれば、復号化された文字列が見えるのではないでしょうか?
すみません、未検証です。


コメントに記載しておりましたが、回答に転記しておきます。

ruby のコードを見ましたが、Salt を暗号化と復号化のコード間で共有できていないので、無理ではないでしょうか?一般的に Password Based Encryption (PBEと略)をSalt 付きで使用する場合、Salt は暗号化側で乱数生成し、その値を暗号化データと一緒に送るのが普通です。PBEでは、Salt は Password にふりかけた後、ハッシュされ、これを暗号化鍵として使用します。毎回違う鍵で暗号化されるところがみそです。

たとえば、 openssl コマンドと互換にするのであれば、 "Salted__"というプリフィックスをつけて、 Salt 、暗号化データの順で文字列結合します。
参考:openssl の暗号化と同等のrubyでの処理

CryptoJS 側もデフォルトは openssl 互換フォーマットのようですので、この後の進め方として、

  1. ruby 側を上記参考サイトに従って、 openssl コマンド互換にする
  2. openssl コマンドで復号化できることを確認する。
  3. それを Javascript に送って復号化する。

とされてはいかがでしょうか。

投稿2017/10/02 00:05

編集2017/10/03 03:02
mit0223

総合スコア3401

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

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

kimurayu

2017/10/02 01:01 編集

それをやると Uncaught Error: Malformed UTF8-data となるのです Malformedというのが 不正な形式 という意味です 記載しておきます
mit0223

2017/10/03 01:02

ruby のコードを見ましたが、Salt を暗号化と復号化のコード間で共有できていないので、無理ではないでしょうか?一般的に Passwrod Based Encryption をSalt 付きで使用する場合、Salt は暗号化側で乱数生成し、その値を暗号化データと一緒に送るのが普通です。
kimurayu

2017/10/03 02:54

ありがとうございます。そのあたりがよく分かっていませんでしたので、よく調べます。
kimurayu

2017/10/03 06:15

openssl コマンド互換 の方法でやってみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問