ValueError: зашифрованный текст с неверной длиной - PullRequest
1 голос
/ 25 октября 2019

У меня есть проблема, которая гласит: «Предположим, что ваши коэффициенты открытого ключа RSA равны p = 6323 и q = 2833, а открытый показатель e равен 31. Предположим, вам был отправлен Ciphertext 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, но я не слишком уверен. Заранее спасибо за помощь!

Ответы [ 2 ]

1 голос
/ 25 октября 2019

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

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

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

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

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

, где:

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

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

0 голосов
/ 27 октября 2019

Этот код должен вам помочь:

p = 6323
q = 2833 
n = p * q
d = 13861087
e = 31

c = 6627708

plaintext = pow(c, d, n)

Это самый простой способ расшифровки вашего сообщения, см. Страница RSA Википедии о том, как это работает.

Также см. Ответ @rassars, который должен помочь.

@ Dylaloo, проблема в том, что один из FIPS или RFC (я не могу вспомнить, какой из них связан с исходным кодом RSA pycryptodome (который оказывается чистым питоном)) который следует за буквой. Смотрите мой ответ о том, как расшифровать ваш зашифрованный текст

...