1

我有 pkcs8_rsa_private_key 文件,它由 openssl 从 rsa_private_key.pem 文件生成。

我需要用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)来执行和验证数据数字签名的方法。

您拥有的这段代码做了三件事:

  1. 它将 Base64 解码为 PKCS#8
  2. 它将 PKCS#8 解码为内存中的实际密钥(请注意,您可能需要在此处提供密码)
  3. 它使用 SHA-1 使用所述密钥执行 PKCS#1 v1.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 回答