Crypto.PublicKey RSA 密钥尺寸偏差一位?
我正在尝试写一个简单的Python方法,使用Crypto.PublicKey.RSA来返回RSA公钥的大小,但返回的数字总是比我预期的少1。
比如,我给它一个1024位的密钥,结果从size()函数得到的数字是1023。我给它一个768位的密钥,得到的数字是767。
我这里漏掉了什么呢?
下面是代码的结果:我本来期待返回1024,但结果是1023
POC Python2代码:
#!/usr/bin/python2
from Crypto.PublicKey import RSA
from base64 import b64decode
def computeRSAStrength(pubkey,verbose=None):
"""Compute and return RSA key strength given a public key"""
#TODO: add base64 validation on pubkey
#Format key and use python crypto libs to determine key strength
keyDER = b64decode(pubkey)
try:
#IMPORTANT PART
keyPub = RSA.importKey(keyDER)
keySize = int(keyPub.size()) #+ 1 ??? WHY DOES THIS RETURN (expected - 1) ???
#END IMPORTANT PART
except ValueError, e:
if verbose:
print 'ValueError Exception: {}'.format(e)
keySize = 0
# ALTERNATE METHOD?: use import os and make a syscall to openssl
if verbose:
print ' - Key in PEM format:'
print keyPub.exportKey('PEM')
return keySize
if __name__ == '__main__':
print 'I would expect this to read 1024: '+str(computeRSAStrength('MIGfMA0GCSqGSIb3DQEBA'+
'QUAA4GNADCBiQKBgQDLM0fpK/rhklYDRJSBQ6bSyZKjQxTeEnZywzodwGAjAste2aOQzXJyZmZrjHZ'+
'0JL6Gy/e351n1P0Yo0cVE4nEQ7WD9jo0cqVEmkf1SInnhN1FGX/pOTjrjh7QU398YFxks/rqnX6C1q'+
'doeu7B4wwRhNEHUjlaH79afYqOtk0ta0wIDAQAB'))
1 个回答
2
我不太确定 _RSAobj.size()
是否指的是密钥的实际大小。这有点模糊,但关于 size() 的文档是这么说的:
size(self)
Tell the maximum number of bits that can be handled by this key.
Returns:
int
Overrides: pubkey.pubkey.size
(inherited documentation)
我不太确定,但它可能实际上表示的是加密操作可以处理的最大明文位数(虽然你可以加密最多 128 字节/1024 位的明文)。代码明确地从模数的位数中减去了一位,所以可以安全地在 size()
的基础上加一,以得到模数的大小。
在 https://security.stackexchange.com/q/44702 上有一些看起来相关的信息。