-->

如何实现在WinRT中C#“AES / CFB / NoPadding”加密/解密?(How to

2019-11-01 04:07发布

我们正在移植现有代码到Windows 8现在,从服务器下载的数据文件中的“AES / CFB / NoPadding”是加密的,因为数据文件被使用了很多现有客户,我们不能改变数据加密模式。

在WinRT的,则[SymmetricAlgorithmNames] [1]不包含一个名称,以匹配 “AES / CFB / NoPadding”。 而从[SymmetricKeyAlgorithmProvider] [2]的文件,NoPadding算法不包含“CFB”

  • 没有填充:
  • DES_CBC
  • DES_ECB
  • 3DES_CBC
  • 3DES_ECB
  • RC2_CBC
  • RC2_ECB
  • AES_CBC
  • AES_ECB
那么如何才能得到一个[SymmetricKeyAlgorithmProvider] [2],支持AES / CFB / NoPadding? 是否有第三方加密包metro应用?

Answer 1:

一种选择是使用BouncyCastle的图书馆,他们也支持AES / OFB / NoPadding。

另一种选择是使用PaddingMode.Zeros使用从C#框架和加密System.Security.Cryptography.Aes,然后截断加密数据到相同的长度的输入数据(在加密文本的结尾处丢弃填充数据)。 解密时,追加填充(任何垃圾或零)到cipertext对齐到块长度,设定PaddingMode.None,解密,扔掉填充字节在端部(它们将是假的)。 事情是这样的:

        var aes2 = Aes.Create();
        aes2.KeySize = 128;
        aes2.BlockSize = 128;
        aes2.Mode = CipherMode.CFB;
        aes2.Padding = PaddingMode.Zeros;
        var aes2Data = new byte[buff.Length];
        // strip padded data
        Buffer.BlockCopy(aes2.CreateEncryptor().TransformFinalBlock(buff, 0, buff.Length), 0,
            aes2Data, 0, buff.Length);
        Console.WriteLine("Aes2 size: {0}", aes2Data.Length);


        // validate aes2
        var size = aes2Data.Length;
        var pad = aes2Data.Length % 16;
        if (pad != 0)
        {
            var tmp = new byte[aes2Data.Length + 16 - pad];
            Buffer.BlockCopy(aes2Data, 0, tmp, 0, aes2Data.Length);
            aes2Data = tmp;
        }

        var aes2Decr = Aes.Create();
        aes2Decr.Padding = PaddingMode.None;
        aes2Decr.Key = aes2.Key;
        aes2Decr.Mode = aes2.Mode;
        aes2Decr.IV = aes2.IV;
        var data2 = aes2Decr.CreateDecryptor().TransformFinalBlock(aes2Data, 0, aes2Data.Length);
        valid = data2.Take(size).SequenceEqual(buff);
        if (!valid)
            throw new ApplicationException("Invalid data");


文章来源: How to implement “AES/CFB/NoPadding” Encryption/Decryption in WinRT C#?