0.缘由
选了一门公选水课,作业是使用RSA加密一串老师提供的字符,老师提供了p,q,e,他自己手上保存了私钥,也就是说,这是一个无法验算的作业。没办法,看来不能糊弄过去了。。。
而且结合最近的形势,密码学正变得越来越重要,学习一下总不会吃亏。
1.原理
原理这里就不详细说明了,贴一张李永乐老师的板书
原视频为av26639065
2.加密
人学会了就可以开始教机器了。因为老师已经提供了p,q,e,因此不需要我们自己找了,明文也有了,可以直接进行加密。
def RSA_encode(Ming_Wen, n, e): # 明文使用公钥加密
m = Ming_Wen
return m ** e % n
然后直接调用就可以了
if __name__ == "__main__":
str_miwen = #明文
p = 7
q = 17
e = 13
Mi_Wen1 = RSA_encode(str_miwen[0], p * q, e)
Mi_Wen2 = RSA_encode(str_miwen[1], p * q, e)
print("密文是 {},{}".format(Mi_Wen1, Mi_Wen2))
答案是算出来了,但是怎么知道我算得对不对呢?私钥在老师手上,我无法将密文直接解密回明文来验证其正确性
那么就没办法了,学习就学全套的吧
3.密钥生成
def key_design(q, p): # 公私密钥生成
n = q * p
fn = (q-1) * (p-1)
while(1): # 随机选取e
e = random.randint(2, fn)
if gcd(fn, e):
break
while(1): # 随机选取d
d = random.randint(2, 20 * e)
if (e * d) % fn == 1:
break
return n, e, d
说实话,对于d的选取我还不太了解,好像是有个什么10倍的规则?
按你胃,反正只是一个验算的步骤,大不了以后再修改
gcd是判断是否互质的函数,代码如下
def gcd(a, b): # 判断是否互质,是则返回True
if b == 0:
return False
elif a == 1 or b == 1:
return True
else:
return gcd(b, a % b)
4.解密
def RSA_decode(Mi_Wen, n, d):
c = Mi_Wen
return c ** d % n
很简单,不多讲
5.验算
——snip——
if __name__ == "__main__":
print("此处为验算:")
p = 7
q = 17
print("p = {}, q = {}".format(p, q))
n, e, d = key_design(p, q)
print("n = {}, e = {}, d = {}\n明文为 23,66".format(n, e, d))
Mi_Wen1 = RSA_encode(23, p * q, e)
Mi_Wen2 = RSA_encode(66, p * q, e)
print("加密得 %d,%d" % (Mi_Wen1, Mi_Wen2))
Ming_Wen1 = RSA_decode(Mi_Wen1, n, d)
Ming_Wen2 = RSA_decode(Mi_Wen2, n, d)
print("解密得 {},{}".format(Ming_Wen1, Ming_Wen2))
if Ming_Wen1 != 23 or Ming_Wen2 != 66:
print("程序出错!中止加密")
exit(0)
else:
print("验算成功,下面进行加密:")
——snip——
跑了很多次为发现错误,暂且就认为程序运行得比较好吧