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