Python шифрования RSA не работает с небольшими простыми числами

Я реализовал код шифрования и дешифрования RSA, который работает для значений p,q,d = 61,53,17, Я взял эти значения, как они упоминаются в Википедии. Я полагаю, что p и q должны быть простыми, а d выбрано таким, чтобы d и phi (n) были относительно простыми.

Если я изменю значения на p,q,d = 3,17,19моя расшифровка не работает. Можете ли вы помочь мне с этим? Вот мой код:

#!/usr/bin/python3
# -*- coding: utf-8 -*-

def main():
    str = 'computer'
    p,q,d = 61,53,17
    #p,q,d = 3,17,19
    cipher_text = list()
    plain_text = list()

    for c in str:
        cipher_char = EncryptCharRSA(c, p, q ,d)
        cipher_text.append(cipher_char)


    for x in cipher_text:
        plain_char = DecryptCharRSA(x, p, q, d)    
        plain_text.append(plain_char)

    print ('Original Message: ', str)

    print ('Encrypted Message(UTF-8 Unicode characters) : ', end='')
    for element in cipher_text:
        print(element,end = '')

    print ('\nDecrypted Message: ', end='')
    for element in plain_text:
        print(element,end='')

def EncryptCharRSA(msg , p, q, d):
    n = p * q
    phi = (p-1) * (q-1)            
    cipher_no = 0
    cipher_char = ''

    for c in msg:
        # conver char to ascii for calculation
        cipher_no = (ord(c)** d) % n
        cipher_char = chr(cipher_no) 
        return cipher_char   
        #print (cipher_no)
        #plain_no = (cipher_no ** d) % n

def DecryptCharRSA(msg,p, q,d):
    n = p * q
    phi = (p-1) * (q-1)
    e = ModularMultiplicativeInverse(d,phi)
    for c in msg:
        plain_no = (ord(c) ** e) % n
        plain_char = chr(plain_no)
        return plain_char   

# Get modular multiplicative inverse
def ModularMultiplicativeInverse(d,n):
    i = 1
    while True:
        if (d * i) % n == 1:
         return i
        i = i + 1

if __name__ == '__main__' : main()

1 ответ

Решение

Что ты называешь d на самом деле e публичный показатель и то, что вы называете e на самом деле d частный показатель.

Если оставить в стороне, ваша проблема в том, что вы шифруете кодовые точки в виде открытого текста, которые больше или равны n, Если они есть, то вы на самом деле не шифруете ord("A") (=65), а точнее ord("A") % n, Для маленьких n как в вашем случае это приведет к невосстановимому зашифрованному тексту:

>>> n = 3 * 17 # 51
>>> ord("A")
65
>>> ord("A") % n
14

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

Другие вопросы по тегам