【问题标题】:AES encryption and decryptionAES加密和解密
【发布时间】:2014-01-05 21:11:35
【问题描述】:

我不确定如何解释这一点,所以我将添加我的代码并尝试从那里完成它。如您所见,这几乎没有遵循常见的编程标准。我正在尝试从密钥和 iv 生成中删除所有“随机性”,因此我提供了自己的字符串并将其适当地添加到 AES 值中。

一旦我将该值加密后,我会将其转换为字符串并将其作为密码参数存储在数据库中。我的问题是能够将其解密回原始密码值,稍后某些 Web 请求需要使用它。我尝试将字符串值转换回字节数组,但出现“无效块大小”错误,随后出现“错误 PKCS7 填充。无效长度 250”。不知道这意味着什么。

有什么想法吗?

    static public void Main()
{
    string original ="{password for testing purposes}";
    string originalkey = "{128 key}";
    string originaliv = "{16 iv}";


    byte[] enckey = Encoding.UTF8.GetBytes(originalkey);
    byte[] enciv = Encoding.UTF8.GetBytes(originaliv);

    using (AesManaged myAes = new AesManaged())
    {
        myAes.Key = enckey;             
        myAes.IV = enciv;
        byte[] encrypted = EncryptStringToBytes_Aes(original, myAes.Key, myAes.IV);
        string result = Encoding.UTF8.GetString(encrypted);

        string roundtrip = DecryptStringFromBytes_Aes(encrypted, myAes.Key, myAes.IV);


        Console.WriteLine("Encrypted:   {0}", result);
        Console.WriteLine("Round Trip: {0}", roundtrip);


        byte[] decrypted = Encoding.UTF8.GetBytes(result);

        roundtrip = DecryptStringFromBytes_Aes(decrypted, myAes.Key, myAes.IV);


        Console.WriteLine("Encrypted:   {0}", roundtrip);
        Console.WriteLine("Round Trip: {0}", result);

   }
       }

【问题讨论】:

  • 简单地将您的 byte[] 数组 blob 编码为字符串可能会给您带来几个问题——它可能包含零字节,它可能导致数据库无法正确处理字符(取决于数据库配置) .尝试坚持使用文本编码不会干扰字符串的编码(例如具有字节的十六进制值的字符串,或 Base64 编码)

标签: c# .net encryption aes


【解决方案1】:

您正在获取二进制、非文本数据并将其转换为字符串,然后尝试将其转换回二进制数据。如果你想存储加密数据的字符串表示,我建议使用二进制到文本的编码算法,例如 Base64 编码(参见An efficient way to Base64 encode a byte array?)。

如果您可以将其存储为二进制(例如,在 SQL Server varbinary 列中),那么您可以完全跳过字符串编码。

byte[] encrypted = EncryptStringToBytes_Aes(original, myAes.Key, myAes.IV);
roundtrip = DecryptStringFromBytes_Aes(encrypted, myAes.Key, myAes.IV);

Console.WriteLine("Original:   {0}", original);
Console.WriteLine("Decrypted:   {0}", roundtrip);

【讨论】:

    【解决方案2】:

    问题在于您使用的编码。假设字节数组是一个 UTF8 字符串,我不确定它是不是。使用来自this question 的 Jon Skeet 答案,我将使用以下方法将您的字节数组转换为字符串并返回:

    string result = Convert.ToBase64String(encrypted);
    ...
    byte[] decrypted = Convert.FromBase64String(result);
    

    【讨论】:

      猜你喜欢
      • 2015-01-20
      • 2019-01-06
      • 1970-01-01
      • 1970-01-01
      • 2012-02-24
      • 2015-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多