C# &引用;要解密的数据长度无效";转换为字符串时发生异常

C# &引用;要解密的数据长度无效";转换为字符串时发生异常,c#,asp.net,C#,Asp.net,我正在使用Windows Live Id服务记录和验证我的应用程序。在用户获得身份验证后,我在Windows Live Id服务发送的响应中获得一个令牌。我希望解码此令牌,以便从中获取唯一标识符。以下链接可以更好地解释这一点: 当我尝试创建CryptoStream对象时,尽管代码没有中断,但在VisualStudio中调试时我看到异常 但是,当我试图将流转换为字节时,它抛出一个错误,代码中断 它说: “要解密的数据长度无效” 以下是我正在使用的代码: string token="";

我正在使用Windows Live Id服务记录和验证我的应用程序。在用户获得身份验证后,我在Windows Live Id服务发送的响应中获得一个令牌。我希望解码此令牌,以便从中获取唯一标识符。以下链接可以更好地解释这一点:

当我尝试创建CryptoStream对象时,尽管代码没有中断,但在VisualStudio中调试时我看到异常

但是,当我试图将流转换为字节时,它抛出一个错误,代码中断

它说:

“要解密的数据长度无效”

以下是我正在使用的代码:

     string token="";                     //Token Sent by the service
     string SecretKey = "";              //SecretKey Obtained while registering my application
     byte[] cryptKey = derive(secretKey, "ENCRYPTION");  


    static byte[] derive(string secret, string prefix)
      {
         using(HashAlgorithm hashAlg = HashAlgorithm.Create("SHA256"))
         { 
          const int keyLength = 16;
          byte[] data = Encoding.Default.GetBytes(prefix+secret);
          byte[] hashOutput = hashAlg.ComputeHash(data);
          byte[] byteKey = new byte[keyLength];
          Array.Copy(hashOutput, byteKey, keyLength);
          return byteKey;
         }
      }

    const int ivLength = 16;
    token = HttpUtility.UrlDecode(token);
    byte[] ivAndEncryptedValue = Convert.FromBase64String(token);
    aesAlg = new RijndaelManaged();
    aesAlg.KeySize = 128;
    aesAlg.Key = cryptKey;
    aesAlg.Padding = PaddingMode.PKCS7;
    memStream = new MemoryStream(ivAndEncryptedValue);
    byte[] iv = new byte[ivLength];
    memStream.Read(iv, 0, ivLength);
    aesAlg.IV = iv; 
    cStream = new CryptoStream(memStream, aesAlg.CreateDecryptor(), CryptoStreamMode.Read);
    sReader = new StreamReader(cStream, Encoding.ASCII);
下一行代码抛出错误:“要解密的数据长度无效”

有人知道这背后的原因吗

任何形式的帮助或指导都将不胜感激

先谢谢你

问候,


阿披舍克

这里是一个我目前在解密值时使用的示例 我希望这将帮助您了解您在现有代码中所做的错误

static string Decrypt() 
    {            
      byte[] keyBytes = Convert.FromBase64String("U6XksFkhWV4.......eo3fRg=="");
      byte[] iv = Convert.FromBase64String("KLnP....wA=="");
      byte[] cipherTextBytes = Convert.FromBase64String("Put the EncryptedText here");

      var symmetricKey = new RijndaelManaged { Mode = CipherMode.CBC, IV = iv, KeySize = 128, Key = keyBytes, Padding = PaddingMode.Zeros};

      using (var decryptor = symmetricKey.CreateDecryptor())
      using (var ms = new MemoryStream(cipherTextBytes))
      using (var cs = new CryptoStream(ms, decryptor, CryptoStreamMode.Read)) {
        var plainTextBytes = new byte[cipherTextBytes.Length];
        int decryptedByteCount = cs.Read(plainTextBytes, 0, plainTextBytes.Length);
        return Encoding.UTF8.GetString(plainTextBytes, 0, decryptedByteCount);
      }
    }

我感谢你的帮助。我确实尝试过另一篇文章中的类似代码,但它似乎不起作用。我真的很难弄清楚实际的问题是什么。再次感谢。。。。。
static string Decrypt() 
    {            
      byte[] keyBytes = Convert.FromBase64String("U6XksFkhWV4.......eo3fRg=="");
      byte[] iv = Convert.FromBase64String("KLnP....wA=="");
      byte[] cipherTextBytes = Convert.FromBase64String("Put the EncryptedText here");

      var symmetricKey = new RijndaelManaged { Mode = CipherMode.CBC, IV = iv, KeySize = 128, Key = keyBytes, Padding = PaddingMode.Zeros};

      using (var decryptor = symmetricKey.CreateDecryptor())
      using (var ms = new MemoryStream(cipherTextBytes))
      using (var cs = new CryptoStream(ms, decryptor, CryptoStreamMode.Read)) {
        var plainTextBytes = new byte[cipherTextBytes.Length];
        int decryptedByteCount = cs.Read(plainTextBytes, 0, plainTextBytes.Length);
        return Encoding.UTF8.GetString(plainTextBytes, 0, decryptedByteCount);
      }
    }