0

我一直在使用加密/解密 RijndaelManaged 算法。

在加密 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 字符串中给出无效字符

4

1 回答 1

1

%究竟来自哪里?它不应该是Encrypt方法返回值的一部分。

我的猜测是你有一些东西在你的加密文本上执行 URL 编码。如果你能告诉我们更多关于 % 在哪里以及你是如何得到那个字符串的,那会很有帮助。

(顺便说一句,您应该using对所有流等使用语句,而不是显式关闭它们;您的 try/catch 也有些毫无意义。不过,这些都是附带问题。)

于 2009-07-16T12:57:22.040 回答