加密={对称加密,非对称加密}
对称加密的效率高于非对称加密。常用非对称加密算法协商对称加密的密钥,便于用对称加密传输数据。
非对称加密算法有很多种实现算法,RSA是其中一种(三个人姓氏首字母的缩写,其中R和S想算不可逆公式one-way function,数学家A寻公式的不足)。
非对称加密算法步骤:生成密钥对,分发公钥,加密,解密。用途:加密传输,数字签名。
RSA是基于离散对数的实现,设计和证明移步维基百科RSA。以下是我看了百科后自己用Python3尝试的代码清单。
import random
class RSA:
def is_prime(self, n):
'''primality test'''
if n <= 3:
return n > 1
elif (n % 2 == 0) or (n % 3 == 0):
return False
i = 5
while i * i <= n:
if (n % i == 0) or (n % (i + 2) == 0):
return False
i += 6
return True
def gcd(self, a, b):
'''返回a、b的最大公约数'''
return a if b == 0 else self.gcd(b, a % b)
def lcm(self, a, b):
'''返回a、b的最小公倍数'''
return a // self.gcd(a, b) * b
def ex_gcd(self, a, b, d, x, y):
'''
函数结束时,(x + b) % b为 (a % b)的乘法逆元
'''
if b == 0:
d[0], x[0], y[0] = a, 1, 0
else:
self.ex_gcd(b, a % b, d, y, x)
y[0] -= a // b * x[0]
def quick_power(self, a, b, mod):
res = 1
while b != 0:
if (b & 1) == 1:
res = (res * a) % mod
a = a * a % mod
b >>= 1
return res
def generate(self):
'''
Generates a k-bit RSA public/private pair
@param
@returns 返回密钥对
'''
p, q = 10000079, 10000943
# p、q互质,他来决定了模数n的大小,消息可被转化为不大于n的数加密
# 其实可以给函数加一个参数,来约束p、q的大小
lambdan = self.lcm(p - 1, q - 1)
e = 0
while not self.is_prime(e):
e = random.randint(2, lambdan - 1)
d = [0]
self.ex_gcd(e, lambdan, [0], d, [0])
d = d[0] % lambdan
return {
'n': p * q, # public key (part I)
'e': e, # public key (part II)
'd': d, # private key
}
def encrypt(self, m, e, n):
'''
明文m,指数e,模数n
'''
c = self.quick_power(m, e, n)
return c
def dencypt(self, c, d, n):
m = self.quick_power(c, d, n)
return m
if __name__ == "__main__":
alice = RSA()
bob = RSA()
keys = alice.generate()
msg = 878089
'''bob使用alice的公钥加秘明文,alice收到密文后使用私钥解密'''
c = bob.encrypt(m=msg, e=keys['e'], n=keys['n'])
m = alice.dencypt(c, d=keys['d'], n=keys['n'])
assert msg == m
print(msg, m)
既来之,则安之。要开学选课了,我估计的得主修网络空间安全了,将来从事运维,无缘开发岗(还是会偷偷学Java的)