Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 加密和解密字符串_Java_Android_Encryption - Fatal编程技术网

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();
        }
    }