我正在尝试编写一个加密程序,它将对用户的输入进行编码-如果这是一个单词-字符串。加密方法只是椭圆曲线加密的基本用法,我目前正在做程序的加密部分,在我做数学,逆模块等工作之前。公钥和私钥计算需要。目前,我使用的是密钥pub = 5和91的max值(从两个随机素数的乘积得到)。这就是所有需要的信息,我正在测试加密的单词是“快乐”。
到目前为止,这里是代码。
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值乘以它本身来加密每个字母,然后在添加1然后除以m的过程之后使用chr()函数重新连接字符串,从而创建一个新词。然后,使用这个新字符串,将它设置为循环中下一个周期的word的值,这样这个过程就会继续下去,直到它完成了发布次数并加密了单词。我在这方面有很多困难,我不知道从哪里开始解释这些问题。我对Python比较陌生,任何关于快速完成这项工作的建议和/或建议都将非常感谢。提前谢谢你。
发布于 2015-01-29 21:14:43
首先,检查你的数学是否正确。您的公式(z**2 + 1)/m呈二次增长。我对crypto的理解相当有限,但对我来说它看起来并不正确。它应该是某种从输入到输出的一对一映射。但是它将几个相邻的字符映射到相同的输出。而且,每一轮的结果都会增长。
您只能将整数转换回ascii字符,最大范围为256。这就是您的错误消息所说的。它可能是在外部for循环的第二次迭代中抛出的。您可能需要再次将值范围减小到256。我想你遗漏了你正在尝试实现的算法的一个关键部分,也许是一些模运算。
还有一些次要的python提示:
您可以使用内置的power运算符**,因此您不必对ord()进行两次计算。
((ord(z) ** 2) + 1) / m 您可以在一个步骤中转换回字符串,如下所示:
output = ''.join([str(chr(i)) for i in a])https://stackoverflow.com/questions/28214909
复制相似问题