1

以下のメソッドを呼び出して Windows アプリケーションから文字列を復号化すると、「パディングが無効であり、削除できません」というエラーが表示されます。文字列は、asp.net アプリケーションから暗号化されました。両方のアプリケーションが同じアセンブリを参照しています。asp.netアプリケーションから問題なく暗号化および復号化できます。これは、暗号化と復号化を行うメイン コードです。

    private static byte[] EncryptHelper(byte[] arrData, string Password, bool Encrypt)
    {
        //Create the SymetricAlgorithem object
        SymmetricAlgorithm myAlg = new RijndaelManaged();

        //define a salt value to derive the key.
        byte[] salt = System.Text.Encoding.ASCII.GetBytes("hjkhj877ffasah");

        //Instantiate Rfc2898DeriveBytes with the password and salt.
        Rfc2898DeriveBytes key = new Rfc2898DeriveBytes(Password, salt);


        myAlg.Key = key.GetBytes(myAlg.KeySize / 8); 
        myAlg.IV = key.GetBytes(myAlg.BlockSize / 8); 
        myAlg.Padding = PaddingMode.PKCS7;
        //Create the ICryptoTransform Object
        ICryptoTransform encrytptor = Encrypt ? myAlg.CreateEncryptor() : myAlg.CreateDecryptor();

        //Create Memorystream to write the encrypted data
        using (MemoryStream aStream = new MemoryStream())
        {

            //Create the CryptoStream Ojbect using the aStream object
            using (CryptoStream encryptStream = new CryptoStream(aStream, encrytptor, CryptoStreamMode.Write))
            {
                //Write the contents to crypto stream
                encryptStream.Write(arrData, 0, arrData.Length);

                //Flush the cryptostream
                encryptStream.FlushFinalBlock();

                //Reposition the memorystream to write the contents to an array.
                aStream.Position = 0;

            }
            aStream.Flush();
            //Convert to an array and return
            return aStream.ToArray();

        }
    }

これは、プレーンテキストをバイト配列との間で変換するために使用する方法です

    private static byte[] GetBytes(string str)
    {
        byte[] bytes = new byte[str.Length * sizeof(char)];
        System.Buffer.BlockCopy(str.ToCharArray(), 0, bytes, 0, bytes.Length);
        return bytes;
    }

    private static string GetString(byte[] bytes)
    {
        char[] chars = new char[bytes.Length / sizeof(char)];
        System.Buffer.BlockCopy(bytes, 0, chars, 0, bytes.Length);
        return new string(chars);
    }

暗号テキストをデータベースに永続化するには、Convert.ToBase64String() と Convert.FromBase64String を使用します。Rfc2898DeriveBytes クラスの使用方法に問題がありますか?

4

1 に答える 1

2

セキュリティの観点から言うと、同じパスワードを持つすべてのメッセージに対して同じ IV を使用することになります。予測可能な IV は非常に大きな問題です。

その時点以降、何が問題なのかを確認するためにこれ以上見たくありません.stackoverflowには本当に悪いカットアンドペーストC#暗号化がたくさんあり、更新のメカニズムがなく、誰も見ていません.もう一度カットアンドペーストする人を除いて、それらをもう一度。

文字列の対称認証暗号化の最新の例を見てください。c# .

私はそれを最新の状態に保ち、レビューするようにしています。

于 2013-01-11T15:43:28.147 に答える