1

rsa_private_key.pemファイルからopensslによって生成されるpkcs8_rsa_private_keyファイルがあります。

Pythonの秘密鍵で署名する必要があります。以下のJavaコードで同じ署名を作成してください。

public static final String SIGN_ALGORITHMS = "SHA1WithRSA";

public static String sign(String content, String privateKey) {
    String charset = "utf-8";
    try {
        PKCS8EncodedKeySpec priPKCS8 = new PKCS8EncodedKeySpec(
                Base64.decode(privateKey));
        KeyFactory keyf = KeyFactory.getInstance("RSA");
        PrivateKey priKey = keyf.generatePrivate(priPKCS8);

        java.security.Signature signature = java.security.Signature
                .getInstance(SIGN_ALGORITHMS);

        signature.initSign(priKey);
        signature.update(content.getBytes(charset));

        byte[] signed = signature.sign();

        return Base64.encode(signed);
    } catch (Exception e) {
        e.printStackTrace();
    }

    return null;
}
4

2 に答える 2

1

PKCS#8は、秘密鍵をエンコードおよび転送する方法を定義しており、OpenSSLに固有のものではありません。PKCS#1は、RSAキーを使用して(PKCS#8を使用するかどうかに関係なく、アプリケーションにどのようにロードされたかに関係なく)データのデジタル署名を実行および検証する方法を定義します。

あなたが持っているコードは3つのことをします:

  1. Base64をPKCS#8にデコードします
  2. PKCS#8をメモリ内の実際のキーにデコードします(ここでパスフレーズを提供する必要がある場合があります)
  3. 上記のキーを使用してSHA-1を使用してPKCS#1v1.5署名を実行します
  4. Base64で署名をエンコードします

PyCryptoのAPIでのPKCS#1 v1.5サインインの例は、ステップ#2と#3を正確に実行します。

于 2012-08-10T06:23:24.100 に答える
0
from Crypto.Signature import PKCS1_v1_5 as pk
from Crypto.Hash import SHA
class Crypt(object):
    pkcs8_private_key = RSA.importKey(open('pkcs8_rsa_private_key.pem', 'r').read())
    def rsa_sign(cls, des_reqdata):
        """
            @:param reqdata: request reqData
        """
        h = SHA.new(des_reqdata)
        signer = pk.new(cls.pkcs8_private_key)
        signature = signer.sign(h)

        return base64.b64encode(signature)
于 2015-07-17T06:39:32.830 に答える