【问题标题】:How to make AesEncrypterHandler encrypt the same way as Aes does如何使 AesEncrypterHandler 以与 Aes 相同的方式加密
【发布时间】:2020-06-09 22:44:18
【问题描述】:

我正在尝试使用AesCryptoServiceProvider 来实现与Aes 相同的加密机制。 这是我的AesCryptoServiceProvider 版本:

        public string version1(string plainText, string encryptionKey, string initializationVector)
        {
            AesCryptoServiceProvider provider = new AesCryptoServiceProvider
            {
                BlockSize = 128,
                Padding = PaddingMode.PKCS7,
                Key = Convert.FromBase64String(encryptionKey),
                IV = Encoding.UTF8.GetBytes(initializationVector)
            };

            byte[] buffer = Encoding.ASCII.GetBytes(plainText);
            byte[] encrypted = provider.CreateEncryptor().TransformFinalBlock(buffer, 0, buffer.Length);
            return Convert.ToBase64String(encrypted);
        }

这是它的Aes 版本:

        public string version2(string plainText, string encryptionKey, string initializationVector)
        {
            byte[] clearBytes = Encoding.UTF8.GetBytes(plainText);
            byte[] encryptedBytes;
            byte[] iv = Encoding.UTF8.GetBytes(initializationVector);

            using (Aes aes = Aes.Create())
            {
                aes.BlockSize = 128;
                aes.Padding = PaddingMode.PKCS7;
                aes.Key = Convert.FromBase64String(encryptionKey);
                aes.IV = iv;

                using (MemoryStream ms = new MemoryStream())
                using (CryptoStream cs = new CryptoStream(ms, aes.CreateEncryptor(), CryptoStreamMode.Write))
                {
                    cs.Write(clearBytes, 0, clearBytes.Length);
                    cs.Close();
                    encryptedBytes = ms.ToArray();
                }
            }

            byte[] ivEncryptedBytes = new byte[iv.Length + encryptedBytes.Length];
            Buffer.BlockCopy(iv, 0, ivEncryptedBytes, 0, iv.Length);
            Buffer.BlockCopy(encryptedBytes, 0, ivEncryptedBytes, iv.Length, encryptedBytes.Length);

            return Convert.ToBase64String(ivEncryptedBytes);
        }

当我使用 version1 和 version2 加密相同的字符串时,它们变得不同。关于这两种方法有何不同以及如何使 version1 产生与 version2 相同的加密字符串的任何想法? (附:我对加密比较陌生,如果答案很明显,我很抱歉)谢谢!

【问题讨论】:

  • 查看版本 1 和版本 2 的示例输出可能对我们有所帮助。据我所见,version2 的输出是“initializationVector”| “encryptedBytes”,意味着两者都是串联的。此版本主要在将 IV 与密文一起发送给收件人时完成。尝试将两个结果解码为十六进制字符串,我们会看到差异(您可以使用base64.guru/converter/decode/hex 作为在线解码器)。
  • @MichaelFehr 就是这样!不敢相信我错过了哈哈,现在感觉这是一个愚蠢的问题,但非常感谢您的帮助!
  • 我很高兴为您提供帮助 :-) 如果您使用自己找到的解决方案编写答案以帮助其他人解决同样的问题,这将对社区有好处。
  • @MichaelFehr 谢谢,会做的!还有一个问题——这种加密方式(连接initializationVector | encryptedBytes)在加密世界中很常见吗?
  • 对于几乎所有的 AES 加密算法(ECB 模式除外),您都需要在加密端有一个初始化向量。除了加密/密文之外,该 IV 还需要与接收者(解密方)通信。在我见过的大多数通信协议中,IV 与密文连接,然后进行 Base64 编码,所以 - 是的 - 它在加密世界中很常见。

标签: encryption aes rijndael rijndaelmanaged aescryptoserviceprovider


【解决方案1】:

正如@MichaelFehr 所指出的,在将字节转换回字符串之前,版本2 仅将初始化向量和加密字节连接在一起。我已经测试过,如果我在version1中以与version2相同的方式连接字符串,结果字符串将变得相同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-31
    • 1970-01-01
    • 2022-01-17
    • 1970-01-01
    • 2018-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多