Расшифровка Java
У меня проблема с
javax.crypto.Cipher
Когда я пишу эти строки кода
Cipher cipher;
byte[] bytes = null;
try
{
cipher = Cipher.getInstance("AES");
cipher.init(Cipher.DECRYPT_MODE, generateAESKey128b(key));
bytes = cipher.doFinal(input.getBytes("UTF-8"));
}
catch (NoSuchAlgorithmException e)
{
e.printStackTrace();
}
catch (NoSuchPaddingException e)
{
e.printStackTrace();
}
catch (InvalidKeyException e)
{
e.printStackTrace();
}
catch (UnsupportedEncodingException e)
{
e.printStackTrace();
}
catch (IllegalBlockSizeException e)
{
e.printStackTrace();
}
catch (BadPaddingException e)
{
e.printStackTrace();
}
Консоль выдает мне эту ошибку
javax.crypto.IllegalBlockSizeException
Input length must be multiple of 16 when
decrypting with padded cipher
at com.sun.crypto.provider.SunJCE_f.b(DashoA13*..)
at com.sun.crypto.provider.SunJCE_f.b(DashoA13*..)
at com.sun.crypto.provider.AESCipher.engineDoFinal(DashoA13*..)
at javax.crypto.Cipher.doFinal(DashoA13*..)
at it.unitn.se.gym.backend.utils.Security.AES128Decode(Security.java:109)
at it.unitn.se.gym.backend.utils.Security.decode_AES128_Base64(Security.java:96)
at it.unitn.se.gym.backend.WebService.main(WebService.java:42)
Exception in thread "main" java.lang.NullPointerException
at it.unitn.se.gym.backend.utils.Security.decode_AES128_Base64(Security.java:97)
at it.unitn.se.gym.backend.WebService.main(WebService.java:42)
Первые 2 строки кода верны, но когда я передаю атрибут "text" типа byte[] функции doFinal, он выдает ошибку.
Может кто-нибудь сказать мне, почему?
РЕШИТЬ:
Хорошо, проблема решена
byte[] encrypted = UniversalBase64Encoder.decode(input);
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.DECRYPT_MODE, generateAESKey128b(key));
byte[] originalBytes = cipher.doFinal(encrypted);
Это правильный код, который я написал
1 ответ
Проблема в том, что вы пытаетесь расшифровать строку, которая не была зашифрована, и при этом нарушаете предположение алгоритма дешифрования (его входной размер всегда кратен 16).
Вот блок кода, который шифрует, а затем дешифрует строку. Обратите внимание, что при печати зашифрованной строки длина ее составляет 16 байт, хотя входной строки нет. Алгоритм шифрования дополняет входную строку, чтобы сделать ее кратной 16 байтам перед ее шифрованием. Эта зашифрованная строка длиной 16 байтов теперь является допустимым вводом для расшифровки.
Это предположение (что результат шифрования будет четным размером) является вполне стандартным. Это не только облегчает написание алгоритма дешифрования / шифрования, но также не позволяет злоумышленнику узнать длину того, что вы зашифровали.
byte[] keyBytes = new byte[16];
keyBytes[0] = 1;
SecretKeySpec key = new SecretKeySpec(keyBytes, "AES");
String input = "hello";
Cipher cipher;
byte[] bytes = null;
cipher = Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE, key);
bytes = cipher.doFinal(input.getBytes("UTF-8"));
System.out.println("Encoded: "+Arrays.toString(bytes));
cipher.init(Cipher.DECRYPT_MODE, key);
byte[] decoded = cipher.doFinal(bytes);
System.out.println("Decoded: "+new String(decoded, "UTF-8"));