初步认识RSA加密

0.缘由

选了一门公选水课,作业是使用RSA加密一串老师提供的字符,老师提供了p,q,e,他自己手上保存了私钥,也就是说,这是一个无法验算的作业。没办法,看来不能糊弄过去了。。。
而且结合最近的形势,密码学正变得越来越重要,学习一下总不会吃亏。

1.原理

原理这里就不详细说明了,贴一张李永乐老师的板书初步认识RSA加密
原视频为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——

跑了很多次为发现错误,暂且就认为程序运行得比较好吧

上一篇:「LibreOJ β Round」ZQC 的手办


下一篇:C++ Primer(第五版)|练习题答案与解析(第十八章:用于大型程序的工具)