1

I'm using this function to Encrypt/Decrypt data using AES because it looked simple and clean (googl'ed code)

public static string Encrypt(string toEncrypt)
    {
        byte[] keyArray = UTF8Encoding.UTF8.GetBytes("3a8114db34d5623d4fd1ee0fb0ga7a73"); // 256-AES key
        byte[] toEncryptArray = UTF8Encoding.UTF8.GetBytes(toEncrypt);
        RijndaelManaged rDel = new RijndaelManaged();
        rDel.Key = keyArray;
        rDel.Mode = CipherMode.CBC;
        rDel.Padding = PaddingMode.PKCS7; // better lang support
        ICryptoTransform cTransform = rDel.CreateEncryptor();
        byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
        return Convert.ToBase64String(resultArray, 0, resultArray.Length);
    }
    public static string Decrypt(string toDecrypt)
    {
        byte[] keyArray = UTF8Encoding.UTF8.GetBytes("3a8114db34d5623d4fd1ee0fb0ga7a73"); // AES-256 key
        byte[] toEncryptArray = Convert.FromBase64String(toDecrypt);
        RijndaelManaged rDel = new RijndaelManaged();
        rDel.Key = keyArray;
        rDel.Mode = CipherMode.CBC;
        rDel.Padding = PaddingMode.PKCS7; // better lang support
        ICryptoTransform cTransform = rDel.CreateDecryptor();
        byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
        return UTF8Encoding.UTF8.GetString(resultArray);
    }

I'm trying to encrypt the data "test garbage" and thats what i receive back:

YfhyS3GE/liPCaXR0cMHfQ==

However, I tried the same key/phrase on a lot of online-aes encrypt/decrypt and all of them are returning

U2FsdGVkX184u0/vPgA/B0rxofp5Iuqm7hfn4+QZAhg=

Can anyone actually tell me whats wrong?

4

2 に答える 2

1

まず、コードに関するいくつかの問題。どうやらGoogleは常に最高のコードを一番上に返すとは限りません。

  • ばかげているUTF8エンコーディングを介してキーを取得しています。これにより、非常に弱いキーが生成されます。
 // 256-AES key
 byte[] keyArray = UTF8Encoding.UTF8.GetBytes("3a8114db34d5623d4fd1ee0fb0ga7a73");
  • CBCモードを使用していますが、IVが(明示的に)設定されていません。

次に、いくつかのオンラインAES暗号化/復号化サービスと比較すると、違いがわかります。それは、おそらく(うまくいけば)動作が異なるためです。

ここで重要なのは、2つのメソッドが一致し、データをラウンドトリップできることです。ただし、適切な暗号化では、キーとIVを取得するために別の方法を使用します。

異なる(より短い)長さの暗号化データが表示される理由は正確にはわかりませんが、キーの長さ、パディングモードなどの設定のリスト全体に依存します。

于 2013-01-11T15:04:57.717 に答える
1

「3a8114db34d5623d4fd1ee0fb0ga7a73」は、16進数でエンコードされた128ビットのキーであり、utf8でエンコードされた256ビットのキーではありません。

とはいえ、シンプルでクリーンなことは必ずしも正しいことを意味するわけではありません。たとえば、使用しているコードはランダムなIVを使用していますが、ワイヤー形式に含まれていないため、暗号化したものを復号化することはできません。

AESを使用して認証された暗号化を使用する、最新の状態に保ち、レビューしたカットアンドペーストスタイルの単純なコードサンプルがあります。

文字列の対称認証付き暗号化の最新の例。C#

于 2013-01-11T15:06:28.077 に答える