我目前正在尝试编写一个脚本,该脚本允许我从隐藏服务的私钥文件中计算Tor HS地址。为此,需要将文件转换为DER格式。
使用OpenSSL可以通过以下方式完成此操作:
openssl rsa -in private_key -pubout -outform DER使用以下命令将其通过管道传输到python:
base64.b32encode(hashlib.sha1(sys.stdin.read()[22:]).digest()[:10]).lower()'将正确返回地址。
然而,我想只使用python来执行相同的操作。我的问题是,使用pycrypto模块,DER的输出是不同的,因此地址是不正确的。
key = RSA.importKey(keyfile.read()).publickey()
print(key.exportKey(format='DER'))将导致与openssl调用不同的输出。这仅仅是一个允许不同结果的实现问题吗?还是我在什么地方搞错了?
任何帮助都将不胜感激
发布于 2016-07-22 13:13:23
使用python将证书转换为der
首先,我们加载文件
cert_file = keyfile.read()然后我们将其转换为pem格式。
from OpenSSL import crypto
cert_pem = crypto.load_certificate(crypto.FILETYPE_PEM, cert_file)现在我们正在生成der-output
即:output equals to openssl x509 -outform der -in certificate.pem -out certificate.der.
cert_der = crypto.dump_certificate(crypto.FILETYPE_ASN1, cert_pem)发布于 2019-03-01 21:29:29
我一直在寻找类似的东西,到2019年3月,OpenSSL建议使用pyca/cryptography而不是crypto模块。(source)
下面是您想要做的:将PEM转换为DER
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import serialization
with open("id_rsa", "rb") as keyfile:
# Load the PEM format key
pemkey = serialization.load_pem_private_key(
keyfile.read(),
None,
default_backend()
)
# Serialize it to DER format
derkey = pemkey.private_bytes(
serialization.Encoding.DER,
serialization.PrivateFormat.TraditionalOpenSSL,
serialization.NoEncryption()
)
# And write the DER format to a file
with open("key.der", "wb") as outfile:
outfile.write(derkey)发布于 2020-06-02 19:20:19
我想转换证书文件,而不是从DER到PEM的密钥文件,但谷歌把我带到这里。感谢@alleen1的回答,我可以将证书或密钥从DER转换为PEM,反之亦然。
第一步,加载文件。
Step two,将其保存为您想要的格式。
我省略了获取"pem_data“和"der_data”的过程,您可以从文件或其他任何地方获取它。它们应该是字节而不是字符串,需要时使用方法.encode()。
from cryptography import x509
from cryptography.hazmat.primitives import serialization
from cryptography.hazmat.backends import default_backend
# Step one, load the file.
# Load key file
# PEM
key = serialization.load_pem_private_key(pem_data, None, default_backend())
# DER
key = serialization.load_pem_private_key(der_data, None, default_backend())
# Load cert file
# PEM
cert = x509.load_pem_x509_certificate(pem_data, default_backend())
# DER
cert = x509.load_der_x509_certificate(der_data, default_backend())
# Step two,save it to the format you want.
# PEM key
key_val = key.private_bytes(
serialization.Encoding.PEM,
serialization.PrivateFormat.TraditionalOpenSSL,
serialization.NoEncryption()
)
# DER key
key_val = key.private_bytes(
serialization.Encoding.DER,
serialization.PrivateFormat.TraditionalOpenSSL,
serialization.NoEncryption()
)
# PEM cert
cert_val = cert.public_bytes(serialization.Encoding.PEM)
# DER cert
cert_val = cert.public_bytes(serialization.Encoding.DER)https://stackoverflow.com/questions/35978211
复制相似问题