数学之美介绍的 公开密钥算法

# -*- 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)
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值