Cómo hacer una firma PKCS8 RSA en Python

Tengo el archivo pkcs8_rsa_private_key que se genera por openssl desde un archivo rsa_private_key.pem.

Necesito hacer una firma con la clave privada en Python, hacer la misma firma con el código Java a continuación.

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 define una forma de codificar y transportar claves secretas y no es específico de OpenSSL; PKCS # 1 define una forma de usar una clave RSA (sin importar cómo se cargó en su aplicación, con PKCS # 8 o no) para llevar a cabo y verificar la firma digital en los datos.

El trozo de código que tienes hace tres cosas:

  1. Decodifica Base64 en PKCS # 8
  2. Decodifica PKCS # 8 en la clave real en la memoria (recuerde que es posible que deba proporcionar una frase de contraseña aquí)
  3. Realiza la firma PKCS # 1 v1.5 usando SHA-1 usando dicha clave
  4. Codifica la firma en Base64.

El ejemplo para PKCS # 1 v1.5 que firma en la API de PyCrypto hace exactamente los pasos # 2 y # 3.

 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)