У меня есть два метода Java, один для шифрования еще один для дешифрования. Я хотел бы зашифровать/расшифровать пароль с помощью основного пароля. Но когда я пытаюсь расшифровать зашифрованный пароль, меня вызвано: javax.crypto.illegalblocksizexexception: длина ввода должна быть кратной из 16 при расшифровке с мягким шифром . Я не могу понять, почему я понял. Я мог бы представить, что это какое -то отношение к обращению строки/байта, но я не уверен. Как это исправить? < /P>
код: < /p>
У меня есть два метода Java, один для шифрования еще один для дешифрования. Я хотел бы зашифровать/расшифровать пароль с помощью основного пароля. Но когда я пытаюсь расшифровать зашифрованный пароль, меня вызвано: javax.crypto.illegalblocksizexexception: длина ввода должна быть кратной из 16 при расшифровке с мягким шифром . Я не могу понять, почему я понял. Я мог бы представить, что это какое -то отношение к обращению строки/байта, но я не уверен. Как это исправить? < /P> код: < /p> [code]import javax.crypto.*; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.PBEKeySpec; import javax.crypto.spec.SecretKeySpec; import java.nio.charset.StandardCharsets; import java.security.InvalidAlgorithmParameterException; import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; import java.security.spec.InvalidKeySpecException; import java.security.spec.KeySpec;
public class AESEncryption implements EncryptionModuleInterface { private static final int ITERATION_COUNT = 1000000; private static final int KEY_LENGTH = 256; private static final String PBKDF_ALGORITHM = "PBKDF2WithHmacSHA1"; private static final String TRANSFORMATION = "AES/CBC/PKCS5Padding"; private static final String ALGORITHM = "AES";
@Override public String encryptPassword(String password, String masterpassword) { byte[] finalCiphertext;
SecureRandom random = new SecureRandom(); byte[] salt = new byte[16]; random.nextBytes(salt);
KeySpec spec = new PBEKeySpec(password.toCharArray(), salt, ITERATION_COUNT, KEY_LENGTH);
return new String(finalCiphertext, StandardCharsets.UTF_8); }
@Override public String decryptPassword(String password, String masterpassword) { byte[] ivBytes = new byte[16]; byte[] salt = new byte[16]; byte[] encValue;
return new String(encValue, StandardCharsets.UTF_8); } } < /code> Изменить: Я могу преобразовать двоичный байтовый массив в шестнадцатеричную строку: < /p> StringBuilder result = new StringBuilder(); for (byte b : finalCiphertext){ result.append(String.format("%02X", b)); }
return result.toString(); < /code> Но у меня есть проблемы, чтобы преобразовать шестнадцатеричную строку обратно в двоичный байтовый массив. < /p> StringBuilder stringBuilder = new StringBuilder(); HashMap hashMap = new HashMap(); hashMap.put('0', "0000"); hashMap.put('1', "0001"); hashMap.put('2', "0010"); hashMap.put('3', "0011"); hashMap.put('4', "0100"); hashMap.put('5', "0101"); hashMap.put('6', "0110"); hashMap.put('7', "0111"); hashMap.put('8', "1000"); hashMap.put('9', "1001"); hashMap.put('A', "1010"); hashMap.put('B', "1011"); hashMap.put('C', "1100"); hashMap.put('D', "1101"); hashMap.put('E', "1110"); hashMap.put('F', "1111");
for (int i = 0; i < password.length(); i++) { stringBuilder.append(hashMap.get(password.charAt(i))); }
String binaryString = stringBuilder.toString(); byte[] readEncryptedBytesWithIvAndSaltPrefix = binaryString.getBytes(); System.out.println(Arrays.toString(readEncryptedBytesWithIvAndSaltPrefix)); < /code> Последний оператор печати возвращает массив с 48 и 49 чисел. Учитывая окончательный блок, не подготовлен должным образом. Такие проблемы могут возникнуть, если во время расшифровки используется плохой ключ. [/code]