RSA算法实现(Python版)

加密={对称加密,非对称加密}

对称加密的效率高于非对称加密。常用非对称加密算法协商对称加密的密钥,便于用对称加密传输数据。

非对称加密算法有很多种实现算法,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的)

RSA算法是一种非常常见的加密算法,它可以用于数据加密和数字签名等场景。下面是RSA算法Python实现: ```python import random import math # 生成指定位数的质数 def get_prime(nbits): while True: # 随机生成一个nbits位的奇数 p = random.getrandbits(nbits) | (1 << nbits - 1) | 1 if is_prime(p): return p # 判断一个数是否为质数 def is_prime(n): if n <= 1: return False if n <= 3: return True if 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(a, b): if b == 0: return a return gcd(b, a % b) # 求模反元素 def mod_inverse(a, m): g, x, y = extended_euclid(a, m) if g != 1: return None else: return x % m # 扩展欧几里得算法 def extended_euclid(a, b): if b == 0: return a, 1, 0 else: g, x, y = extended_euclid(b, a % b) return g, y, x - (a // b) * y # 生成RSA密钥对 def generate_keypair(nbits): p = get_prime(nbits // 2) q = get_prime(nbits // 2) n = p * q phi = (p - 1) * (q - 1) e = 65537 d = mod_inverse(e, phi) return (n, e), (n, d) # RSA加密 def encrypt(m, public_key): n, e = public_key c = pow(m, e, n) return c # RSA解密 def decrypt(c, private_key): n, d = private_key m = pow(c, d, n) return m # 测试代码 if __name__ == '__main__': nbits = 2048 public_key, private_key = generate_keypair(nbits) m = 123456789 c = encrypt(m, public_key) m1 = decrypt(c, private_key) if m == m1: print("RSA encryption and decryption succeed!") else: print("RSA encryption and decryption failed!") ``` 以上代码实现RSA算法的密钥生成、加密和解密过程,可以自行修改`nbits`来指定生成的RSA密钥的长度。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值