gpt4 book ai didi

java - 使用 AES 和 Base64 编码进行加密和解密

转载 作者:IT老高 更新时间:2023-10-28 21:10:22 26 4
gpt4 key购买 nike

我有以下加密数据的程序。

import java.security.Key;

import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;

import org.apache.commons.codec.binary.Base64;

public class Test {

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

public static void main(String args[]) throws Exception {
String encriptValue = encrypt("dude5");
decrypt(encriptValue);

}

/**
* @param args
* @throws Exception
*/

public static String encrypt(String valueToEnc) throws Exception {

Key key = generateKey();
Cipher c = Cipher.getInstance(ALGORITHM);
c.init(Cipher.ENCRYPT_MODE, key);

System.out.println("valueToEnc.getBytes().length "+valueToEnc.getBytes().length);
byte[] encValue = c.doFinal(valueToEnc.getBytes());
System.out.println("encValue length" + encValue.length);
byte[] encryptedByteValue = new Base64().encode(encValue);
String encryptedValue = encryptedByteValue.toString();
System.out.println("encryptedValue " + encryptedValue);

return encryptedValue;
}

public static String decrypt(String encryptedValue) throws Exception {
Key key = generateKey();
Cipher c = Cipher.getInstance(ALGORITHM);
c.init(Cipher.DECRYPT_MODE, key);

byte[] enctVal = c.doFinal(encryptedValue.getBytes());
System.out.println("enctVal length " + enctVal.length);

byte[] decordedValue = new Base64().decode(enctVal);

return decordedValue.toString();
}

private static Key generateKey() throws Exception {
Key key = new SecretKeySpec(keyValue, ALGORITHM);
return key;
}

}

我在这里得到以下异常输出?

valueToEnc.getBytes().length 5
encValue length16
encryptedValue [B@aa9835
Exception in thread "main" javax.crypto.IllegalBlockSizeException: Input length must be multiple of 16 when decrypting with padded cipher
at com.sun.crypto.provider.SunJCE_f.b(DashoA13*..)
at com.sun.crypto.provider.SunJCE_f.b(DashoA13*..)

有人可以解释一下原因吗?为什么它在解密时只说长度应该是 16。它不会像使用 doFinal 方法加密一样转换为 16。

正如异常(exception)所说“如何在没有填充密码的情况下解密?”

最佳答案

您的加密订单: getBytes, encrypt, encode, toString
您的解密订单(错误*): getBytes、解密、解码、toString

两个问题:

  1. 正如有人已经提到的,您应该颠倒解密操作的顺序。你没有这样做。
  2. encrypt 给你 16 个字节,encode 24 个字节,但是 toString 给你 106 个字节。与占用额外空间的无效字符有关。

注意:另外,您不需要调用 generateKey() 两次。

解决问题 #1,使用相反的顺序进行解密。
正确的解密顺序: getBytes、decode、decrypt、toString

修复问题 #2,将 xxx.toString() 替换为 new String(xxx)。在加密和解密函数中都这样做。

您的解密应如下所示:

c.init(Cipher.DECRYPT_MODE, key)
val decodedValue = new Base64().decode(encryptedValue.getBytes())
val decryptedVal = c.doFinal(decodedValue)
return new String(decryptedVal)

这应该还给你“dude5”

关于java - 使用 AES 和 Base64 编码进行加密和解密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3954611/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com