第十二课 欧几里得和RSA算法

python数据结构与算法基础 第十二课

tags:

  • python
  • 路飞学院

categories:

  • python
  • 欧几里得
  • RSA算法

第一节 欧几里得算法

1. 欧几里得算法的介绍

  1. 约数:如果整数a能被整数b整除,那么a叫做b的倍数,b叫做a的约数。
  2. 给定两个整数a,b,两个数的所有公共约数中的最大值即为最大公约数(Greatest Common Divisor, GCD)。例: 12与16的最大公约数是4
  3. 如何计算两个数的最大公约数:
    1. 欧几里得:辗转相除法(欧几里得算法)
    2. 《九章算术》:更相减损术
    3. 这两个本质一样的
  4. 欧几里得算法: gcd(a, b) = gcd(b, a mod b) a mod b 是a除b的余数
    1. 例: gcd(60, 21) = gcd(21, 18) = gcd(18, 3)= gcd(3, 0)= 3
# 递归写法
# 这是一个伪递归,和循环效率一样
def gcd(a, b):
    if b == 0:
        return a
    else:
        return gcd(b, a % b)


def gcd_no_rec(a, b):
    while b > 0:
        r = a % b
        a = b
        b = r
    return a

print(gcd(12, 16))
print(gcd_no_rec(12, 16))

2. 欧几里得算法应用

  1. 利用欧几里得算法实现一个分数类,支持分数的四则运算。
class Fraction:
    def __init__(self, a, b):
        self.a = a
        self.b = b
        x = self.gcd_no_rec(a, b)
        self.a /= x
        self.b /= x

    @classmethod
    def gcd_no_rec(cls, a, b):
        # 最大公约数
        while b > 0:
            r = a % b
            a = b
            b = r
        return a

    @classmethod
    def zgs(cls, a, b):
        # 最小公倍数
        x = cls.gcd_no_rec(a, b)
        return a * b / x

    def __str__(self):
        return "%d/%d" % (self.a, self.b)

    # 运算符重载函数__add__
    def __add__(self, other):
        # 3/5 + 2/7
        a = self.a
        b = self.b
        c = other.a
        d = other.b
        # 算出最小公倍数
        denom = self.zgs(b, d) # 分母
        molecule = a * (denom / b) + c * (denom / d) # 分子
        return Fraction(molecule, denom)


f = Fraction(30, 16)
print(f)
a = Fraction(1, 3)
b = Fraction(1, 2)
print(a+b)

第二节 RSA加密算法

1. RSA加密算法介绍

  1. 传统密码:加密算法是秘密的
  2. 现代密码系统:加密算法是公开的,密钥是秘密的
    • 对称加密
    • 非对称加密
  3. RSA非对称加密系统:
    • 公钥:用来加密,是公开的
    • 私钥:用来解密,是私有的
  4. 在密码学中,我们认知的设定的密码叫做口令

2. RSA加密算法加密过程

  1. 随机选取两个质数p和q
  2. 计算n=pq
  3. 选取一个与φ(n)互质的小奇数e,φ(n)=(p-1)(q-1)
  4. 对模φ(n),计算e的乘法逆元d(数学上有很多方法可以求,这里我们不做详解),即满足(e*d) mod φ(n) = 1
  5. 公钥(e, n), 私钥(d, n)
  6. 加密过程:C=(m^e)modn
  7. 解密过程: m = (c^d) mod n
发布了61 篇原创文章 · 获赞 8 · 访问量 2829

猜你喜欢

转载自blog.csdn.net/aa18855953229/article/details/103759372