Python Crypto RSA, шифр длиной 127 байт с ключом 1024 бит

Когда я тестировал шифрование RSA на своем ноутбуке с помощью PyCrypto (Archlinux, package: python-crypto / python2-crypto), я использовал ключ 1024, сгенерированный модулем RSA для шифрования случайных данных, и получился шифр длиной 127 байт.

Простой код следующий: (Я получил значения при отладке)

from Crypto.PublicKey import RSA
pubkey = b'-----BEGIN PUBLIC KEY-----\nMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDq+qbaMTZtPH3LuXLrAn37YGzc\ngrL7ieTILtkXTl5PIozJUQZ06bQXr/uS+FtvYNSvaT53ZpSyKmVmWtoX7lFzA6FW\nsILFTgFUDNRnPIQv1rQb16wi694rKPRe1uIr8/hthXtTec8b2aJovizQOlkXY0Pq\nZohNGofi02xlUD8KsQIDAQAB\n-----END PUBLIC KEY-----'
prikey = b'-----BEGIN RSA PRIVATE KEY-----\nMIICXgIBAAKBgQDq+qbaMTZtPH3LuXLrAn37YGzcgrL7ieTILtkXTl5PIozJUQZ0\n6bQXr/uS+FtvYNSvaT53ZpSyKmVmWtoX7lFzA6FWsILFTgFUDNRnPIQv1rQb16wi\n694rKPRe1uIr8/hthXtTec8b2aJovizQOlkXY0PqZohNGofi02xlUD8KsQIDAQAB\nAoGBAMkKEI0ng8Br+9i8XqTQ6gaTVjBHpmhtbw8SfexhwXCFR9zJ9PM8LDgD+gKh\neGFPgEhfi/FOE7Rnb3/mBShqXsWbqz7STJ05GOxtKo+L1z5K7X4E9WmVjIEVU46I\nhF43LJQvoDjQRbZh2cUMSYUR8+LqJJd6MFdhLJhEIf+LhCbBAkEA71lRBiSwZH/8\nsaUE4qZ/vxkS65czBcWLSCgn+7D/kvunX1hxqi3zTxMn4gyluw3IICzvLFgdDG6f\nUZk23aDcyQJBAPtTgvi4lYAIoeh6Xx8NZxroVNVBlP9BzJTBCcnX1Ym0aC/p+6n8\n7Lu9bkKk/hb0r7Oy76wzxObWv9uvRQNp+qkCQQCoOy8oEkGpYgxLEKIObNj9iLIz\nxWKne+IaJZ902UPKG/fYnGHIK+QIgH5X9GvIvjcb5nl1wbkpM9fnkrltrdOBAkBe\n7LbuHEGTHy+P8BBXWSeVOSU5etC87GxJzvNUginMHhCv8C82kCoV6sFneIvjvb1T\nIQV3RAJdscS7Q+LMHE4pAkEAzp2o8+2+9QJwzkpxGyNjJ7ZECQsZIb7MOH7LYhX0\ncnwffXFt4ttcwbyX2SdhCVPBDkczkJkOzcnEqtjoWt+dBw==\n-----END RSA PRIVATE KEY-----'

pub = RSA.importKey(pubkey)
data = b'\xc9\xc5\xa9\x1b\xc2\x0f\x05\xf0\xe3\xe1W\x9d\x94b\xc6 '
cipher = pub.encrypt(data, 0)[0]
print(len(cipher))

Это напечатает 127 (обычно это 128 для 1024-битного ключа), и я не знаю почему.


person totran    schedule 18.12.2014    source источник
comment
метод encrypt просто подавляет все начальные нулевые байты. Вы можете легко их восстановить, если хотите.   -  person President James K. Polk    schedule 18.12.2014
comment
О, я вижу. Вот почему вместо этого предлагается использовать Crypto.Cipher.PKCS1_OAEP / PKCS1_v1_5. Спасибо ~   -  person totran    schedule 19.12.2014
comment
@GregS Это не совсем решение, так как это оставит вас с небезопасным алгоритмом, хотя totran, похоже, уже нашел его.   -  person Maarten Bodewes    schedule 28.12.2014


Ответы (1)


Вы используете неправильную схему шифрования. Из документации:

Даже если вы можете напрямую использовать методы объекта ключа RSA для выполнения примитивных криптографических операций (например, _RSAobj.encrypt), вместо этого рекомендуется использовать одну из стандартизованных схем (например, Crypto.Cipher.PKCS1_v1_5 или Crypto.Signature.PKCS1_v1_5).

хотя в настоящее время более современные / безопасные Crypto.Cipher.PKCS1_OAEP должны быть предпочтительнее Crypto.Cipher.PKCS1_v1_5.

Если вы используете одну из этих схем, то на выходе всегда будет 128 байтов. Причина этого в том, что PKCS # 1 определяет функцию под названием I2OSP, которая преобразует результат модульного возведения в степень (число, ограниченное модулем / размером ключа) в статическое число октетов, а точнее размер ключа. .

Результатом функции прямого шифрования является то, что называется необработанным или учебным RSA: просто модульное возведение в степень. Это просто вернет число, которое может иметь начальные нулевые биты. Сколько зависит от случая, (в некоторой степени) от значения модуля и от того, используется ли знаковая или беззнаковая кодировка.

person Maarten Bodewes    schedule 28.12.2014
comment
Хорошо, так что вы уже нашли альтернативу, но я думаю, было необходимо несколько дополнительных объяснений, особенно для других читателей :) - person Maarten Bodewes; 28.12.2014