none
AES解密服务器返回的数据,有密钥和IV,如何解密? RRS feed

  • 问题

  •   string ServerRetureMessage = "w1rt5RuOlgQirdbMUGPqOC4OdeKCAN9nauRn8j2tf1bRfapZBncAoq6vgZMqM4uhydhYoqCSvtX8cpDSwzUaLcFvx9bG3MmSAlTXH2scHjE=";
                    //编码到Base64
                    //使用AES解密
      public static string AESDecryption(byte[] bytes)
            {
                string key = "&ujdk1(7q12kjrhq";
                string iv = "2012010298weishu";
                byte[] iv1 = Convert.FromBase64String(iv);
                // Declare a buffer to contain the decrypted data.
                IBuffer buffDecrypted;
    
                var encoding = BinaryStringEncoding.Utf8;
                // Open an symmetric algorithm provider for the specified algorithm. 
                SymmetricKeyAlgorithmProvider objAlg = SymmetricKeyAlgorithmProvider.OpenAlgorithm(SymmetricAlgorithmNames.AesCbcPkcs7);
                
                // Create Key for algorithem provider
                IBuffer keyMaterial = CryptographicBuffer.ConvertStringToBinary(key, encoding);
                IBuffer IV = BytesToBuffer(iv1);
                CryptographicKey cryptographicKey = objAlg.CreateSymmetricKey(keyMaterial);
    
                IBuffer buffEncrypt = BytesToBuffer(bytes);
    
                buffDecrypted = CryptographicEngine.Decrypt(cryptographicKey, buffEncrypt, IV);
    
                string result = CryptographicBuffer.ConvertBinaryToString(BinaryStringEncoding.Utf8, buffDecrypted);
    
                return result;
            }
    ServerRetureMessage 是服务器返回的一段加密的数据,服务器上采用的是AES加密,并且提供了key和IV,如何解密ServerRetureMessage 呢?我调用解密方法时会报错,不知道哪里有问题 ?求帮助
    2014年5月18日 7:02

答案

  • 你好 lxdhuainan,

    我把你两个帖子合并了,同时我不清楚你的 BytesToBuffer()这个方法是怎么定义的,我看到你之前回复了一个很早的帖子,姑且认为你使用的是这段代码:

            static IBuffer BytesToBuffer(byte[] bytes)
            {
                return WindowsRuntimeBufferExtensions.AsBuffer(bytes, 0, bytes.Length);
            }

    有一个最简单的办法来确定你的问题出在哪里,因为你的数据来自服务器,目前不清楚数据的正确性,而同时错误消息也是数据不正确。那么如果你的数据是由你自己生成的,比如说像Aaron这个帖子中(http://social.msdn.microsoft.com/Forums/zh-CN/8f031757-28a8-46f0-8d6c-4bf3b9dfff16/metro-style-aes-?forum=winstoreappzhcn)用到的测试数据一样,来试试是否还有错误异常抛出。

    如果有,那么就是代码的问题,我们再一起来调试一下。

    如果没有,那么应该考虑是否是服务器端发来的数据有问题。

    --James


    <THE CONTENT IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, WHETHER EXPRESS OR IMPLIED>
    Thanks
    MSDN Community Support

    Please remember to "Mark as Answer" the responses that resolved your issue. It is a common way to recognize those who have helped you, and makes it easier for other visitors to find the resolution later.

    • 已标记为答案 lxd_DD 2014年5月20日 2:42
    2014年5月19日 8:15
    版主

全部回复

  •    string ServerRetureMessage = "w1rt5RuOlgQirdbMUGPqOC4OdeKCAN9nauRn8j2tf1bRfapZBncAoq6vgZMqM4uhydhYoqCSvtX8cpDSwzUaLcFvx9bG3MmSAlTXH2scHjE=";
                   byte[] stringmsg = Convert.FromBase64String(ServerRetureMessage);//base64解码
                   AESDecryption(stringmsg);//AES解密
    public static string AESDecryption(byte[] byteData)
            {
                IBuffer buffDecrypted;
    
                string KEY = "&ujdk1(7q12kjrhq";
                string IV = "2012010298weishu";
    
    
                IBuffer Final_Key = BytesToBuffer(System.Text.Encoding.UTF8.GetBytes(KEY));
                IBuffer Final_IV = BytesToBuffer(System.Text.Encoding.UTF8.GetBytes(IV));
                IBuffer buffEncrypt = BytesToBuffer(byteData);
              
                SymmetricKeyAlgorithmProvider objAlg = SymmetricKeyAlgorithmProvider.OpenAlgorithm(SymmetricAlgorithmNames.AesCbcPkcs7);
    
                CryptographicKey cryptographicKey = objAlg.CreateSymmetricKey(Final_Key);
    
                buffDecrypted = CryptographicEngine.Decrypt(cryptographicKey, buffEncrypt, Final_IV);
    
                string result = CryptographicBuffer.ConvertBinaryToString(BinaryStringEncoding.Utf8, buffDecrypted);
    
                return result;
            }
    调用Decrypt的时候报错 不知道什么原因 ?

    2014年5月18日 7:45
  • 你好 lxdhuainan,

    我把你两个帖子合并了,同时我不清楚你的 BytesToBuffer()这个方法是怎么定义的,我看到你之前回复了一个很早的帖子,姑且认为你使用的是这段代码:

            static IBuffer BytesToBuffer(byte[] bytes)
            {
                return WindowsRuntimeBufferExtensions.AsBuffer(bytes, 0, bytes.Length);
            }

    有一个最简单的办法来确定你的问题出在哪里,因为你的数据来自服务器,目前不清楚数据的正确性,而同时错误消息也是数据不正确。那么如果你的数据是由你自己生成的,比如说像Aaron这个帖子中(http://social.msdn.microsoft.com/Forums/zh-CN/8f031757-28a8-46f0-8d6c-4bf3b9dfff16/metro-style-aes-?forum=winstoreappzhcn)用到的测试数据一样,来试试是否还有错误异常抛出。

    如果有,那么就是代码的问题,我们再一起来调试一下。

    如果没有,那么应该考虑是否是服务器端发来的数据有问题。

    --James


    <THE CONTENT IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, WHETHER EXPRESS OR IMPLIED>
    Thanks
    MSDN Community Support

    Please remember to "Mark as Answer" the responses that resolved your issue. It is a common way to recognize those who have helped you, and makes it easier for other visitors to find the resolution later.

    • 已标记为答案 lxd_DD 2014年5月20日 2:42
    2014年5月19日 8:15
    版主
  • 你好,我刚才又调试了下 现在报了一个转换错误 不知道怎么回事

    2014年5月19日 9:07
  • 上面的那个转换错误,我把解密方法换成同步的就可以了,不用异步调用了,这是怎么回事?同步和异步还会不一样
    2014年5月20日 2:38
  • 解决了就好,异步和同步的区别就在于时间差,在WinRT中异步可能占用的时间超过50ms,所以才开一个线程让他单独执行,很有可能在执行的过程中,后续的代码得不到值所以才会导致出问题。请参考:http://msdn.microsoft.com/zh-cn/library/hh191443.aspx

    --James


    <THE CONTENT IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, WHETHER EXPRESS OR IMPLIED>
    Thanks
    MSDN Community Support

    Please remember to "Mark as Answer" the responses that resolved your issue. It is a common way to recognize those who have helped you, and makes it easier for other visitors to find the resolution later.

    2014年5月20日 6:59
    版主
  • 非常感谢!
    2014年5月20日 7:15