Java-шифрование клиентом и дешифрование сервером с использованием PBKDF2WithHmacSHA1 и AES / CBC / PKCS5Padding - PullRequest
1 голос
/ 30 ноября 2011

Я собираюсь обеспечить безопасную конфиденциальность, пока закрытый ключ остается секретным, и я получаю следующую ошибку в своем приложении при расшифровке: 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

Это случайность соли, которая вызывает проблему?

Я могу прекрасно расшифровать ее, когда использую ссылки на объекты на стороне клиента, но мне нужна моя собственнаяэкземпляры на сервере.

Большое спасибо заранее за исправление моих ошибок!

* РЕДАКТИРОВАНИЕ: * Код обновлен и исправлен

1 Ответ

4 голосов
/ 30 ноября 2011

Просто из быстрого просмотра вашего кода я вижу, что вы создаете различную соль на стороне клиента и сервера. Чтобы серверная сторона могла расшифровать эту соль и ключ должны быть одинаковыми.

Теперь я не Java-разработчик, но весь другой код для меня выглядит нормально, но, как я уже сказал, если вы создаете разные соли на каждом конце, дешифрование не будет работать.

...