Windows 8 如何实施";AES/CFB/NoPadding“;WinRT C#中的加密/解密?

Windows 8 如何实施";AES/CFB/NoPadding“;WinRT C#中的加密/解密?,windows-8,encryption-symmetric,Windows 8,Encryption Symmetric,我们现在正在将现有代码移植到Windows 8,从服务器下载的数据文件在“AES/CFB/NoPadding”中进行加密,并且我们无法更改数据加密模式,因为数据文件被许多现有客户端使用。 在WinRT中,[SymmetricalGorthmNames][1]不包含与“AES/CFB/NoPadding”匹配的名称。从[SymmetricKeyAlgorithmProvider][2]文档中,NoPadding算法不包含“CFB” 无填充: 德苏CBC 欧洲央行 3DES_CBC 欧洲中央银行

我们现在正在将现有代码移植到Windows 8,从服务器下载的数据文件在“AES/CFB/NoPadding”中进行加密,并且我们无法更改数据加密模式,因为数据文件被许多现有客户端使用。

在WinRT中,[SymmetricalGorthmNames][1]不包含与“AES/CFB/NoPadding”匹配的名称。从[SymmetricKeyAlgorithmProvider][2]文档中,NoPadding算法不包含“CFB”
  • 无填充:
  • 德苏CBC
  • 欧洲央行
  • 3DES_CBC
  • 欧洲中央银行
  • RC2_CBC
  • 欧洲中央银行
  • 爱依斯大学
  • 欧洲中央银行
那么,我们如何获得一个[SymmetricKeyAlgorithmProvider][2]来支持AES/CFB/NoPadding? Metro应用程序是否有第三方加密包?
一种选择是使用BouncyCastle库,它们确实支持Aes/Ofb/NoPadding

另一种选择是使用c#framework中的System.Security.Cryptography.Aes,并使用PaddingMode.zero进行加密,然后将加密数据截断为与输入数据相同的长度(在加密文本末尾丢弃填充数据)。 解密时,将填充(任何垃圾或零)附加到密文以与块长度对齐,设置PaddingMode.None,decrypt,在末尾丢弃填充字节(它们将是伪造的)。 大概是这样的:

        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");

winrt应用程序没有System.Security.Cryptography,这部分与常见的.net framework完全不同。