1

このコードを暗号化および復号化しようとしていますが、.FlushFinalBlock().

私はこの問題について自分の要素から外れているため、ここで何が間違っているのかわかりません。

ここで私が間違っていることを誰かに教えてもらえますか? 暗号化は問題ありませんが、暗号化を解読できません。

   static byte[] u8_Salt = new byte[] { 0x26, 0x19, 0x81, 0x4E, 0xA0, 0x6D, 0x95, 0x34, 0x26, 0x75, 0x64, 0x05, 0xF6 };

   public static string Encrypt(string data, string password)
    {
        //
        Rfc2898DeriveBytes pdb = new Rfc2898DeriveBytes(password, u8_Salt);
        //
        Rijndael i_Alg = Rijndael.Create();
        i_Alg.Padding = PaddingMode.None;
        i_Alg.Key = pdb.GetBytes(32);
        i_Alg.IV = pdb.GetBytes(16);
        //
        using (var cryptoProvider = new DESCryptoServiceProvider())
        using (var memoryStream = new MemoryStream())
        using (var cryptoStream = new CryptoStream(memoryStream, cryptoProvider.CreateEncryptor(), CryptoStreamMode.Write))
        using (var writer = new StreamWriter(cryptoStream))
        {
            writer.Write(data);
            writer.Flush();
            cryptoStream.FlushFinalBlock();
            writer.Flush();
            return Convert.ToBase64String(memoryStream.GetBuffer(), 0, (int)memoryStream.Length);
        }
    }
    public static string Decrypt(string data, string password)
    {
        Rfc2898DeriveBytes pdb = new Rfc2898DeriveBytes(password, u8_Salt);
        //
        Rijndael i_Alg = Rijndael.Create();
        i_Alg.Padding = PaddingMode.None;
        i_Alg.Key = pdb.GetBytes(32);
        i_Alg.IV = pdb.GetBytes(16);
        //
        using (var cryptoProvider = new DESCryptoServiceProvider())
        using (var memoryStream = new MemoryStream())
        using (var cryptoStream = new CryptoStream(memoryStream, cryptoProvider.CreateDecryptor(), CryptoStreamMode.Write))
        using (var writer = new StreamWriter(cryptoStream))
        {
            writer.Write(data);
            writer.Flush();
            cryptoStream.FlushFinalBlock();
            writer.Flush();
            return Convert.ToBase64String(memoryStream.GetBuffer(), 0, (int)memoryStream.Length);
        }
    }
4

1 に答える 1

3

コードにはいくつかの問題があります。まず、Rijndael (AES)オブジェクトを作成しています。ただし、を使用しているのDESCryptoServiceProviderは、Rijndael ではなく DES を実際に使用していることを意味します。そのため、アルゴリズムのキーを設定していないという問題もあります。以下は、.NETRijndaelManagedでのアルゴリズムのマネージド実装であるアルゴリズムを使用して書き直された 2 つの関数です。AES私がテストしたところ、問題なく暗号化および復号化できます。また、そのソルト値を使用しないでください。インターネット全体にあります。

static byte[] u8_Salt = new byte[] { 0x26, 0x19, 0x81, 0x4E, 0xA0, 0x6D, 0x95, 0x34, 0x26, 0x75, 0x64, 0x05, 0xF6 };

public static string EncryptString(string plainText, string password)
{
    Rfc2898DeriveBytes pdb = new Rfc2898DeriveBytes(password, u8_Salt);
    using (RijndaelManaged i_Alg = new RijndaelManaged { Key = pdb.GetBytes(32), IV = pdb.GetBytes(16) })
    {
        using (var memoryStream = new MemoryStream())
        using (var cryptoStream = new CryptoStream(memoryStream, i_Alg.CreateEncryptor(), CryptoStreamMode.Write))
        {
            byte[] data = Encoding.UTF8.GetBytes(plainText);
            cryptoStream.Write(data, 0, data.Length);
            cryptoStream.FlushFinalBlock();

            return Convert.ToBase64String(memoryStream.GetBuffer(), 0, (int)memoryStream.Length);
        }
    }
}

public static string Decrypt(string cipherText, string password)
{
    Rfc2898DeriveBytes pdb = new Rfc2898DeriveBytes(password, u8_Salt);

    using (RijndaelManaged i_Alg = new RijndaelManaged { Padding = PaddingMode.Zeros, Key = pdb.GetBytes(32), IV = pdb.GetBytes(16) })
    {
        using (var memoryStream = new MemoryStream())
        {
            using (var cryptoStream = new CryptoStream(memoryStream, i_Alg.CreateDecryptor(), CryptoStreamMode.Write))
            {
                byte[] data = Convert.FromBase64String(cipherText);
                cryptoStream.Write(data, 0, data.Length);
                cryptoStream.Flush();

                return Encoding.UTF8.GetString(memoryStream.ToArray());
            }
        }
    }
}

ランダム ソルトを生成するには、RNGCryptoServiceProviderを使用し ます。これにより、使用できる暗号的に安全なランダム バイト配列が生成されます。別のプロセスで生成し、salt として使用する必要があります。

于 2012-11-03T05:27:12.367 に答える