1

CryptoJS を使用して暗号化された Java のテキストを復号化しようとしています。他の投稿で、異なるデフォルトモードとパディングを使用していることを読んだので、両方(java/cryptojs)を両方ともaes/cbc/nopaddingを使用するように設定しました。Java で例外が発生しなくなりましたが、復号化中に文字化けした出力が得られます

暗号化 (JS):

var parsedLogin = JSON.parse(login);
var publicKey = "abcdefghijklmnio";
var publiciv =  "abcdefghijklmnio";
var key = CryptoJS.enc.Hex.parse(publicKey);
var iv = CryptoJS.enc.Hex.parse(publiciv);
var encrypted = CryptoJS.AES.encrypt(parsedLogin.password, publicKey, {iv: publiciv}, { padding: CryptoJS.pad.NoPadding, mode: CryptoJS.mode.CBC});

// send encrypted to POST request 

復号化 (Java)

String PUBLIC_KEY = "abcdefghijklmnio";
String PUBLIC_IV = "abcdefghijklmnio";
byte[] byteArr = PUBLIC_KEY.getBytes();
Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");
final SecretKeySpec secretKey = new SecretKeySpec(byteArr, "AES");
cipher.init(Cipher.DECRYPT_MODE, secretKey, new IvParameterSpec(PUBLIC_IV.getBytes()));

byte[] parsed = Base64.decodeBase64(encrypted.getBytes());
//byte[] parsed = DatatypeConverter.parseBase64Binary(encrypted); 

byte[] fin = cipher.doFinal(parsed);
String decryptedString = new String(fin);

私が得ている結果は次のようなものです: вÛ!aå{'`@"Ûîñ?Œr˜krÆ

私はすでに getBytes() の CHARSET を US-ASCII、UTF-8、および UTF-16 に変更しようとしましたが、これは文字化けしたテキストを変更するだけです

他のブロッキング モードとパディングも使用してみましたが、js レベルで失敗しました。今すぐ簡単な暗号化方法が必要です。

注: セキュリティの問題は無視してください...キーが js で公開されているなどです。後で処理します..

4

1 に答える 1

1

パスワードが常に 16 バイトでない限り、パディングなしで AES CBC を使用できないはずです。おそらく、良いアイデアである場合とそうでない場合がある、ある種のデフォルトのパディングが適用されます。

とにかく: キーと iv を WordArray として CryptoJS に渡す必要があります。文字列を指定すると、パスフレーズを指定していると見なされ、それとは異なるキーが導出されます。そのため、Java 復号化コードは別のキーと iv のペアを使用します。を使用して、文字列から WordArray を作成できます。

var key = CryptoJS.enc.Utf8.parse("abcdefghijklmnio")
var iv = ...
于 2014-03-04T13:30:00.303 に答える