RSA算法

 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、运行结果

d26c8c7f813d422e934576da003a9859.png

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值