我试图编写一个加密程序来编码用户的输入 - 如果这是一个单词 - 字符串。加密方法只是椭圆曲线加密的一个基本用法,我目前正在研究程序的加密部分,在我处理数学,逆模块等之前。等等。公钥和私钥计算都需要。目前,我正在使用pub = 5
的密钥max
和91
值(来自2个随机素数的乘积)。这是所需的所有信息,我正在测试加密的字样是“快乐”。
到目前为止,这是代码。
word = 'happy'
pub = 5
m = 91
for i in range(pub):
if i == 0:
word = word
else:
word = output
for x in word:
a = [(((ord(z)*ord(z))+1)/m) for z in word]
b = [chr(i) for i in a]
c = [str(i) for i in b]
d = ''.join([str(i) for i in c])
output = d
我要做的是通过将每个字母所属的ASCII值相加来加密每个字母,然后在添加chr()
然后除以之后使用1
函数重新加入字符串m
,从而创造了一个新词。然后,使用该新字符串,将其设置为循环中下一个循环的word
值,因此该过程将继续,直到它完成了pub次数并加密了该单词。我在这方面遇到了很多困难,我不知道从哪里开始解释这些问题。我对Python相对较新,任何有关完成此快速的建议和/或建议都将非常感激。提前谢谢。
答案 0 :(得分:0)
首先,检查你的数学是否正确。你的公式(z ** 2 + 1)/ m以二次方式增长。我对加密的理解非常有限,但对我来说并不合适。它应该是从输入到输出的某种一对一映射。但它将几个相邻的字符映射到相同的输出。此外,结果每一轮都会增长。
您只能将整数转换回ascii字符,范围最多为256.这就是您的错误消息所说的内容。它可以在你的外部for循环的第二次迭代中抛出。 您可能需要再次将值范围降低到256。 我想你错过了你想要实现的算法的一个关键部分,也许是一些模运算。
还有一些小的python提示:
您可以使用内置电源操作器**,因此您不必两次评估ord()。
((ord(z) ** 2) + 1) / m
您可以像这样一步完成转换回字符串:
output = ''.join([str(chr(i)) for i in a])