2

暗号化アルゴリズムに関する情報を使用して、C# で MAC-CBC 生成メソッドを実装する必要があります。ここに私が持っているものがあります:

  • DES を使用する必要があります。
  • 鍵はbyte[] {11, 11, 11, 11, 11, 11, 11, 11}
  • データ (16 バイト) は、8 バイトの部分で暗号化する必要があります。Instance Vector = new byte[8]最初の 8 バイトは(値が 0 の 8 バイト) を使用して暗号化されます。(CBC?)
  • 暗号化された値の最後の 8 バイトを 16 進文字列に変換する必要があります。これは私が送信する必要がある結果です。

この情報を使用して、次の方法を実装しました。

public static string Encrypt(byte[] data)
{
    var IV = new byte[8];
    var key = new byte[] { 11, 11, 11, 11, 11, 11, 11, 11 };
    var result = new byte[16];

    // Create DES and encrypt.
    var des = DES.Create();
    des.Key = key;
    des.IV = IV;
    des.Padding = PaddingMode.None;
    des.Mode = CipherMode.CBC;
    ICryptoTransform cryptoTransform = des.CreateEncryptor(key, IV);
    cryptoTransform.TransformBlock(data, 0, 16, result, 0);

    // Get the last eight bytes of the encrypted data.
    var lastEightBytes = new byte[8];
    Array.Copy(result, 8, lastEightBytes, 0, 8);

    // Convert to hex.
    var hexResult = string.Empty;
    foreach (byte ascii in lastEightBytes)
    {
        int n = (int)ascii;
        hexResult += n.ToString("X").PadLeft(2, '0');
    }

    return hexResult;
}

彼らが私に提供したサンプルの生データは次のとおりです。input=byte[] {0, 6, 4, 1, 6, 4, 1, 7, E, E, F, F, F, F, B, B)これは value: の出力を返すはずですA7CBFB3C730B059C。これは、暗号化されたデータの最後の 8 バイトが次のようになることを意味しますbyte[] {167, 203, 251, 60, 115, 11, 05, 156}

残念ながら、上記の方法を使用すると、次のようになります32D91200D0007632。つまり、暗号化されたデータが正しくありません。(私のメソッドが生成した暗号化された値の最後の 8 バイトは ですbyte[] {50, 207, 18, 0, 208, 0, 118, 50})。

A7CB に到達するために何をすべきかを知る方法はありますか? 私は何か間違ったことをしていますか?

4

2 に答える 2

4

CBC-MAC にはゼロの初期化ベクトルが必要です。IV を明示的に指定する方がはるかに優れています。

var IV = new byte[] { 0, 0, 0, 0, 0, 0, 0, 0 };  

あなたのキーはbyte[] { 11, 11, 11, 11, 11, 11, 11, 11 }、これらのバイトが16進または10進数であると言いますか?あなたは試してみたいかもしれません:

var key = new byte[] { 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11 };

そして、それがよりうまく機能するかどうかを確認してください。

于 2011-10-03T10:21:19.760 に答える
2

Monoプロジェクトには、MACTripleDESを実装するためだけに内部的に使用されている場合でも、任意のSymmetricAlgorithmで動作する汎用 MAC-CBC 実装があります。

MIT.X11 ライセンスのソース コードは、こちら にあります。そのまま使用するか独自のコードと比較してください。

于 2011-10-03T13:49:04.703 に答える