(对于学校)我试图做一个简单的RSA加密,将字符串加密成三个字母块。我可以更改什么来让数学处理字符串而不仅仅是整数?
import math
message = str(input("Enter Plaintext: "))
p = 521
q = 757
e = 11
n = p*q
def encrypt(me):
en = math.pow(me, e)
c = en % n
print("Encrypted Message is: ", c)
return c
print("Original Message is: ", message)
c = encrypt(message)Enter Plaintext: zallaboardty
Original Message is: zallaboardtyline 18, in <module>
c = encrypt(message)
line 11, in encrypt
en = math.pow(me, e)
TypeError: must be real number, not str
Process finished with exit code 1发布于 2022-10-17 16:02:25
教科书RSA中的消息大小取决于模块的大小。所以你有一个模数n,是521x757。这允许log_2(521x757)/3=每字符6.19位。因此,每个字符只能占用6位,即在[0..2^6) =[0.64]字符范围内。ASCII是每个字符7位,所以这有点烦人,因为我们不能直接使用它。
让我们简单一点,用小数表示。我们可以计算出n为521x757= 394397。这意味着我们可以通过连接三个两位数来构造n以下的一个数字,只要它低于394397。如果我们使用39或以下的数字,这将总是有效的。我们现在可以创建最多40个字符的字母表(因为我们可以包含零)。
让我们为包含ABC的28个字符的字母表定义一个字母SPACE=0、A=1...Z=26和DOT=27。太好了,所以现在我们只需要先把一条消息转换成索引,上面写着:"HELLO“。可分为"HEL“、"LO”、"WOR“和”LD“。取H="08",E="05“en L=12,所以我们得到的数字是" 080512”或080512。很好,您现在有了一个可以由RSA处理的数字。请注意,这些数字必须用零填充,才能使此方案工作。
现在小数点使用的是基数10。你也可以使用基数2^6 (记住上面每个字符的~6.19位),然后用二进制来创建一个数字。然而,对于初学者来说,更容易混淆小数和字符串。
https://stackoverflow.com/questions/74092611
复制相似问题