4

暗号化/ハッシュについてはほとんど知りません。

暗号化キーをハッシュする必要があります。Javaでの例はこのようなものです...

String encryptionKey = "test";

    MessageDigest messageDigest = MessageDigest.getInstance("MD5");
    messageDigest.update(encryptionKey.getBytes("UTF-8"), 0, encryptionKey.length());
    byte[] encryptionKeyBytes = messageDigest.digest();

間違っている場合は訂正してください。ただし、上記のコードは文字列を MD5 アルゴリズムでハッシュします。

そして、C# で同じ文字列をハッシュすると、同じ結果が得られます。

私の現在のC#コードは次のようになります...

string encryptionKey = "test";

        var md5 = MD5.Create();
        var keyBytes = Encoding.UTF8.GetBytes(encryptionKey);
        byte[] encryptionKeyBytes = md5.ComputeHash(keyBytes);

しかし、エンドバイトの結果が一致しません。

Javaは...

[0] 9   
[1] -113    
[2] 107 
[3] -51 
[4] 70  
[5] 33  
[6] -45 
[7] 115 
[8] -54 
[9] -34 
[10]    78  
[11]    -125    
[12]    38  
[13]    39  
[14]    -76 
[15]    -10 

C# は...

    [0] 9   byte
    [1] 143 byte
    [2] 107 byte
    [3] 205 byte
    [4] 70  byte
    [5] 33  byte
    [6] 211 byte
    [7] 115 byte
    [8] 202 byte
    [9] 222 byte
    [10]    78  byte
    [11]    131 byte
    [12]    38  byte
    [13]    39  byte
    [14]    180 byte
    [15]    246 byte

Java コードと同じ結果を得るには C# コードが必要です (その逆ではありません)。何かアイデアはありますか?

ありがとうございました。

4

1 に答える 1

11

実際、結果同じです。他の整数型と同様に、バイト値は符号付きまたは符号なしとして解釈される場合があります。たとえば、符号なしと解釈された場合は (2 番目の C# 値)10001111に対応します。ただし、 ( 2 の補数を使用して)署名143されていると解釈される場合、その値は(2 番目の Java 値) になります。-113

したがって、値が Java では符号付きとしてフォーマットされているが、C# では符号なしとしてフォーマットされていることが原因であると思われます。C# で符号付きバイトを取得する場合は、次を使用できます。

sbyte[] encryptionKeyBytesSigned = 
    encryptionKeyBytes.Select(b => (sbyte)b).ToArray();

ただし、これは単に値を表示するときにのみ発生するフォーマットの問題ではないことに注意してください。ファイルに保存すると、両方の結果が同じになります。

于 2012-06-14T18:21:03.860 に答える