AES加密和解密

9 浏览
0 Comments

AES加密和解密

我不太确定如何解释这个问题,所以我会附上我的代码并尝试从那里解决它。如你所见,这个代码很难遵循通用的编程标准。我试图从密钥和iv生成中删除所有的“随机性”,因此我提供了我的自定义字符串,并将其添加到AES值中。

一旦我加密了这个值,我就把它转换为字符串并将其存储在数据库中作为密码参数。我的问题在于如何将它解密回原始密码值,这是后面某些网络请求所需的。我已经尝试将字符串值转换回字节数组,但我得到了一个“无效的块大小”错误,随后是“坏的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);
   }
       }

admin 更改状态以发布 2023年5月23日
0
0 Comments

问题出在您使用的编码方式上。它会假设字节数组是一个UTF8字符串,但我不确定它是否是。使用Jon Skeet在这个问题中的答案,我建议您采用以下方式将您的字节数组转换为字符串并返回:

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

0
0 Comments

你正在将二进制的非文本数据转换成字符串,然后试图将其转换回二进制数据。如果你想要存储加密数据的字符串表示,建议使用二进制到文本编码算法,例如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);

0