场景
人物:卧底余罪、警长老许、毒枭老傅
事件:老许安排余罪潜伏到老傅的身边
RSA是什么?
RSA是一种非对称加密算法,是目前最好的加密方法。非对称加密又叫公钥加密,也就是说成对的密钥,其中一个是对外公开的,所有人都可以获得,称为公钥,而与之相对应的称为私钥,只有这对密钥的生成者才能拥有。这是警局成立初期一直在延用的一个加密算法。
RSA能干啥
余罪发现老傅近期有一次毒品贩卖活动,需要将信息汇报给老许,让其安排抓捕行动。为了防止信息被窃听,需要使用RSA对信息进行加密。
RSA加密规则
在卧底行动以前,警局需要制作本次行动的RSA秘钥,一个公钥,一个私钥。根据RSA的规范,分以下几步进行生成
- 随机选择两个不相等的质数p和q。 老许选了 17 和 11,既p=17, q=11;
- 计算两个数的乘积n。既n = 17x11 = 187;
- 计算n的欧拉函数φ(n)。φ(n) = (p-1)x(q-1) = (17-1)x(11-1) = 160;
- 选择一个整数e,条件是1< e < φ(n),且e与φ(n) 互质。老许就在1到160之间选择了37;
- 到此公钥已经生成,既(n, e) = (187, 37)。下面生成私钥;
- 计算e对于φ(n)的模反元素d(模反元素存在,当且仅当e与φ(n)互质)。根据模反元素的计算公式,既解下面的二元一次方程,ed+φ(n) n=1,既。
37d+160n = 1;
我是通过下面的python脚步计算出的,方法比较局限。如果有更好的解二元一次方程的方法欢迎留言。
大概思路:
第一步:37d+160n = 1,既37d-1=-160n。
第二步:假设d为正整数,d落在[0, 100]区间内。
第三步:将区间内的每一个整数依次赋予d,判断37乘d 加1 或 减1 余160 是否为0。如果余0,根据当前d就可以求出一组[d, n]的整数解。
第四步:如果[0, 100]区间内没有找到结果,可以扩大区间,重复第三步。
def jisuan(a, b):
d=0
while(d<100):
d+=1
if((a*i-1)%b==0 or (a*i+1)%b==0):
print d
- 二元一次方程可能会有很多个整数解,这里选择了求出的第一组整数解(d, n) = (13, -3)
- 至此公钥和私钥都已生成。公钥(n, e)= (187, 37)。私钥(n, d) = (187,13)
- 私钥会留在老许的手里,其他人谁又不知道。公钥会给到余罪用于发送情报
RSA怎么用
余罪要向老许发送情报k,首先要用公钥对k进行加密。这里需要注意,k必须是整数(字符串可以取ascii值、unicode值),且k必须小于n。
所谓"加密",也就是根据以下公式计算出密文
密文= k 的 e次方 模 n
根据计算公式,这是python的实现
miwen=pow(k, e, n)
最后将密文发送给老许,老许收到后使用私钥进行解密,操作和加密类似
明文= miwen 的 e次方 模 n
根据计算公式,这是python的实现
k=pow(miwen, d, n)
可以看出如果没有私钥d ,即使得到了miwen,也是无法解析的。