#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__()
, например).