# -*- coding:utf-8 -*- __author__ = 'qinwenchao' """ http://www.cnblogs.com/KevinYang/archive/2009/02/archive/2009/02/archive/2009/02/archive/2009/02/archive/2009/02/archive/2009/02/01/1381806.html 公开密钥的原理其实很简单,我们以给上面的单词 Caesar 加解密来说明它的原理。我们先把它变成一组数,比如它的 Ascii 代码 X=099097101115097114(每三位代表一个字母)做明码。现在我们来设计一个密码系统,对这个明码加密。 1,找两个很大的素数(质数)P 和 Q,越大越好,比如 100 位长的, 然后计算它们的乘积 N=P×Q,M=(P-1)×(Q-1)。 2,找一个和 M 互素的整数 E,也就是说 M 和 E 除了 1 以外没有公约数。 3,找一个整数 D,使得 E×D 除以 M 余 1,即 E×D mod M = 1。 现在,世界上先进的、最常用的密码系统就设计好了,其中 E 是公钥谁都可以用来加密,D 是私钥用于解密,一定要自己保存好。乘积 N 是公开的,即使敌人知道了也没关系。 现在,我们用下面的公式对 X 加密,得到密码 Y。 pow(X,E)modN =Y 好了,现在没有密钥 D,神仙也无法从 Y 中恢复 X。如果知道 D,根据费尔马小定理,则只要按下面的公式就可以轻而易举地从 Y 中得到 X。 pow(Y,D)modN=X """ P = 421 Q = 431 N = P * Q M = (P - 1) * (Q - 1) E = 11 D = 82091 def encode(x): return pow(x, E) % N def decode(y): return pow(y, D) % N def findD(): D = -1 for x in range(1, 10000000): if ((E * x) % M == 1): D = x break return D if __name__ == '__main__': word = u"公开密钥 By QWC" print word initial_str = map(ord, word.encode("utf-8")) # or initial = list(bytearray(word, "utf-8")) print initial_str encoded_str = list() [encoded_str.append(encode(x)) for x in initial_str] print encoded_str decode_str = list() [decode_str.append(decode(y)) for y in encoded_str] print decode_str www = map(chr, decode_str) print "".join(www)
数学之美介绍的 公开密钥算法
最新推荐文章于 2024-04-14 02:18:32 发布