4

BigIntegerJava を使用して単純な暗号化アルゴリズムのキーとしてバイト配列を生成するパートナーとの統合に取り組んでいます。運が悪くても、同等の .NET コードを見つけようとしています。

彼らが使用しているJavaコードは次のとおりです。

String keyString = "48B734DA47388C656913C9BF5146E186";
byte key[] = new BigInteger(keyString, 16).toByteArray();

byte次の配列が得られます。

[72, -73, 52, -38, 71, 56, -116, 101, 105, 19, -55, -65, 81, 70, -31, -122]

byte.NET の s は 0 ~ 255 の範囲であり、負の値は範囲外であるため、これだけでも厄介です。

私が思いついた最も近い .NET コードは次のとおりです。

string keyString = "48B734DA47388C656913C9BF5146E186";
byte[] key = BigInteger.Parse(keyString, NumberStyles.HexNumber).ToByteArray();

byte次の配列が得られます。

[134, 225, 70, 81, 191, 201, 19, 105, 101, 140, 56, 71, 218, 52, 183, 72]

この時点で、特に負の値のため、.NET に相当するものは単に不可能だと考えていbyteます。

みんなの考えを楽しみにしています。

4

3 に答える 3

7

コメントで提供されているLINQメソッドI4Vを使用すると、簡単に解決できます。

  sbyte[] key = BigInteger.Parse(keyString, NumberStyles.HexNumber).ToByteArray().Reverse().Select(x => (sbyte)x).ToArray();

これにより、必要な配列が得られます。.NET はデフォルトで符号なしバイトを使用しますが、Java はデフォルトで符号付きバイトを使用します。それらは同じビット表現を持っているため、何をしているかによっては、どちらを使用しても実際には問題にならない場合がありますが、.NET で本当に同等の出力が必要な場合は、代わりに sbytes を使用する必要があります。単純に byte を使用すると、2 つの言語間で異なる意味になるためです。

于 2013-05-28T17:47:26.020 に答える
2

.Net の結果は Java の結果と逆になっているように見えますが、同じ値です。ただし、.Netバイトは署名されているJavaバイトではなく、署名されていません(気づいたようにネガが含まれています)。取得した結果を符号付きバイト (sbyte) に変換するだけで、順序を逆にすることもできます。

sbyte[] finalResult = (sbyte[])(Array)key.Reverse().ToArray();

結果: [72, -73, 52, -38, 71, 56, -116, 101, 105, 19, -55, -65, 81, 70, -31, -122]

ビット表現は同じになることに注意してください。そのため、暗号化のキーとして使用し、ビットレベルで操作する場合、実際の署名付きバイト (sbyte) を取得する必要はないかもしれませんが、そうすれば、Java から .Net への変換を視覚化するのが容易になるでしょう。

于 2013-05-28T17:45:26.833 に答える