JAVA Cipher解密加密的中文文本,有时无法再次还原为中文文本,并出现类似的错误
JAVA Cipher decrypt encrypted Chinese text, sometimes fail to bring back to Chinese text again and get error like ÃÂ
所以我做了一个简单的程序,将人们的文本加密为字符串并将其写入 file.txt
如果有人想读取数据,程序将得到 file.txt 作为字符串
并解密数据
这是后台程序
用户 type/input 文本或阅读文本在网络上(只是简单的文本区域)
即使在生产中,一切都很好,测试也很好,
但是当有人开始插入中文文本时发生错误
奇怪的是,并不总是错误
我的意思是用户在编写文档时使用了一些中文文本,一切正常,他保存了它,而不是更改它,不断添加新文本
他仍然可以阅读文本,保存,前几天阅读和写作
但有一天他看不懂中文,只能看中文
他主要写英文文本文档,也许有些人的中文名字他不会用英文写,所以他使用中文文本
我什至尝试循环加密解密数据过程,大约100次,它仍然成功地加密和解密回中文文本
所以我真的不知道是什么导致了错误
这是我的代码
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
import java.util.Base64;
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
public class DecriptEncript {
public static void main(String[] args) {
final String secretKey = "zxc";
//String originalString = "i";
String originalString = "你好吗";
for(int i = 0 ; i <100;i++) { // when i test try 100 times
String encryptedString = DecriptEncript.encrypt(originalString, secretKey) ;
String decryptedString = DecriptEncript.decrypt(encryptedString, secretKey) ;
System.out.println(originalString);
System.out.println(encryptedString);
System.out.println(decryptedString);
}
}
private static SecretKeySpec secretKey;
private static byte[] key;
public static void setKey(String myKey)
{
MessageDigest sha = null;
try {
key = myKey.getBytes("UTF-8");
sha = MessageDigest.getInstance("SHA-1");
key = sha.digest(key);
key = Arrays.copyOf(key, 16);
secretKey = new SecretKeySpec(key, "AES");
}
catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
public static String encrypt(String strToEncrypt, String secret)
{
try
{
setKey(secret);
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
return Base64.getEncoder().encodeToString(cipher.doFinal(strToEncrypt.getBytes("UTF-8")));
}
catch (Exception e)
{
System.out.println("Error while encrypting: " + e.toString());
}
return null;
}
public static String decrypt(String strToDecrypt, String secret)
{
try
{
setKey(secret);
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5PADDING");
cipher.init(Cipher.DECRYPT_MODE, secretKey);
return new String(cipher.doFinal(Base64.getDecoder().decode(strToDecrypt)));
}
catch (Exception e)
{
System.out.println("Error while decrypting: " + e.toString());
}
return null;
}
}
错误是当程序要带回中文文本时
“并不总是错误”,当错误发生时,程序显示的文本如
Ã…â¡Ã,¬Ãâ€Ã¢â(从所有错误中随机抽取)
我不知道如何从这个文本错误中将用户数据恢复为文本中文
我不知道他输入的中文
BTW这是我第一次使用Cipher解密加密
所以如果你问我为什么选择“SHA-1”或“UTF-8”或Arrays.copyOf(key, 16);
老实说,我只是从互联网上的某人那里复制代码
感谢您的帮助
您使用 UTF-8 编码,但您使用平台配置的任何编码进行解码。
所以在解密中也强制使用 UTF-8。
public static String decrypt(String strToDecrypt, String secret)
{
try
{
setKey(secret);
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5PADDING");
cipher.init(Cipher.DECRYPT_MODE, secretKey);
// Note the extraction for readability
byte[] deciphered = cipher.doFinal(Base64.getDecoder().decode(strToDecrypt))
// Here, use UTF-8
return new String(deciphered, "UTF-8");
// Or better:
// return new String(deciphered, StandardCharsets.UTF_8);
}
catch (Exception e)
{
System.out.println("Error while decrypting: " + e.toString());
}
return null;
}
所以我做了一个简单的程序,将人们的文本加密为字符串并将其写入 file.txt 如果有人想读取数据,程序将得到 file.txt 作为字符串 并解密数据
这是后台程序 用户 type/input 文本或阅读文本在网络上(只是简单的文本区域)
即使在生产中,一切都很好,测试也很好, 但是当有人开始插入中文文本时发生错误
奇怪的是,并不总是错误
我的意思是用户在编写文档时使用了一些中文文本,一切正常,他保存了它,而不是更改它,不断添加新文本 他仍然可以阅读文本,保存,前几天阅读和写作 但有一天他看不懂中文,只能看中文 他主要写英文文本文档,也许有些人的中文名字他不会用英文写,所以他使用中文文本
我什至尝试循环加密解密数据过程,大约100次,它仍然成功地加密和解密回中文文本
所以我真的不知道是什么导致了错误
这是我的代码
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
import java.util.Base64;
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
public class DecriptEncript {
public static void main(String[] args) {
final String secretKey = "zxc";
//String originalString = "i";
String originalString = "你好吗";
for(int i = 0 ; i <100;i++) { // when i test try 100 times
String encryptedString = DecriptEncript.encrypt(originalString, secretKey) ;
String decryptedString = DecriptEncript.decrypt(encryptedString, secretKey) ;
System.out.println(originalString);
System.out.println(encryptedString);
System.out.println(decryptedString);
}
}
private static SecretKeySpec secretKey;
private static byte[] key;
public static void setKey(String myKey)
{
MessageDigest sha = null;
try {
key = myKey.getBytes("UTF-8");
sha = MessageDigest.getInstance("SHA-1");
key = sha.digest(key);
key = Arrays.copyOf(key, 16);
secretKey = new SecretKeySpec(key, "AES");
}
catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
public static String encrypt(String strToEncrypt, String secret)
{
try
{
setKey(secret);
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
return Base64.getEncoder().encodeToString(cipher.doFinal(strToEncrypt.getBytes("UTF-8")));
}
catch (Exception e)
{
System.out.println("Error while encrypting: " + e.toString());
}
return null;
}
public static String decrypt(String strToDecrypt, String secret)
{
try
{
setKey(secret);
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5PADDING");
cipher.init(Cipher.DECRYPT_MODE, secretKey);
return new String(cipher.doFinal(Base64.getDecoder().decode(strToDecrypt)));
}
catch (Exception e)
{
System.out.println("Error while decrypting: " + e.toString());
}
return null;
}
}
错误是当程序要带回中文文本时 “并不总是错误”,当错误发生时,程序显示的文本如
Ã…â¡Ã,¬Ãâ€Ã¢â(从所有错误中随机抽取)
我不知道如何从这个文本错误中将用户数据恢复为文本中文 我不知道他输入的中文
BTW这是我第一次使用Cipher解密加密 所以如果你问我为什么选择“SHA-1”或“UTF-8”或Arrays.copyOf(key, 16); 老实说,我只是从互联网上的某人那里复制代码
感谢您的帮助
您使用 UTF-8 编码,但您使用平台配置的任何编码进行解码。
所以在解密中也强制使用 UTF-8。
public static String decrypt(String strToDecrypt, String secret)
{
try
{
setKey(secret);
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5PADDING");
cipher.init(Cipher.DECRYPT_MODE, secretKey);
// Note the extraction for readability
byte[] deciphered = cipher.doFinal(Base64.getDecoder().decode(strToDecrypt))
// Here, use UTF-8
return new String(deciphered, "UTF-8");
// Or better:
// return new String(deciphered, StandardCharsets.UTF_8);
}
catch (Exception e)
{
System.out.println("Error while decrypting: " + e.toString());
}
return null;
}