提取公钥长度(位数)

3 投票
2 回答
2954 浏览
提问于 2025-04-17 20:00

我的目标是写一个Python脚本,连接到一个主机上,然后像使用openssl那样,确定服务器公钥的长度(以位为单位)。

(openssl s_client -connect 10.18.254.29:443)
yada yada yada
Server certificate
-----BEGIN CERTIFICATE-----
-----END CERTIFICATE-----
Server public key is 2048 bit

我已经开始写这个基本的脚本:

from M2Crypto import SSL, RSA
SSL.Connection.clientPostConnectionCheck = None
ctx = SSL.Context()
conn = SSL.Connection(ctx)
conn.connect(('1.1.1.1', 443))
cert = conn.get_peer_cert()
print cert.get_issuer().as_text()

print cert.get_subject().as_text()
print cert.get_fingerprint()

print cert.get_pubkey().get_rsa().as_pem()

但是我找不到办法来显示这个密钥的长度属性。有没有什么想法?

2 个回答

2

根据@abarnert的帮助,我把我的代码改成了下面这样:

from M2Crypto import SSL, RSA

SSL.Connection.clientPostConnectionCheck = None
ctx = SSL.Context()
conn = SSL.Connection(ctx)
conn.connect(('10.18.254.29', 443))
cert = conn.get_peer_cert()

print cert.get_issuer().as_text()

print cert.get_subject().as_text()
print cert.get_fingerprint()

**def size(self):
    """
    Return the size of the key in bytes.
    """
    return m2.pkey_size(self.pkey)**

打印 cert.get_pubkey().size()*8

2

一般来说,方法是这样的:

print key.size()

根据文档PKey的大小是以字节为单位,而不是位。所以,如果你想得到“2048”,你需要把它乘以8。

如果你知道这是RSA,并且已经调用了get_rsa(),你可以这样做:

print len(rsa)

文档没有说明这个做了什么,但它返回的是以位为单位的长度。

像往常一样,使用M2Crypto时,你真正需要关注的是libssl/libcrypto的文档(而不是openssl命令行工具)。如果你无法猜测调用了哪些C函数,源代码通常是非常简单的。

例如,你可以看到PKey.size()是:

def size(self):
    """
    Return the size of the key in bytes.
    """
    return m2.pkey_size(self.pkey)

RSA.__len__是:

def __len__(self):
    return m2.rsa_size(self.rsa) << 3

根据M2Crypto的标准编码约定,m2.rsa_size是对RSA_size的SWIG封装。

撰写回答