c# - 使用 Aes 解密失败

标签 c# encryption cryptography aes

我正在使用这个函数来加密我的 UWP 项目中的数据:

public string Encrypt(string text, string key)
    {
        byte[] buffer = Encoding.UTF8.GetBytes(text);
        byte[] sessionKey = Encoding.UTF8.GetBytes(key);

        Aes myAes = Aes.Create();

        myAes.Mode = CipherMode.ECB;
        myAes.KeySize = 128;
        myAes.Key = sessionKey;
        myAes.Padding = PaddingMode.PKCS7;

        ICryptoTransform encryptor = myAes.CreateEncryptor();
        buffer = encryptor.TransformFinalBlock(buffer, 0, buffer.Length);

        return Convert.ToBase64String (buffer);

    }

但是在解密从 Encrypt() 返回的数据时,我得到了不同的结果(不等于 Encrypt() 的文本参数)。我正在使用以下代码:

public string Decrypt(string text, string key)

    {

        byte[] buffer = Convert.FromBase64String(text);
        byte[] sessionKey = Encoding.UTF8.GetBytes(key);

        Aes myAes = Aes.Create();

        myAes.Mode = CipherMode.ECB;
        myAes.KeySize = 128;
        myAes.Key = sessionKey;
        myAes.Padding = PaddingMode.PKCS7;

        ICryptoTransform decryptor = myAes.CreateDecryptor();
        buffer = decryptor.TransformFinalBlock(buffer, 0, buffer.Length);

        return Convert.ToBase64String(buffer);
    }

我使用相同的 key 进行加密和解密

更新: 传递给 Encrypt() 的文本参数:450131283::0300DC98050044C406000100040052C40100626B02007E810900660F

从 Encrypt() 返回文本: "lzkPu35Hq7j52IiMWRYSS6j7Vg84abVmhXmNpSxHShJDTbOqkZRFtsPZkEzTsjgRT4MzRHCQUS6MCiq1e5JCune4bZZi1nxxwHtEjZLKZ9E="

我传递给 Decrypt() 方法的相同(以上)值得到以下信息: “NDUwMTMxMjgzOjowMzAwREM5ODA1MDA0NEM0MDYwMDAxMDAwNDAwNTJDNDAxMDA2MjZCMDIwMDdFODEwOTAwNjYwRg==”

最佳答案

问题是你在解密结束时做了什么:

return Convert.ToBase64String(buffer);

您实际上想要将解密的二进制数据转换回字符串,其方式与您将其字符串转换为明文二进制数据的原始方式相同,因此您需要:

return Encoding.UTF8.GetString(buffer);

解决此类问题的最佳方法通常是从每个方向查看转换链中的每个步骤,并确保它们是平衡的。所以它应该是这样的:

Text
    (Encode with UTF-8)
        Non-encrypted binary data
            (Encrypt)
                Encrypted binary data
                    (Convert to base64)
                        Encrypted data as base64 text
                        (Store or whatever...)
                        Encrypted data as base64 text
                    (Convert from base64)
                Encrypted binary data
            (Decrypt)
        Non-encrypted binary data
    (Decode with UTF-8)
Text

我说的是“使用 UTF-8 解码”,而你说的是“转换为 base64”,因此解码步骤与编码步骤不匹配。

关于c# - 使用 Aes 解密失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44180353/

相关文章:

php - 如何解密 PHP 中 npm-rsa 创建的数据?

java - 在Java中生成并使用两个 key 进行加密和解密

c# - 静态类的竞争条件?

c# - 如何在 SilverLight 中的某个时间(500 毫秒)调用某个方法

http - 可以加密通过 IIS 上的 HTTP 的身份验证(没有 SSL)吗?

php - SQLite3数据库加密——确定加密库?

java - 用于安全计算欧几里德距离平方的 Paillier 密码系统和协议(protocol)

c# - 可以在 MySQL Select 语句中允许正则表达式匹配吗?

c# - 在任何第一个数字之前拆分字符串

android - 混淆(minifyEnabled true)在调试和发布中不起作用