ValueError: зашифрованный текст неправильной длины

У меня есть проблема, которая гласит: «Предположим, что ваши коэффициенты открытого ключа RSA равны p = 6323 и q = 2833, а открытый показатель степени e равен 31. Предположим, вам был отправлен шифротекст 6627708. Напишите программу, которая принимает вышеуказанные параметры в качестве входных данных. и реализует функцию расшифровки RSA для восстановления открытого текста».

При попытке расшифровать зашифрованный текст я получаю сообщение об ошибке:

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-30-bb484f24f99a> in <module>
----> 1 cipher.decrypt((str(ciphertext)))

/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/Crypto/Cipher/PKCS1_OAEP.py in decrypt(self, ciphertext)
    165         # Step 1b and 1c
    166         if len(ciphertext) != k or k<hLen+2:
--> 167             raise ValueError("Ciphertext with incorrect length.")
    168         # Step 2a (O2SIP)
    169         ct_int = bytes_to_long(ciphertext)

ValueError: Ciphertext with incorrect length.

Мой код в настоящее время выглядит так:

from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_OAEP

n = 17913059
e = 31
p = 6323
q = 2833
d = 13861087
ciphertext = 6627708

key = RSA.construct(rsa_components=(n,e,d,p,q))
cipher = PKCS1_OAEP.new(key)

cipher.decrypt((str(ciphertext)))

Меня больше интересовало, на правильном ли я пути или полностью схожу с рельсов. Я не слишком уверен, как исправить ошибку длины. Я думал, может быть, мне нужно проложить как в AES, но я не слишком уверен. Заранее спасибо за помощь!


person Dylaloo    schedule 24.10.2019    source источник
comment
Почти наверняка ваш открытый текст не дополнен, и я сомневаюсь, что ваш преподаватель хочет или ожидает, что вы будете использовать какую-либо библиотеку RSA.   -  person President James K. Polk    schedule 25.10.2019


Ответы (1)


Если у вас есть c, d и n, вы можете использовать формулу RSA чтобы получить зашифрованный текст:

>>> pow(ciphertext, d, n)
205

Это похоже на неправильно сформированное сообщение (обычно это шестнадцатеричные или ASCII-значения), так что это может быть просто примером проблемы.

Ваша проблема возникает из-за реализации pycryptodome RFC 7.1.2, в котором говорится:

C: зашифрованный текст, подлежащий расшифровке, строка октетов длины k, где k = 2hLen + 2.

куда:

hLen обозначает длину в октетах вывода хеш-функции.

Итак, технически ваш зашифрованный текст слишком короткий, чтобы его можно было расшифровать с помощью RSA.

person rassar    schedule 24.10.2019
comment
Эй, спасибо за помощь. Это простое целое число, которое мы хотим попытаться использовать для расшифровки с помощью RSA. У вас есть идеи об ошибке или о том, как ее исправить? - person Dylaloo; 25.10.2019
comment
@Dylaloo проблема в том, что один из FIPS или RFC (я не могу вспомнить какой), который pycryptodome следует букве. Смотрите мой ответ о том, как расшифровать ваш зашифрованный текст - person Legorooj; 27.10.2019