我在解密字符串时遇到一些麻烦。我收到的错误是:
“ javax.crypto.IllegalBlockSizeException:使用填充密码解密时,输入长度必须为16的倍数”
这就是我要实现的目标。
-用户在创建帐户时设置密码。在这种情况下,泰勒。
-此密码管理器类将将此字符串转换为乱码(这就是它产生的:“ I ^ ÇÔµoü |&ÄŠóÁ”)。
-然后将这个乱码存储在文本文件中。
-从那里,当输入密码Taylor时,此存储的乱码被解密,然后与输入的字符串进行比较。如果正确,则用户可以访问该应用程序。
感谢您的帮助。
作为旁注,我不确定是否已正确初始化密钥: 这也是我第一次玩加密。我不确定它是真的很酷还是令人沮丧。
public static void Decrypt(String encryptedText) {
try
{
//we are using the same key to decrypt the string as we used to encrypt it.
String key = "AbCd1234aBcD4321";
// Here we are taking the 128 bit key we just created and expanding it
Key aesKey = new SecretKeySpec(key.getBytes(), "AES");
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.DECRYPT_MODE, aesKey);
//decrypt the text
byte[] encrypted = cipher.doFinal(encryptedText.getBytes());
String decrypted = new String(cipher.doFinal(encrypted));
System.out.println(decrypted);
}
catch(Exception e)
{
e.printStackTrace();
}
答案 0 :(得分:0)
您的问题是这一行:
byte[] encrypted = cipher.doFinal(encryptedText.getBytes());
您不能将任意二进制信息转换为字符串,并且期望它能正确转换回字符串。那样根本行不通。
UTF-8是与MP3文件相同的结构化二进制数据。并非每个字节序列都能产生有效的MP3文件,并非每个字节序列都能产生有效的UTF-8字符串。
根据定义,加密数据是二进制数据。您应该这样存储它。