Java 加密和解密字符串
我有一个关于加密和解密字符串的问题 我必须通过网络发送加密字符串。(安卓应用程序是客户端)这就是我目前所做的Java 加密和解密字符串,java,android,encryption,Java,Android,Encryption,我有一个关于加密和解密字符串的问题 我必须通过网络发送加密字符串。(安卓应用程序是客户端)这就是我目前所做的 byte[] input = getByteArray(filePath);//get the message stored in a file as a byte array 通过阅读一些教程,我成功地将字符串消息发送到字节数组并 使用javax.crypto对其进行加密 Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding
byte[] input = getByteArray(filePath);//get the message stored in a file as a byte array
通过阅读一些教程,我成功地将字符串消息发送到字节数组并
使用javax.crypto对其进行加密
Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, key, ivSpec);
加密消息作为字节数组检索
byte[] encrypted
我甚至设法用反向方法解密它,然后再次得到消息
但当我试图将这个加密字节数组转换为字符串(通过网络传递)时,我的问题就出现了
然后将其重新转换为字节数组
byte[] encrypted
我试过这个
String encryptedStrn = new String(encrypted); // convert to string
当我将其转换为字节数组时
byte[]enc=encryptedStrn.getBytes()
并使用此enc数组进行解密,但输出不正确
我错过了一些关于转换的基本知识。请帮帮我。
提前感谢正如CodeInChaos在评论中所写,您不应该使用
字符串(字节[])
构造函数从不透明的二进制数据创建字符串。字符串构造函数用于使用ASCII、UTF-8等编码的文本数据。不透明的二进制数据(如加密结果或图像文件)不是以相同方式编码的文本数据,因此最终会丢失信息
您应该改用base64,它将任何二进制数据编码为ASCII。有各种各样的第三方库,包括一个好的。或者,在Android上,您可以只使用该类
此外,即使在编码或解码真实文本时,也不应该使用
String.getBytes()
和字符串(byte[])
构造函数-它们使用平台默认编码,这几乎总是错误的选择。相反,应该使用显式接受字符集
或字符编码名称的重载。如果你能控制两端,UTF-8通常是一种很好的编码方式——如果你只控制一端,你需要知道另一端需要哪种编码。正如CodeInChaos在评论中所写,你不应该使用字符串(byte[])
构造函数从不透明的二进制数据创建字符串。字符串构造函数用于使用ASCII、UTF-8等编码的文本数据。不透明的二进制数据(如加密结果或图像文件)不是以相同方式编码的文本数据,因此最终会丢失信息
您应该改用base64,它将任何二进制数据编码为ASCII。有各种各样的第三方库,包括一个好的。或者,在Android上,您可以只使用该类
此外,即使在编码或解码真实文本时,也不应该使用
String.getBytes()
和字符串(byte[])
构造函数-它们使用平台默认编码,这几乎总是错误的选择。相反,应该使用显式接受字符集
或字符编码名称的重载。如果你能控制两端,UTF-8通常是一种很好的编码方式——如果你只控制一端,你需要知道另一端需要哪种编码。你应该对密码文本进行base64编码。不要只是把它转换成字符串。字符串不是二进制数据的容器。您应该对密码文本进行base64编码。不要只是把它转换成字符串。字符串不是二进制数据的容器。不要使用encryptedStrn.getBytes()
。使用Base64编码。DES也相当弱。请改用AES。@CodeInChaos我在将字节转换为字符串时遇到问题。如果您按照@CodeInChaos的建议操作,则不会这样做。@CodeInChaos谢谢您的建议不要使用encryptedStrn.getBytes()
。使用Base64编码。DES也相当弱。请改用AES。@CodeInChaos我在将字节转换为字符串方面有问题。如果你按照@CodeInChaos的建议去做,你就不会这样做了。@CodeInChaos谢谢你的建议谢谢你给我指明了正确的方向。你提供的信息对我来说非常有用,可以为我指明正确的方向。你提供的信息对我很有用
public string EncryptUser(string userID)
{
using (var cryptoProvider = new DESCryptoServiceProvider())
using (var memoryStream = new MemoryStream())
using (var cryptoStream = new CryptoStream(memoryStream, cryptoProvider.CreateEncryptor(DESKey, DESInitializationVector), CryptoStreamMode.Write))
using (var writer = new StreamWriter(cryptoStream))
{
writer.Write(userID);
writer.Flush();
cryptoStream.FlushFinalBlock();
writer.Flush();
return Convert.ToBase64String(memoryStream.GetBuffer(), 0, (int)memoryStream.Length);
}
}
public string DecryptUserID(string userID)
{
using (var cryptoProvider = new DESCryptoServiceProvider())
using (var memoryStream = new MemoryStream(Convert.FromBase64String(userID)))
using (var cryptoStream = new CryptoStream(memoryStream, cryptoProvider.CreateDecryptor(DESKey, DESInitializationVector), CryptoStreamMode.Read))
using (var reader = new StreamReader(cryptoStream))
{
return reader.ReadToEnd();
}
}