【问题标题】:How to add a custom RSA key pair to a .pem file如何将自定义 RSA 密钥对添加到 .pem 文件
【发布时间】:2022-01-25 00:12:31
【问题描述】:

我创建了一个自定义 RSA 密钥对,只是为了在 python 中进行测试。我想将私钥和公钥添加到 .pem 文件中,但我在研究中没有找到任何东西。我发现的只是人们从库中生成 RSA 密钥对。 我有公钥 [e, n] 和私钥 [d, n] 的 e、d 和 n 变量。

【问题讨论】:

    标签: python encryption cryptography rsa


    【解决方案1】:

    大多数主要的加密库都支持这一点,例如PyCryptodome(通过construct()exportKey())或密码学(如NumbersKey Serialization 部分所述),例如

    PyCryptodome:

    from Crypto.PublicKey import RSA
    
    n = int("b83b...529b", 16);
    d = int("4eea...a721", 16);
    e = int("010001", 16);
    
    privateKey = RSA.construct((n, e, d))
    privateKeyPem = privateKey.exportKey(pkcs=8) # export in PKCS#8 format
    
    publicKey = RSA.construct((n, e))
    publicKeyPem = publicKey.exportKey() # export in X.509/SPKI format
    
    print(privateKeyPem.decode('utf8'))
    print(publicKeyPem.decode('utf8'))
    

    或密码学:

    from cryptography.hazmat.primitives.asymmetric import rsa
    from cryptography.hazmat.primitives import serialization
    
    n = int("b83b...529b", 16);
    d = int("4eea...a721", 16);
    e = int("010001", 16);
    
    (q, p) = rsa.rsa_recover_prime_factors(n, e, d)
    dmq1 = rsa.rsa_crt_dmq1(d, q)
    dmp1 = rsa.rsa_crt_dmp1(d, p)
    iqmp = rsa.rsa_crt_iqmp(p, q)
    
    publicNumbers = rsa.RSAPublicNumbers(e, n)
    privateNumbers = rsa.RSAPrivateNumbers(p, q, d, dmp1, dmq1, iqmp, publicNumbers)
    
    privateKey = privateNumbers.private_key();
    publicKey = publicNumbers.public_key();
    
    privateKeyPem = privateKey.private_bytes(
       encoding=serialization.Encoding.PEM,
       format=serialization.PrivateFormat.PKCS8,
       encryption_algorithm=serialization.NoEncryption()
    )
    
    publicKeyPem = publicKey.public_bytes(
       encoding=serialization.Encoding.PEM,
       format=serialization.PublicFormat.SubjectPublicKeyInfo
    )
    
    print(privateKeyPem.decode('utf8'))
    print(publicKeyPem.decode('utf8'))
    

    请注意,原始密钥在 p 和 q 中是对称的,因此交换 p 和 q 会更改 PEM 或 DER 编码的密钥,但不会更改原始密钥 (n, e, d)。

    【讨论】:

      猜你喜欢
      • 2012-09-05
      • 2011-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多