【发布时间】:2013-02-07 12:01:02
【问题描述】:
按照本教程http://www.java2s.com/Code/Android/Security/AESEncryption.htm,我已经用java编写了我的程序 但是我遇到了一个异常,即“javax.crypto.IllegalBlockSizeException:使用填充密码解密时输入长度必须是 16 的倍数”
谁能帮帮我?
public class utils {
public static String encrypt(String message,String secretPhrase){
try{
MessageDigest mdig=MessageDigest.getInstance("MD5");
byte[] digestedBytes=mdig.digest(secretPhrase.getBytes("UTF-8"));
SecretKeySpec keySpec=new SecretKeySpec(digestedBytes,"AES");
Cipher cipher=Cipher.getInstance("AES/ECB/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, keySpec);
byte[] encryptedBytes=cipher.doFinal(message.getBytes("UTF-8"));
return new String(encryptedBytes,"UTF-8");
}catch(Exception exc){
return null;
}
}
public static String decrypt(String message,String secretPhrase){
try{
MessageDigest mdig=MessageDigest.getInstance("MD5");
byte[] digestedBytes=mdig.digest(secretPhrase.getBytes("UTF-8"));
SecretKeySpec keySpec=new SecretKeySpec(digestedBytes,"AES");
Cipher cipher=Cipher.getInstance("AES/ECB/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, keySpec);
byte[] encryptedBytes=cipher.doFinal(message.getBytes("UTF-8"));
return new String(encryptedBytes,"UTF-8");
}catch(Exception exc){
return null;
}
}
}
【问题讨论】:
-
对于初学者,您不能将加密字节解码为 UTF-8。它们只是随机字节,而不是 UTF-8。 encrypt 方法应该返回一个字节数组。
-
但是我怎样才能从加密方法中得到一个我可以在未来解密的字符串......?
-
你真的需要一个字符串吗?如果将其保存在文件中,则可以直接将字节写入文件。如果将其保存在数据库中,则可以使用存储字节数组的 BLOB 类型的列。以此类推。
-
实际上我是为密码字段执行此操作的,因此“BLOB”不是合适的类型
-
好吧,让我们忽略这对密码有多不安全...... BLOB 是 适合存储字节数组的类型。加密的结果是一个字节数组。即使你把它变成base64或base16,你也只需要做额外的解码。
标签: java jsp jakarta-ee security