Криптография.Размер ключа PublicKey RSA уменьшен на единицу?

#python #cryptography #rsa

#python #криптография #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:

Я не уверен, что это _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.

Комментарии:

1. Простите меня, я новичок: ( — по той ссылке, которую вы опубликовали: с заполнением, выполняемым RSA, не будет ли максимальное количество битов, которые могут быть обработаны, меньше размера ключа-1? Есть ли более простой способ получить размер ключа в python, кроме системного вызова cli openssl или использования другой сторонней библиотеки?

2. Просто используйте key.size() 1 . Как я уже сказал, исходный код pycrypto явно вычитает единицу в size() функции, но в других местах он добавляет 1 (в _RSAobj.__repr__() , например).