Python加密程序(ECC)

时间:2015-01-29 12:34:40

标签: python encryption

我试图编写一个加密程序来编码用户的输入 - 如果这是一个单词 - 字符串。加密方法只是椭圆曲线加密的一个基本用法,我目前正在研究程序的加密部分,在我处理数学,逆模块等之前。等等。公钥和私钥计算都需要。目前,我正在使用pub = 5的密钥max91值(来自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相对较新,任何有关完成此快速的建议和/或建议都将非常感激。提前谢谢。

1 个答案:

答案 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])