【问题标题】:encrypt and decrypt string加密和解密字符串
【发布时间】:2012-07-01 14:55:40
【问题描述】:

我有一个关于加密和解密字符串的问题

我必须通过网络发送一个加密字符串。(一个 android 应用程序是客户端)这是我到目前为止所做的

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

加密的 msg 被检索为字节数组

byte[] encrypted

我什至设法使用反向方法解密并再次获取消息

但是当我尝试将此加密的字节数组转换为字符串(通过网络传递它)时,我的问题就出现了 然后将其重新转换为字节数组

我试过了

String encryptedStrn = new String(encrypted); // convert to string

当我将它转换为字节数组时 byte[] enc = encryptedStrn.getBytes();

并使用此 enc 数组解密,但输出不正确。

我是否错过了一些关于转换的基本内容。请帮我。 提前致谢

【问题讨论】:

  • 不要使用encryptedStrn.getBytes()。使用 Base64 编码。
  • DES 也很弱。请改用 AES。
  • @CodeInChaos 我在将字节转换为字符串时遇到问题。
  • 如果你按照@CodeInChaos 的建议去做,你就不会。
  • @CodeInChaos 感谢您的建议

标签: java android encryption


【解决方案1】:

正如 CodeInChaos 在评论中所写,您不应使用 String(byte[]) 构造函数从不透明的二进制数据创建字符串。字符串构造函数适用于已使用 ASCII、UTF-8 等编码方式编码的 文本数据。不透明的二进制数据,例如加密结果或图像文件,不是 以同样的方式编码文本数据,所以你最终会丢失信息。

您应该改用 base64,它将 any 二进制数据编码为 ASCII。为此有各种第三方库,包括一个很好的public domain one。或者,在 Android 上,您可以只使用 Base64 类。

此外,即使您正在编码或解码真实文本,也不应该使用String.getBytes()String(byte[]) 构造函数——它们使用平台默认编码,这几乎总是错误的选择。相反,您应该使用显式采用CharSet 或字符编码名称的重载。如果您能够控制两端,UTF-8 通常是一种很好的编码 - 如果您只控制一端,您需要知道另一端期望哪种编码。

【讨论】:

  • 感谢您为我指明正确的方向。您提供的信息对我很有用
【解决方案2】:

您应该对密文进行 base64 编码。不要只是将其转换为字符串。字符串不是二进制数据的容器。

【讨论】:

    【解决方案3】:
        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();
            }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多