Crypto.PublicKey RSA按键关闭一个?

时间:2014-07-06 23:23:30

标签: python cryptography rsa

我正在尝试使用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'))

1 个答案:

答案 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处有一些看似相关的信息。