【问题标题】:IllegalBlockSizeException need to resolveIllegalBlockSizeException 需要解决
【发布时间】: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


【解决方案1】:

试试这个,

public String encrypt(String str) {
    try {
        // Encode the string into bytes using utf-8
        byte[] utf8 = str.getBytes("UTF8");

        // Encrypt
        byte[] enc = ecipher.doFinal(utf8);

        // Encode bytes to base64 to get a string
        return new sun.misc.BASE64Encoder().encode(enc);
    }  catch (Exception e) {
    }
    return null;
}

public String decrypt(String str) {
    try {
        // Decode base64 to get bytes
        byte[] dec = new sun.misc.BASE64Decoder().decodeBuffer(str);

        // Decrypt
        byte[] utf8 = dcipher.doFinal(dec);

        // Decode using utf-8
        return new String(utf8, "UTF8");
    }  catch (Exception e) {
    }
    return null;
}

使用示例

try {
    // Generate a temporary key. In practice, you would save this key.
    // See also Encrypting with DES Using a Pass Phrase.
    SecretKey key = KeyGenerator.getInstance("DES").generateKey();

    // Create encrypter/decrypter class
    DesEncrypter encrypter = new DesEncrypter(key);

    // Encrypt
    String encrypted = encrypter.encrypt("Don't tell anybody!");

    // Decrypt
    String decrypted = encrypter.decrypt(encrypted);
} catch (Exception e) {
}

【讨论】:

  • 并非所有 JRE 都有 sun.misc,但有替代方案。
猜你喜欢
  • 2023-03-06
  • 1970-01-01
  • 2017-09-25
  • 1970-01-01
  • 1970-01-01
  • 2016-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多