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

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

新規登録して質問してみよう
ただいま回答率
85.48%
UTF-8

UTF-8は8ビット符号単位の文字符号化形式及び文字符号化スキームです。データ交換方式、ファイル形式としては、一般的にUTF-8が使われる傾向があります。

JavaScript

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

暗号化

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

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

Q&A

解決済

1回答

3226閲覧

暗号と復号の間に保存処理を挟むと、復号出来なくなる。CryptoJS

K.Shima

総合スコア13

UTF-8

UTF-8は8ビット符号単位の文字符号化形式及び文字符号化スキームです。データ交換方式、ファイル形式としては、一般的にUTF-8が使われる傾向があります。

JavaScript

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

暗号化

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

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

0グッド

2クリップ

投稿2020/03/29 05:54

編集2020/03/29 05:59

文字コードのエンコード・デコード処理がイマイチ理解できていないのが原因・・・。
デコード目的の一行 CryptoJS.enc.Utf8.stringify( tempText );
ここでの引数の形式に間違いが潜んでいるのでしょうか?
大変申し訳ございませんが、お教えください。

【目標】
①文字列を暗号化(名前や生年月日など)
②データベース(firebase)に保存(暗号化した文字列はキーやデータに使用)
③データベースから取得
④復号

【障害】
直接、暗号化→復号は可能(保存処理を介さなければ成功する)
①→④:成功

データベースへの保存・取得を介すると復号できず
①→②→③→④:失敗

【トライ】
firebaseのやり取りをsessionStorageに変更:☓
暗号・復号・エンコード・デコードの各処理後の文字列状況をモニタ
文字コードの判別

javascript

1 // 暗号化・複合テスト 2 textEncryptTest: function(){ 3 4 const Cipher = require('aes-ecb'); // npmでAES-ECB をインストール。使えるようにモジュール化 5 const CryptoJS = require("crypto-js"); // npmでcrypto-jsをインストール。使えるようにモジュール化 6 const TEXT_KEY = "********************************"; // 暗号化キー(AES-ECBの指定で16Byte) ※実際は文字列 7 const ENCODING = require('encoding-japanese'); 8 9 var tempText = "テスト1234XYZ"; 10 var resultEncoding = ENCODING.detect(tempText); 11 console.log('ソース:\n[' + tempText + ']\n<' + resultEncoding + '>'); 12 // ソース: 13 // [テスト1234XYZ] 14 // <UNICODE> 15 16 17 // 暗号化(ECBを使用。推奨はCBCだが、ECBにしないと毎回違う値になる。難読性程度で良いのでOKとする) 18 var tempText = Cipher.encrypt( TEXT_KEY, tempText ); 19 resultEncoding = ENCODING.detect(tempText); 20 console.log('AES_ECB_En:\n[' + tempText + ']\n<' + resultEncoding + '>'); 21 // AES_ECB_En: 22 // [JjZ6JnZrjWOBLCGiqAP3px0LyqEJfF4/6XsBCnVJr/0=] 23 // <ASCII> 24 25 // UTF8でエンコード(暗号文の記号をなくすため。記号があるとデータベースのキーに使用できない。→ UTF8でエンコード) 26 tempText = CryptoJS.enc.Utf8.parse( tempText ); 27 resultEncoding = ENCODING.detect(tempText); 28 console.log('UTF8_En:\n[' + tempText + ']\n<' + resultEncoding + '>'); 29 // UTF8_En: 30 // [4a6a5a364a6e5a726a574f424c434769714150337078304c7971454a6646342f36587342436e564a722f303d] 31 // <ASCII> 32 33/*------------------------------------------------------------------------------------------------ 34 // ストレージに保存 35 sessionStorage.setItem( 'textEncryptTest', tempText ); 36 37 // ストレージから読み出し 38 tempText = sessionStorage.getItem( 'textEncryptTest' ); 39 tempText = String( tempText ); 40 resultEncoding = ENCODING.detect(tempText); 41 console.log('sessionStorage:\n[' + tempText + ']\n<' + resultEncoding + '>'); 42 // sessionStorage: 43 // [4a6a5a364a6e5a726a574f424c434769714150337078304c7971454a6646342f36587342436e564a722f303d] 44 // <ASCII> 45 ------------------------------------------------------------------------------------------------*/ 46 47 // UTF8をデコード 48 tempText = CryptoJS.enc.Utf8.stringify( tempText ); 49 resultEncoding = ENCODING.detect(tempText); 50 console.log('UTF8_De_s:\n[' + tempText + ']\n<' + resultEncoding + '>'); 51 // UTF8_De_s: 52 // [JjZ6JnZrjWOBLCGiqAP3px0LyqEJfF4/6XsBCnVJr/0=] 53 // <ASCII> 54 55 // 復号 56 tempText = Cipher.decrypt(TEXT_KEY, tempText); 57 resultEncoding = ENCODING.detect(tempText); 58 tempText = tempText.trim(); 59 console.log('AES_ECB_De:\n[' + tempText + ']\n<' + resultEncoding + '>'); 60 // AES_ECB_De: 61 // [テスト1234XYZ] 62 // <UNICODE> 63 64 // 文字列最後に元ソース以外のコードが添付されていて、その長さが示されている。その分を削除する。 65 var lastCodeLength = Number( tempText.charCodeAt(tempText.length -1) * (-1) ); 66 tempText = tempText.slice(0, lastCodeLength); 67 resultEncoding = ENCODING.detect(tempText); 68 console.log('AES_ECB_De_Slice:\n[' + tempText + ']\n<' + resultEncoding + '>'); 69 // AES_ECB_De_Slice: 70 // [テスト1234XYZ] 71 // <UNICODE> 72 },

