Crypto.PublicKey RSA 密钥尺寸偏差一位?

3 投票
1 回答
724 浏览
提问于 2025-04-18 12:18

我正在尝试写一个简单的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 上有一些看起来相关的信息。

撰写回答