我一直在使用加密/解密RijndaelManaged alogorithm。
在加密GUID时,我们在加密算法的中间得到“%”符号。当我解密相同的加密GUI时,我得到“Base-64字符串中的无效字符”错误。这是由于加密令牌中存在%符号而发生的。
以下是加密和解密的代码,
using System;
using System.Configuration;
using System.IO;
using System.Security.Cryptography;
public class ABC_RMCryptography
{
public string Decrypt(string strValueIn)
{
try
{
byte[] arrB = System.Convert.FromBase64String(strValueIn);
string strRC;
byte[] key = System.Convert.FromBase64String(ConfigurationManager.AppSettings["TokenEncryptionKey"]);
byte[] IV = System.Convert.FromBase64String(ConfigurationManager.AppSettings["TokenEncryptionVector"]);
MemoryStream memStream = new MemoryStream(arrB);
RijndaelManaged RMCrypto = new RijndaelManaged();
CryptoStream CryptStream = new CryptoStream(memStream, RMCrypto.CreateDecryptor(key, IV), CryptoStreamMode.Read);
StreamReader SReader = new StreamReader(CryptStream);
strRC = SReader.ReadToEnd();
SReader.Close();
return strRC;
}
catch (Exception ex)
{
throw ex;
}
}
public string Encrypt(string strValue)
{
MemoryStream memStream = new MemoryStream();
try
{
byte[] key = System.Convert.FromBase64String(ConfigurationManager.AppSettings["TokenEncryptionKey"]);
byte[] IV = System.Convert.FromBase64String(ConfigurationManager.AppSettings["TokenEncryptionVector"]);
RijndaelManaged RMCrypto = new RijndaelManaged();
CryptoStream CryptStream = new CryptoStream(memStream, RMCrypto.CreateEncryptor(key, IV), CryptoStreamMode.Write);
StreamWriter SWriter = new StreamWriter(CryptStream);
SWriter.Write(strValue);
SWriter.Close();
CryptStream.Close();
byte[] b = memStream.ToArray();
return Convert.ToBase64String(b);
}
catch (Exception ex)
{
throw ex;
}
}
private string GenerateRMKey()
{
RijndaelManaged objRM = new RijndaelManaged();
objRM.GenerateKey();
return Convert.ToBase64String(objRM.Key);
}
private string GenerateRMIV()
{
RijndaelManaged objRM = new RijndaelManaged();
objRM.GenerateKey();
return Convert.ToBase64String(objRM.IV);
}
}
请让我知道避免此异常的解决方案。如何避免%符号?
加密/解密在Base-64字符串中提供无效字符
答案 0 :(得分:1)
完全的来自%?它不应该是Encrypt
方法的返回值的一部分。
我的猜测就是您在加密文本上执行了网址编码。如果你能告诉我们更多关于%是什么以及你是如何得到这个字符串的话,那将会有很大的帮助。
(顺便说一句,你应该对所有的流等使用using
语句,而不是明确地关闭它们;你的try / catch也有点无意义。但这些都是副作用。)