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, с помощью гибридного шифрования.