暗号文を、ストレージへの保存処理を挟むと復号できなくなる。

↓以下は保存処理〔有る・無し〕の挙動の違いです。


◆ストレージへの保存をしない場合(コメントアウトしたまま)のログ
ソース:
[テスト1234XYZ]
<UNICODE>

AES_ECB_En:
[JjZ6JnZrjWOBLCGiqAP3px0LyqEJfF4/6XsBCnVJr/0=]
<ASCII>

UTF8_En:
[4a6a5a364a6e5a726a574f424c434769714150337078304c7971454a6646342f36587342436e564a722f303d]
<ASCII>

UTF8_De_s:
[JjZ6JnZrjWOBLCGiqAP3px0LyqEJfF4/6XsBCnVJr/0=]
<ASCII>

AES_ECB_De:
[テスト1234XYZ]
<UNICODE>

AES_ECB_De_Slice:
[テスト1234XYZ]
<UNICODE>


◆ストレージへの保存をした場合のログ
ソース:
[テスト1234XYZ]
<UNICODE>

AES_ECB_En:
[JjZ6JnZrjWOBLCGiqAP3px0LyqEJfF4/6XsBCnVJr/0=]
<ASCII>

UTF8_En:
[4a6a5a364a6e5a726a574f424c434769714150337078304c7971454a6646342f36587342436e564a722f303d]
<ASCII>

sessionStorage:
[4a6a5a364a6e5a726a574f424c434769714150337078304c7971454a6646342f36587342436e564a722f303d]
<ASCII>

UTF8_De_s:
[]
<false>

AES_ECB_De:
[]
<false>

AES_ECB_De_Slice:
[]
<false>


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

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

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

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

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

guest

回答1

0

自己解決

自己解決しました!!(喜)

◆原因
UTF-8をデコードする際、
誤)ストレージから取得した文字列を使用
正)エンコードした際に作成した形式のオブジェクトが必要

◆修正
UTF-8でエンコード
できたオブジェクトをJSON.stringify()で文字列化
ストレージ保存
ストレージ取得
文字列をJSON.parse()でオブジェクト化
UTF-8をエンコード
成功!

これで次に進めます。
クリップされた方もいらっしゃるようです。
少しでも役に立てましたら、つまづいた甲斐があります・・・。(慰め)


◆ログ詳細
ソース:
[テスト1234XYZ]
<[object String] UNICODE> (10)

AES_ECB_En: //暗号化
[JjZ6JnZrjWOBLCGiqAP3px0LyqEJfF4/6XsBCnVJr/0=]
<[object String] ASCII> (44)

UTF8_En: //UTF-8にエンコード
[4a6a5a364a6e5a726a574f424c434769714150337078304c7971454a6646342f36587342436e564a722f303d]
<[object Object] ASCII> (undefined)

/********↓ エンコード後のobjectの詳細 ↓ ********/
key:[] type:[object] value:
[4a6a5a364a6e5a726a574f424c434769714150337078304c7971454a6646342f36587342436e564a722f303d]

key:[words] type:[object] value:
[1248483894,1248746098,1784106818,1279477609,1900105779,1886924876,2037466442,1715876911,911766338,1131304522,1915695165]

key:[0] type:[number] value:[1248483894]
key:[1] type:[number] value:[1248746098]
key:[2] type:[number] value:[1784106818]
key:[3] type:[number] value:[1279477609]
key:[4] type:[number] value:[1900105779]
key:[5] type:[number] value:[1886924876]
key:[6] type:[number] value:[2037466442]
key:[7] type:[number] value:[1715876911]
key:[8] type:[number] value:[911766338]
key:[9] type:[number] value:[1131304522]
key:[10] type:[number] value:[1915695165]
key:[sigBytes] type:[number] value:[44]
/********↑ エンコード後のobjectの詳細 ↑ ********/

★変更箇所★
このオブジェクトをJSON.stringify()で文字列化してからストレージに保存
JSON.stringify:
[{"words":[1248483894,1248746098,1784106818,1279477609,1900105779,1886924876,2037466442,1715876911,911766338,1131304522,1915695165],"sigBytes":44}]

//ストレージへ 保存
//ストレージから取得

★変更箇所★
ストレージから取得した文字列をJSON.parse()でオブジェクト化

UTF8_De_s: //UTF-8をデコード(★オブジェクト化したデータを使用することにより成功!!)
[JjZ6JnZrjWOBLCGiqAP3px0LyqEJfF4/6XsBCnVJr/0=]
<[object String] ASCII> (44)

AES_ECB_De: //復号
[テスト1234XYZ[DLE][DLE][DLE][DLE][DLE][DLE][DLE][DLE][DLE][DLE][DLE][DLE][DLE][DLE][DLE][DLE]]
<[object String] UNICODE> (26)

AES_ECB_De_Slice: //余計な制御文字を削除
[テスト1234XYZ]
<[object String] UNICODE> (10)

投稿2020/04/02 07:38

K.Shima

総合スコア13

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問