Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在python中生成PKCS8 RSA签名_Java_Python_Encryption_Openssl_Rsa - Fatal编程技术网

Java 如何在python中生成PKCS8 RSA签名

Java 如何在python中生成PKCS8 RSA签名,java,python,encryption,openssl,rsa,Java,Python,Encryption,Openssl,Rsa,我有pkcs8_rsa_private_密钥文件,它是由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"

我有pkcs8_rsa_private_密钥文件,它是由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;
}
PKCS#8定义了一种编码和传输密钥的方法,它不是OpenSSL特有的;PKCS#1定义了一种使用RSA密钥(无论它是如何加载到应用程序中的,PKCS#8与否)对数据执行和验证数字签名的方法

您拥有的代码有三件事:

  • 它将Base64解码为PKCS#8
  • 它将PKCS#8解码为内存中的实际密钥(请注意,您可能需要在此处提供密码短语)
  • 它使用所述密钥使用SHA-1执行PKCS#1 v1.5签名
  • 它将签名编码为Base64
  • 第二步和第三步是完全一样的。

    @guilin PKCS#1 v1.5不是随机化的,所以您用SHA-1散列的二进制数据很可能是不同的。我会检查文本编码。
    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)