-1

HMAC ダイジェスト生成に C++ を使用するシステムと Jva を使用するシステムの 2 つのシステムを統合しようとしています。

以下は C++ コードです:-

static const GUID seedGUID = { 0xd6fecf42, 0x2d1e, 0x4db9, { 0xa2, 0x73, 0xeb,
0x34, 0x13, 0xe, 0xa1, 0x37 } };
shaCheckSum.AddData((char*)&seedGUID, sizeof(seedGUID));
shaCheckSum.AddData((char*)szSeed, uiSeedLen);
shaCheckSum.AddData((char*)szStr, uiStrLen);
shaCheckSum.FinalDigest(szResult);

生成される HMAC は 9B2D06D314018A5134EA1CF54D5A9F20CECC473965BD9801AAC9D4868EF39D38 です。

szSeed は 0.4726005982213448 です szStr は test@test.com です

以下は Java コードです:-

    final String HMAC_SHA1_ALGORITHM = "HmacSha256";
    final String secret = "D6FECF42-2D1E-4db9-A273-EB34130EA137";
    final SecretKeySpec signingKey = new SecretKeySpec(secret.toLowerCase().getBytes(),HMAC_SHA1_ALGORITHM);
    final Mac mac = Mac.getInstance(HMAC_SHA1_ALGORITHM);
    mac.init(signingKey);
    mac.update("0.4726005982213448".getBytes());
    mac.update("test@test.com".getBytes());
    final byte[] rawHmac = mac.doFinal();
    for (final byte element : rawHmac)
    {
       result += Integer.toString((element & 0xff) + 0x100, 16).substring(1);
    }
    System.out.println( result);

結果の HMAC は f91b07623fea970b5f9d1f5d83f850b3a6077c0e80f42b574a01d861143eac09 です。

両方の HMAC が異なります。

この問題はどのように解決できますか?

ご覧いただきありがとうございます。

4

2 に答える 2

3

C++ バージョンではバイトを渡しますがseedGUID、Java バージョンでは GUID の文字列表現のバイナリ エンコーディングを渡します。Java バージョンでバイト配列を作成する必要があります。

byte[] signingKey = new byte[]{ 0xd6, 0xfe, 0xcf, 0x42, 0x2d, 0x1e, 0x4d, 0xb9, 0xa2, 0x73, 0xeb, 0x34, 0x13, 0xe, 0xa1, 0x37 };
mac.init(signingKey);

また、暗号化する文字列に同じエンコーディングを使用していることを確認する必要があります。C++ バージョンはおそらく ASCII 文字を使用しているため、データの文字セットを指定する必要があります。

mac.update("0.4726005982213448".getBytes("US-ASCII"));
mac.update("test@test.com".getBytes("US-ASCII"));
于 2012-09-27T20:05:47.197 に答える
1

Lee が書いたことに加えて、C++ バージョンではHMACをまったく使用していないと思います。SHA- を使用しているように見えますか? FinalDigest()メッセージダイジェストを直接保護します(メソッド呼び出しで示唆されているように)。SHA-256 はHMAC 計算の一部ですが、SHA-256 を実行するだけでは同じ結果が得られません。

于 2012-09-27T22:20:04.590 に答える