Я получаю следующее сообщение об ошибке при попытке расшифровано:Как правильно расшифровать javax.crypto зашифрована строка
javax.crypto.IllegalBlockSizeException: Длина входной должна быть кратна 16 при расшифровке с мягким шифром
Вот класс шифрования я реализовал:
import java.io.UnsupportedEncodingException;
import java.security.InvalidKeyException;
import java.security.Key;
import java.security.NoSuchAlgorithmException;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.spec.SecretKeySpec;
public class StringEncrypter {
public static String encrypt(String key, String string, String algorithm) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException, UnsupportedEncodingException {
Key aesKey = new SecretKeySpec(key.getBytes("UTF-8"), algorithm);
Cipher cipher = Cipher.getInstance(algorithm);
cipher.init(Cipher.ENCRYPT_MODE, aesKey);
byte[] encrypted = cipher.doFinal(string.getBytes());
return encrypted.toString();
}
public static String decrypt(String key, String encryptedString, String algorithm) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException, UnsupportedEncodingException {
Key aesKey = new SecretKeySpec(key.getBytes("UTF-8"), algorithm);
Cipher cipher = Cipher.getInstance(algorithm);
cipher.init(Cipher.DECRYPT_MODE, aesKey);
String decrypted = new String(cipher.doFinal(encryptedString.getBytes()));
return decrypted;
}
}
Это, как я зашифрован строка:
StringEncrypter.encrypt("0306868080306868", "ddd", "AES"); // [[email protected]
При попытке расшифровать зашифрованную строку выше следующим образом:
String decrypted = StringEncrypter.decrypt("0306868080306868", "[[email protected]", "AES");
Я получаю illegalBlockSizeException
.
Что я делаю неправильно выше? Как правильно дешифровать зашифрованную строку?
Обратите внимание, что вы, кажется, использует ECB шифрование, которое не является безопасным. Вы, по крайней мере, пропустили (случайно) IV в своем коде. –
Возможный дубликат [Java: Синтаксис и значение позади "\ [B @ 1ef9157"? Двоичный/Адрес?] (Http://stackoverflow.com/questions/1040868/java-syntax-and-meaning-behind-b1ef9157-binary-address) –
@ArtjomB. Он объясняет, как генерируется вывод, но заменяя его на 'new String (byte [])', например. не решить проблему. –