1、实验内容:
(RSA是算法的代码实现)
RSA 公开密钥密码体制。所谓的公开密钥密码体制就是使用不同的加密密钥与解密密钥,是一种“由已知加密密钥推导出解密密钥在计算上是不可行的”密码体制。
RSA 算法是一种非对称密码算法,所谓非对称,就是指该算法需要一对密钥,使用其中一个加密,则需要用另一个才能解密。在加密系统中,公开密钥用于加密,私有密钥用于解密,私有密钥只能由生成密钥的交换放掌握;公开密钥可广泛公布,但它只对应生成密钥的交换方。
RSA 的算法涉及三个参数:n、e、d。其中,n是两个大质数 p、 q 的积, n 的二进制表示时所占用的位数,就是所谓的密钥长度。e 和 d 是一对相关的值, e 可以任意取值,但要求e 与 (p-1)*(q-1 )互质; 再选择d,要求( e*d )mod((p-1 )*(q-1 ))=1 。( n,e),(n,d)就是密钥对。其中 (n, e)为公钥, (n, d)为私钥。
RSA 加解密的算法完全相同, 设 A 为明文, B 为密文,则: A=B^e mod n ;B=A^e mod n ;(公钥加密体制中,一般用公钥加密,私钥解密)e 和 d 可以互换使用,即:A=B^e mod n ; B=A^d mod n。
2、实验代码:
# 加密
def encryption(x, pubkey):
n = pubkey[0]
e = pubkey[1]
y = x ** e % n # 加密
return y
# 解密
def decryption(y, prikey):
n = prikey[0]
d = prikey[1]
x = y ** d % n # 解密
return x
# 求两个数字的最大公约数(欧几里得算法),当gcd(a,b)=1时,两个数互质
def gcd(a, b):
if b == 0:
return a;
else:
return gcd(b, a % b)
# 拓展的欧几里得算法
def ext_gcd(a, b):
if b == 0:
x1 = 1
y1 = 0
x = x1
y = y1
r = a
return r, x, y
else:
r, x1, y1 = ext_gcd(b, a % b) # 递归直至余数等于0(需多递归一层用来判断)
x = y1
y = x1 - a // b * y1 # 辗转相除法反向推导每层a、b的因子使得gcd(a,b)=ax+by成立
return r, x, y
# 生成公钥私钥
def get_key(p, q):
n = p * q
z = (p - 1) * (q - 1)
# 此处保证与e与z互质,并且得到的x要大于0
e = z # 初始化e
while e > 1:
e -= 1
r, x, y, = ext_gcd(e, z) # 传入z和e到ext_gcd()中,得到d
if (gcd(e, z) == 1) & (x > 0):
break
# d*e%
d = x # 扩展的欧几里得算法中得到的x就是e的逆元
return (n, e),(n, d)
if __name__ == '__main__':
p = int(input("请给定第一个质数p的值:"))
q = int(input("请给定第二个质数q的值:"))
x = int(input("请给定要加密的消息x的值:"))
# 生成公钥私钥
pubkey, prikey = get_key(p, q)
print("加密前的消息是:", x)
y = encryption(x, pubkey)
print("加密后的消息是:", y)
after_x = decryption(y, prikey)
print("解密后的消息是:", after_x)
3、运行结果