3

あるアプリケーションで接続文字列を暗号化し、別のアプリケーションで復号化する必要があるという要件があります。これを念頭に置いて、公開鍵と秘密鍵をそれぞれアプリケーションの App.Config に保存します。

さて、RSA は、私が使用しているのと同じ鍵で同じ暗号化文字列を私に与えるべきではありませんか?

同じキーを使用して、常に異なる暗号化文字列を取得します.!! 混乱を解消するのを手伝ってください。この問題を解決する方法がわかりません。保存された暗号化された文字列を使用すると、暗号化によって異なる暗号化された文字列が返されるたびにBAD Data例外が発生します。

これが私のコードです:

private string connecString;
private RSACryptoServiceProvider rsaEncryptDecrypt;

public EncryptAndDecrypt(string connecString)
{
    this.connecString = connecString;
    this.rsaEncryptDecrypt = new RSACryptoServiceProvider(4096);
}

public string EncryptTheConnecString(string publicKeyValue)
{
    byte[] encryptedData;
    rsaEncryptDecrypt.FromXmlString(publicKeyValue);

    byte[] message = Encoding.UTF8.GetBytes(connecString);
    encryptedData = rsaEncryptDecrypt.Encrypt(message, false);

    return Convert.ToBase64String(encryptedData);
}

public string DecryptTheConnecString(string privateKeyValue, string encrystr)
{
    byte[] decryptedData;
    rsaEncryptDecrypt.FromXmlString(privateKeyValue);

    byte[] message = Convert.FromBase64String(encrystr);
    decryptedData = rsaEncryptDecrypt.Decrypt(message, false);

    return Encoding.UTF8.GetString((decryptedData));
}

前もって感謝します。

更新1: 使用しました

UnicodeEncoding ByteConverter = new UnicodeEncoding();
ByteConverter.GetBytes("data to encrypt");
//Which is not Connection string but a small test str

それでも、暗号化されたデータが毎回変化していることがわかります。 しかしBad Dataエラーは見られなくなりました。それでも、接続文字列のような巨大な文字列を暗号化できず、例外をスローするため、Encoding.UTF8ではなくUTF16(UnicodeEncoding)を使用できません。

 CryptographicException: Key not valid for use in specified state.

更新 2:

UTF8Encoding ByteConverter = new UTF8Encoding();使用してから実行することで、不良データの問題を解決できましたByteConverter .GetString("HUGE STRING");

4

2 に答える 2

6

ランダムパディングが原因で発生する可能性があります。

于 2012-02-29T04:41:29.880 に答える
2

一般に、質問に対する答えは「はい」です。同じパラメーターが指定されている場合、常に同じ結果が得られるはずです。

これらの問題に取り組む最善の方法は、可能な限りベスト プラクティス コードに近づけることです。現在、フレームワーク ドキュメントで提案されているものとは少し異なる暗号プロバイダーを使用しています。以下を参照してください。

static public byte[] RSAEncrypt(byte[] DataToEncrypt, RSAParameters RSAKeyInfo, bool DoOAEPPadding)
{
    byte[] encryptedData;
    //Create a new instance of RSACryptoServiceProvider.
    using (RSACryptoServiceProvider RSA = new RSACryptoServiceProvider())
    {

        //Import the RSA Key information. This only needs
        //toinclude the public key information.
        RSA.ImportParameters(RSAKeyInfo);

        //Encrypt the passed byte array and specify OAEP padding.  
        //OAEP padding is only available on Microsoft Windows XP or
        //later.  
        encryptedData = RSA.Encrypt(DataToEncrypt, DoOAEPPadding);
    }
    return encryptedData;
}

これは公式の MSDN ドキュメントからの抜粋です:
http://msdn.microsoft.com/en-us/library/system.security.cryptography.rsacryptoserviceprovider.aspx

最初にベスト プラクティスを試して採用してから、この問題が引き続き発生するかどうかを確認してください。

于 2012-02-28T15:29:51.387 に答える