我正在尝试使用Crypto.PublicKey.RSA编写一个简单的python方法,该方法返回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'))
答案 0 :(得分: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处有一些看似相关的信息。