java - sun.misc.BASE64 到 apache commons

标签 java base64 aes apache-commons

我这里有一个简单的代码,该代码使用sun.misc.BASE64Encoder和sun.misc.BASE64Decoder,它们在Eclipse Java 7.0中不可用,我想让代码使用Apache commons base 64并且仍然做同样的事情,

变量

private static final String ALGORITHM = "AES";
private static final byte[] keyValue = "2H5a1r5i6s3h8C1h".getBytes();

原始代码

public static String AESencrypt(String valueToEnc) throws Exception {
    Key key = new SecretKeySpec(keyValue, ALGORITHM);
    Cipher c = Cipher.getInstance(ALGORITHM);
    c.init(Cipher.ENCRYPT_MODE, key);
    byte[] encValue = c.doFinal(valueToEnc.getBytes());
    String encryptedValue = new BASE64Encoder().encode(encValue);
    return encryptedValue;
}

public static String AESdecrypt(String encryptedValue) throws Exception {
    Key key = new SecretKeySpec(keyValue, ALGORITHM);
    Cipher c = Cipher.getInstance(ALGORITHM);
    c.init(Cipher.DECRYPT_MODE, key);
    byte[] decordedValue = new BASE64Decoder().decodeBuffer(encryptedValue);
    byte[] decValue = c.doFinal(decordedValue);
    String decryptedValue = new String(decValue);
    return decryptedValue;
}

尝试修改apache commons代码

public static String AESencrypt(String valueToEnc) throws Exception {
    Key key = new SecretKeySpec(keyValue, ALGORITHM);
    Cipher c = Cipher.getInstance(ALGORITHM);
    c.init(Cipher.ENCRYPT_MODE, key);
    byte[] encValue = c.doFinal(valueToEnc.getBytes());
    String encryptedValue = new Base64().encodeBase64(encValue).toString();
    return encryptedValue;
}

public static String AESdecrypt(String encryptedValue) throws Exception {
    Key key = new SecretKeySpec(keyValue, ALGORITHM);
    Cipher c = Cipher.getInstance(ALGORITHM);
    c.init(Cipher.DECRYPT_MODE, key);
    byte[] decordedValue = new Base64().decodeBase64(encryptedValue);
    byte[] decValue = c.doFinal(decordedValue);
    String decryptedValue = new String(decValue);
    return decryptedValue;
}

原来的代码工作正常,新代码抛出以下异常,

Exception in thread "main" javax.crypto.IllegalBlockSizeException: Input length must be multiple of 16 when decrypting with padded cipher at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:750) at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:676) at com.sun.crypto.provider.AESCipher.engineDoFinal(AESCipher.java:313) at javax.crypto.Cipher.doFinal(Cipher.java:2087) at trial2.encrypt.AESdecrypt(encrypt.java:28) at trial2.encrypt.main(encrypt.java:37) Java Result: 1

如何在不改变初始代码太多的情况下解决这个问题,这里那里几行就可以了。是否有可能完全消除 Base64 编码步骤并使其仅适用于这样的密码:

public static String AESencrypt(String valueToEnc) throws Exception {
    Key key = new SecretKeySpec(keyValue, ALGORITHM);
    Cipher c = Cipher.getInstance(ALGORITHM);
    c.init(Cipher.ENCRYPT_MODE, key);
    byte[] encValue = c.doFinal(valueToEnc.getBytes());
    return encValue.toString();
}

public static String AESdecrypt(String encryptedValue) throws Exception {
    Key key = new SecretKeySpec(keyValue, ALGORITHM);
    Cipher c = Cipher.getInstance(ALGORITHM);
    c.init(Cipher.DECRYPT_MODE, key);
    byte[] decValue = c.doFinal(encryptedValue.getBytes());
    String decryptedValue = new String(decValue);
    return decryptedValue;
}

上面的代码与第二个代码有类似的异常:

Exception in thread "main" javax.crypto.IllegalBlockSizeException: Input length must be multiple of 16 when decrypting with padded cipher at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:750) at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:676) at com.sun.crypto.provider.AESCipher.engineDoFinal(AESCipher.java:313) at javax.crypto.Cipher.doFinal(Cipher.java:2087) at trial2.encrypt.AESdecrypt(encrypt.java:26) at trial2.encrypt.main(encrypt.java:35) Java Result: 1

请帮助 TYVM

最佳答案

错误出在您的加密方法中。以下代码是错误的:

byte[] encValue = c.doFinal(valueToEnc.getBytes());
String encryptedValue = new Base64().encodeBase64(encValue).toString();

您正在对字节数组调用toString(),这不会执行您想要的操作!相反,请尝试:

byte[] encValue = c.doFinal(valueToEnc.getBytes());
String encryptedValue = Base64.encodeBase64String(encValue);

这应该可以正常工作。

关于java - sun.misc.BASE64 到 apache commons,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15223111/

相关文章:

javascript - 在 Convert.FromBase64String 中输入时 FileReader.readAsDataURL 结果返回格式异常

ios - 快速解码Base64图像

java - 如何修复无效的 AES key 长度?

Java AES 解密带有错误 header 的 zip 文件

java - IntelliJ IDEA 中的 JTS 拓扑套件

java - 如何解决从四个随机生成的数字中查找最小数字时偶尔出现的错误答案

java - 如何使用 GSON 提取单个 key 并转换为类

java - Play 2.0 中带有泛型的自定义格式化程序

java.util.Base64 解码然后编码产生不同的字符串

java - 我可以只解密使用 Java 中的 AES/CBC 加密的文件的一部分吗?