12

私はJavaで書かれた次のコードを持っています

Mac mac = Mac.getInstance("HmacSHA1");
String secretKey ="sKey";
String content ="Hello";

byte[] secretKeyBArr = secretKey.getBytes();    
byte[] contentBArr = content.getBytes();

SecretKeySpec secret_key = new SecretKeySpec(secretKeyBArr,"HmacSHA1");
byte[] secretKeySpecArr = secret_key.getEncoded();

mac.init(secret_key);

byte[] final = mac.doFinal(contentBArr);

C#で同じ例を作りたいです。だから、私は次のコードを書いた

HMACSHA1 hmacsha1 = new HMACSHA1();
string secretKey = "sKey";
string content = "Hello";

byte[] secretKeyBArr = Encoding.UTF8.GetBytes(secretKey);
byte[] contentBArr = Encoding.UTF8.GetBytes(content);

hmacsha1.Key = secretKeyBArr;
byte[] final = hmacsha1.ComputeHash(contentBArr);

最終結果は等しくありません。secretKeyBArr と contentBArr はバイト配列で、値は両方の例で同じです。不明なのは、mac.init() に渡される SecretKeySpec です。では、C# で同等の同じクラスとは何ですか?

4

2 に答える 2

1

結果は同じですが、Javaは符号付きバイトを使用しますが、C#はデフォルトで符号なしバイトを使用します。

さらに、SecretKeySpecそれ自体は通常、基になるデータを変更しません。たとえば、DESキーの指定をに入れSecretKeyFactoryて、パリティビットが正しく設定されていることを確認する必要があります(結果としてSecretKey)。したがって、クラス自体はデータをラップする以外はほとんど何もしないので、同等のものは必要ありません。

于 2012-12-11T22:20:26.960 に答える