由于密钥长度问题,Windows.security.cryptography API失败

时间:2012-10-29 10:05:17

标签: .net encryption windows-8 encryption-symmetric

我一直在尝试在Windows 8(Windows应用商店应用)中使用Windows.security.cryptography API进行字符串的基本对称密钥加密(暂时)。

在线查看各种示例,但在所有这些示例中,代码都因我的密钥长度异常而失败。

static byte[] cKey = { (byte)'A', (byte)'B', (byte)'C', (byte)'D', (byte)'E' };
        static byte[] cIV = { (byte)'A', (byte)'B', (byte)'C', (byte)'D', (byte)'E' };
        public static string Encrypt(String guidOriginal)
        {
            IBuffer encrypted;
            IBuffer buffer;
            IBuffer iv = null;
            SymmetricKeyAlgorithmProvider algorithm = SymmetricKeyAlgorithmProvider.OpenAlgorithm("AES_CBC_PKCS7");
            IBuffer keymaterial = CryptographicBuffer.CreateFromByteArray(cKey);  
            CryptographicKey key = algorithm.CreateSymmetricKey(keymaterial);
            iv = CryptographicBuffer.CreateFromByteArray(cIV);  
            System.Text.UTF8Encoding encoding = new System.Text.UTF8Encoding();
            buffer = CryptographicBuffer.CreateFromByteArray( encoding.GetBytes(guidOriginal));
            encrypted = Windows.Security.Cryptography.Core.CryptographicEngine.Encrypt(key, buffer, iv);
            return CryptographicBuffer.EncodeToBase64String(encrypted);
        }

^^以上是我尝试过的代码之一(使用了来自http://social.msdn.microsoft.com/Forums/en-ZA/winappswithcsharp/thread/b541a08a-d3cd-4e21-8d21-7ed80749cb23的代码的修改版本),该代码在

失败
 CryptographicKey key = algorithm.CreateSymmetricKey(keymaterial);

例外: ArgumentException

1 个答案:

答案 0 :(得分:1)

您必须确保您的密钥块精确为16,24或32个字节。

请参阅维基。 http://en.wikipedia.org/wiki/Advanced_Encryption_Standard

  

AES基于被称为替换置换网络的设计原则,并且在软件和硬件方面都很快。[6]与其前身DES不同,AES不使用Feistel网络。 AES是Rijndael的变体,其固定块大小为128位,密钥大小为128,192或256位。相比之下,Rijndael规范本身使用块和密钥大小来指定,这些大小可以是32位的任意倍数,最小值为128,最大值为256位。