2017-12-15 7 views
-2

以下に示すようにJSONをJavaScriptで暗号化しようとしましたが、暗号化されています。 "obj"はJSONのデータですが、なぜ "ency_key"なのかわからないので、私はgoogleのどこかでこれを辿り、そのようなStringを渡しました。javax.crypto.BadPaddingException:最終ブロックが適切に埋められていないと仮定します。例外

var obj1 = CryptoJS.AES.encrypt(obj,'ency_key').toString(); 
$.ajax({ 
    url: "web/enyDcyData", 
    "type": "POST", 
    async:true, 
    data:{ 
     json:obj1, 
    } 

しかし、私はjavaでデータを復号化できませんでした。私は以下のようにJavaで試しました。最終的なブロックが正しくパディングされていない場合例外:例外:"doFinal(base64Decode(ency_data));" 私は間違いを犯しました。この問題を解決するのを手伝ってください。

public static String decrypt(String ency_data) 
     SecretKeyFactory keyFac = SecretKeyFactory.getInstance(one); 
     SecretKey seckey = keyFac.generateSecret(new PBEKeySpec(two)); 
     Cipher cipher = Cipher.getInstance(one); 
     pbeCipher.init(Cipher.DECRYPT_MODE, seckey , new PBEParameterSpec(SALT, 20)); 
     byte[] res = cipher.doFinal(base64Decode(ency_data)); 
     String decryptedValue = new String(res,"UTF-8"); 
    } 

     private static byte[] base64Decode(String ency_data) throws IOException { 
      return new BASE64Decoder().decodeBuffer(ency_data); 
     } 
+1

_「Javaではさまざまな方法を試しましたが、別のエラーが発生しています」_それでは(少なくとも1つは) – Andreas

+0

あなたのコメントから、JavaScript側でどのようなキーが使用されているか分かりませんしたがって、Java側の 'keyFac.generateSecret()'から同じキーを取得しているかどうかをチェックすることさえできません。私は、暗号に関する質問をするための基本的な前提条件は、JavaScript側で暗号化に使用している鍵が、Java側で復号化に使用しているのと同じ鍵であることを検証できることです。あなたの出力は、(他の多くのエラーと同様に)異なるキーを使用することと一貫しています...あなたがそれを排除できなければ、私たちは本当にあなたを助けることができません。 「1つ」でもAESを選択できますか? – lockcmpxchg8b

答えて

1

使用しているキーの導出機能が異なります。 CryptoJS(バージョン3)はOpenSSL互換のキー導出関数を使用していますが、PBKDF1を使用している間は(または、おそらく2、アルゴリズムは含まれません)。 EVP_BytesToKeyの実装を探す必要があります。 here。もちろん、OpenSSL互換レイヤー全体を探すこともできます。

キーまたはデータが異なる場合は、CBC/ECBモードのパディングエラーが予想されます。データサイズがブロックサイズの倍数である場合(およびキー/アルゴリズムがインスタンス化/初期化中に受け入れられた場合)にスローできる唯一のエラーです。

関連する問題