1

秘密鍵が秘密である限り、安全な機密性を確保します。復号化すると、アプリで次のエラーが発生します。javax.crypto.BadPaddingException:指定された最後のブロックが適切にパディングされていません

コード:

// Encryption, client side
byte[] plainData = "hello plaintext!".getBytes("UTF-8");
byte[] salt = new byte[64];
new SecureRandom().nextBytes(salt);
KeySpec spec = new javax.crypto.spec.PBEKeySpec("password".toCharArray(), salt, 1024,   256);
SecretKey sk = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1").generateSecret(spec);
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(sk.getEncoded(), "AES"));
byte[] iv = cipher.getParameters().getParameterSpec(IvParameterSpec.class).getIV();
byte[] ciphertext = cipher.doFinal(plainData);
System.out.println("ciphertext: "+new String(ciphertext, "UTF-8")); // cipher

// Decryption, server side
KeySpec spec2 = new javax.crypto.spec.PBEKeySpec("password".toCharArray(), salt, 1024, 256);
SecretKey sk2 = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1").generateSecret(spec2);
Cipher cipher2 = Cipher.getInstance("AES/CBC/PKCS5Padding");

cipher2.init(Cipher.DECRYPT_MODE, new SecretKeySpec(sk2.getEncoded(), "AES"), new IvParameterSpec(iv)); // Get the same IV value from client/encryptor aswell, still random
String plaintext = new String(cipher2.doFinal(ciphertext), "UTF-8");
System.out.println("decrypted plaintext: "+plaintext); // plain

問題を引き起こしているのは塩のランダム性ですか?

クライアント側でオブジェクト参照を使用すると正常に復号化できますが、サーバー上に独自のインスタンスが必要です。

エラーを修正していただき、ありがとうございます。

*編集:*コードが更新および修正されました

4

1 に答える 1

4

コードをすばやく確認するだけで、クライアント側とサーバー側で異なるソルトを作成していることがわかります。サーバー側がそのソルトとキーを復号化できるようにするには、同じである必要があります。

今、私はJava開発者ではありませんが、他のすべてのコードは問題ないように見えますが、前述のように、両端で異なるソルトを作成している場合、復号化は機能しません。

于 2011-11-30T01:44:56.463 に答える