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 に答える