【问题标题】:Create compatible Java "RSA" signature using a PKCS#8 encoded private key如何在python中制作PKCS8 RSA签名
【发布时间】:2012-08-07 08:47:19
【问题描述】:

我有 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;
}

【问题讨论】:

    标签: java python encryption openssl rsa


    【解决方案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)
    

    【讨论】:

      【解决方案2】:

      PKCS#8 定义了一种编码和传输密钥的方法,它并不特定于 OpenSSL; PKCS#1 定义了一种使用 RSA 密钥(无论它是如何加载到您的应用程序中,无论是否使用 PKCS#8)对数据执行和验证数字签名的方法。

      你的这段代码做了三件事:

      1. 它将 Base64 解码为 PKCS#8
      2. 它将 PKCS#8 解码为内存中的实际密钥(请注意,您可能需要在此处提供密码)
      3. 它使用 SHA-1 使用所述密钥执行 PKCS#1 v1.5 签名
      4. 它使用 Base64 对签名进行编码

      example for PKCS#1 v1.5 signing in the API of PyCrypto 完全执行第 2 步和第 3 步。

      【讨论】:

      • @guilin PKCS#1 v1.5 不是随机的,因此您使用 SHA-1 散列的 binary 数据很可能是不同的。我会检查文本编码。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-31
      • 1970-01-01
      • 2018-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多