3

私はプライベート/パブリックの安全な証明書を持っています。私のJavaの対応物は公開鍵を持っています。文字列を取得して署名し、Javaに送信して、データと署名を検証する必要があります。

Microsoftやその他の国々がデータをエンコード/署名する方法には、バイトの処理方法に関するよく知られた問題があるようです。それはとてもよく知られているので、私は解決策を見つけることができません。彼らが私の文字列と秘密鍵を受け取った場合、彼らは明らかにそれを正しく署名し、それを検証することができます。文字列を取得すると、.Net内で署名して確認できます。私はASN1からMicrosoftのフォーマット(私はP1363だと思います)に変換するための多くの方法を見てきましたが、Microsoft、C#からJava用のASN1に変換することはしませんでした。リバースエンジニアリングの方法を理解するのに十分なほど何が起こっているのかわかりません。

http://www.codeproject.com/Articles/25487/Cryptographic-Interoperability-Keysを調べましたが、最終的な結果はJava側が必要とするものではありませんでした。文字列に署名でき、署名を取得できますが、Javaの担当者は、MCで開始する必要があると言っています。最初のバイトは、インジケーターです。私はこれを見ていません。

ありがとう!

4

1 に答える 1

3

解決策が見つかり、私が見た他の例のいくつかのように見えますが、何らかの理由でこれはよりうまく機能します:(私のためにそれを解決した人にちなんで名付けられた方法;)

            private static byte[] Rays(byte[] sigBytes)
            {
                bool highMsbR = (sigBytes[0] & 0x80) != 0;
                bool highMsbS = (sigBytes[20] & 0x80) != 0;  

                MemoryStream stream = new MemoryStream();
                using (BinaryWriter writer = new BinaryWriter(stream))
                {
                    writer.Write((byte)0x30);
                    int len = 44 + (highMsbR ? 1 : 0) + (highMsbS ? 1 : 0);
                    writer.Write((byte)len);

                    // r
                    writer.Write((byte)0x02);
                    writer.Write((byte)(highMsbR ? 21 : 20));
                    if (highMsbR)
                        writer.Write((byte)0); 
                    for (int i = 0; i < 20; i++)
                        writer.Write(sigBytes[i]); 

                    // s
                    writer.Write((byte)0x02);
                    writer.Write((byte)(highMsbS ? 21 : 20));
                    if (highMsbS)
                        writer.Write((byte)0);
                    for (int i = 20; i < 40; i++)
                        writer.Write(sigBytes[i]);
                }

                byte[] bytes = stream.ToArray();
                return bytes;
            }
于 2013-01-24T15:49:42.403 に答える