使用Base64加解密时出现中文乱码。
当单独使用解密时,无中文乱码问题
使用加密,在解密时就会出现中文乱码问题
/**
* 解密
*
* @param content
* 待解密内容
* @param key
* 解密的密钥
* @return
*/
public static String decrypt(String content, String key) {
if (content.length() < 1)
return null;
byte[] byteRresult = Base64.getDecoder().decode(content);
try {
KeyGenerator kgen = KeyGenerator.getInstance("AES");
SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
secureRandom.setSeed(key.getBytes());
kgen.init(128,secureRandom);
SecretKey secretKey = kgen.generateKey();
byte[] enCodeFormat = secretKey.getEncoded();
SecretKeySpec secretKeySpec = new SecretKeySpec(enCodeFormat, "AES");
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.DECRYPT_MODE, secretKeySpec);
byte[] result = cipher.doFinal(byteRresult);
return new String(result,"utf-8");
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (NoSuchPaddingException e) {
e.printStackTrace();
} catch (InvalidKeyException e) {
e.printStackTrace();
} catch (IllegalBlockSizeException e) {
e.printStackTrace();
} catch (BadPaddingException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return null;
}
/**
* 加密
*
* @param content
* 待加密内容
* @param key
* 加密的密钥
* @return
*/
public static String encrypt(String content, String key) {
try {
//生成密钥
KeyGenerator kgen = KeyGenerator.getInstance("AES");
SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
secureRandom.setSeed(key.getBytes());
kgen.init(128,secureRandom);
SecretKey secretKey = kgen.generateKey();
byte[] enCodeFormat = secretKey.getEncoded();
SecretKeySpec secretKeySpec = new SecretKeySpec(enCodeFormat, "AES");
Cipher cipher = Cipher.getInstance("AES");// 创建密码器
cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);// 初始化
byte[] byteContent = content.getBytes("utf-8");
byte[] byteRresult = cipher.doFinal(byteContent);
return Base64.getEncoder().encodeToString(byteRresult);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (NoSuchPaddingException e) {
e.printStackTrace();
} catch (InvalidKeyException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IllegalBlockSizeException e) {
e.printStackTrace();
} catch (BadPaddingException e) {
e.printStackTrace();
}
return null;
}
测试并没有出现乱码问题
引用 皆我百晓生 小程序回复内容作答:
在加密和解密中都指定了使用UTF-8编码来进行字符串和字节数组之间的转换,所以不应该出现中文乱码问题。但是,如果在加密和解密的过程中使用了不同的编码方式,就会导致解密时出现中文乱码问题。
请确保在调用encrypt
方法时,传入的content
是使用UTF-8编码的字符串;并且在调用decrypt
方法时,传入的content
是使用Base64编码后的字符串。这样就可以避免中文乱码问题的出现。
另外,也需要确保在使用String.getBytes()
方法和new String(byte[], charset)
方法时,指定的字符集与编解码过程中使用的字符集一致,通常推荐使用UTF-8字符集来避免乱码问题的发生。
如果仍然遇到中文乱码问题,请检查过程中是否有其他处理步骤或操作可能会影响到编解码的正确性。
【以下回答由 GPT 生成】
问题的原因是在解密时没有指定正确的字符集,导致解密后的中文出现乱码。
要解决这个问题,需要在解密方法中指定正确的字符集,与加密时使用的字符集保持一致即可。
以下是修改后的代码示例:
/**
* 解密
*
* @param content 待解密内容
* @param key 解密的密钥
* @return 解密后的内容
*/
public static String decrypt(String content, String key) {
if (content.length() < 1)
return null;
byte[] byteResult = Base64.getDecoder().decode(content);
try {
KeyGenerator kgen = KeyGenerator.getInstance("AES");
SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
secureRandom.setSeed(key.getBytes());
kgen.init(128,secureRandom);
SecretKey secretKey = kgen.generateKey();
byte[] enCodeFormat = secretKey.getEncoded();
SecretKeySpec secretKeySpec = new SecretKeySpec(enCodeFormat, "AES");
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.DECRYPT_MODE, secretKeySpec);
byte[] result = cipher.doFinal(byteResult);
// 指定正确的字符集
return new String(result, "utf-8");
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (NoSuchPaddingException e) {
e.printStackTrace();
} catch (InvalidKeyException e) {
e.printStackTrace();
} catch (IllegalBlockSizeException e) {
e.printStackTrace();
} catch (BadPaddingException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return null;
}
/**
* 加密
*
* @param content 待加密内容
* @param key 加密的密钥
* @return 加密后的内容
*/
public static String encrypt(String content, String key) {
try {
// 加密操作代码
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
请注意,在示例代码中的解密方法中添加了指定字符集的代码 new String(result, "utf-8")
。这样可以保证解密后的中文字符显示正确。
希望这个解决方案能够帮助到您。如果您还有其他问题,请随时提问。
【相关推荐】