0

私のサーバーは Python でコーディングされており、このサーバー用の Java クライアントを作成しています。

以下を使用してメッセージ(データ)に署名しています:

public static byte[] Sign(PrivateKey privateKey, byte[] data) throws Exception{
        System.out.println("Signing the key inside RSACrypto#Sign");
        Signature dsa = Signature.getInstance("SHA1withRSA");

        SecureRandom secureRandom =null;
        dsa.initSign(privateKey,secureRandom);
        dsa.update(data);
        return dsa.sign();
}

これは byteArray(signed_data という名前) を返します。今度は Base64.encodeBase64 を使用してこの署名をエンコードし、次を使用して byteArray(my_byte_array という名前) を文字列に変換します。

String str = new String(my_byte_array)

この文字列をサーバーに送信します。

サーバー側では、この文字列を受け取り、サーバーは次を使用して署名を検証します。

publicKey.verify(str(data), (long(base64.b64decode(my_byte_array)),))

ライブラリhttp://gdata-python-client.googlecode.com/hg/pydocs/gdata.Crypto.PublicKey.RSA.htmlを使用

my_byte_array を両側に印刷しようとすると、それらは同じであり、signed_data と base64.b64decode(my_byte_array) も同じです

しかし、私はこのエラーが発生しています:

ValueError: invalid literal for long() with base 10: '\x8b\xa1\xbb\x19fO\xea\xe7\xa4B\xd4\xd2\xa1\xe3\xb9\xd0\x89n\xa2\xfe\xb5\xedsL\x02\xba\xad\x12!qjp\x0c%+Z\t\xa7\x12\x08\x90\xfaTk\xca\xd0\xae\xd8\xa9\xfa\xbb]>9\x1c\x80\xd0

私が考える限り、このエラーは、Java がメッセージをバイトに署名し、Python がそれが Long であることを期待しているため発生しています。

この問題を解決する方法はありますか?

4

1 に答える 1

1

実際には2つの問題があります。

1 つ目は、Java 暗号化アーキテクチャ APIによると、SHA1withRSAアルゴリズムには PKCS#1 v1.5 パディングが含まれていることです。Python 側では、同じパディング スキームを使用して署名を検証する必要があります。これは、PyCrypto の PKCS#1 v1.5 署名モジュール ( Crypto.Signature.PKCS1_v1_5 ) で実現できます。

2番目の問題はあなたが指摘したものですverify.RSA PyCryptoオブジェクトのメソッドでは、奇妙なことに、署名を整数としてエンコードする必要があります。しかし、前述のモジュールを使用すると、バイト文字列を受け入れるため、問題はなくなります。

于 2012-07-01T15:37:44.240 に答える