1

16バイトの暗号化されたデータがあり、問題を解読したいのは、私のルーチンが最初の8バイトのみを解読し、バイト9で例外Bad Dataをスローすることです。私のデータには正確に16バイトのデータが埋め込まれていません。

    public byte[] Decrypt(byte[] data)
    {
        List<byte> resData = new List<byte>();
        try
        {
            DESCryptoServiceProvider cryptoProvider = new DESCryptoServiceProvider();


            byte[] bytes = StringToByteArray(_key);
            MemoryStream memoryStream = new MemoryStream(data);
            CryptoStream cryptoStream = new CryptoStream(memoryStream, cryptoProvider.CreateDecryptor(bytes, new byte[8]), CryptoStreamMode.Read);
            cryptoProvider.Padding = PaddingMode.None;
            cryptoProvider.Mode = CipherMode.ECB;
            BinaryReader reader = new BinaryReader(cryptoStream);
            for (int i = 0; i < data.Length; i++)
            {
                resData.Add(reader.ReadByte());
            }


        }
        catch { }
        return resData.ToArray();
    }
4

1 に答える 1

4
  1. cryptoProviderクリプターを作成する前にプロパティを設定する必要があります

  2. これらすべてのストリーム フープをジャンプする必要はありません。呼び出すだけです。TransformFinalBlock

  3. あなたの暗号は非常に弱いです。DES のキー空間は非常に小さく、力ずくで破ることができます。

コードの改良版は次のようになります。

byte[] bytes = StringToByteArray(_key);

using(DESCryptoServiceProvider cryptoProvider = new DESCryptoServiceProvider())
{
    cryptoProvider.Padding = PaddingMode.None;
    cryptoProvider.Mode = CipherMode.ECB;

    using(var crypter =  cryptoProvider.CreateDecryptor(bytes, new byte[8]))
    {
        return crypter.TransformFinalBlock(bytes, 0, bytes.Length);
    }
}
于 2013-10-28T09:03:38.803 に答える