非对称加密算法RSA的实现

一、实验目的

1、了解非对称密码体制基本原理

2、掌握编程语言实现非对称加密、解密

二、实验原理

RSA加密算法是一种非对称加密算法,所谓非对称,就是指该算法加密和解密使用不同的密钥,即使用加密密钥进行加密、解密密钥进行解密。在RAS算法中,加密密钥(即公开密钥)是公开信息,而解密密钥(即秘密密钥)是需要保密的。加密算法和解密算法也都是公开的。

公钥(E,N)
私钥(D,N)
密钥对(E,D,N)
加密

密文=明文EmodN密文=明文EmodN

解密

明文=密文DmodN明文=密文DmodN

 三、实验代码

import random
from sympy import isprime

class RSA:
    def __init__(self):
        self.p, self.q = self.generate_random_primes(100)

    def is_prime(self, n):
        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):
        return a if b == 0 else self.gcd(b, a % b)

    def lcm(self, a, b):
        return a // self.gcd(a, b) * b

    def ex_gcd(self, a, b, d, x, y):
        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_random_primes(self, max_value=100):
        primes = []
        while len(primes) < 2:
            num = random.randint(1, max_value)
            if isprime(num):
                primes.append(num)
        return primes

    def generate(self):
        lambdan = self.lcm(self.p - 1, self.q - 1)
        e = 2
        while not self.is_prime(e) or self.gcd(e, lambdan) != 1:
            e = random.randint(2, lambdan - 1)
        d = [0]
        self.ex_gcd(e, lambdan, [0], d, [0])
        d = d[0] % lambdan
        print("系统随机生成的公钥PU=[e={},n={}]".format(e, self.p * self.q))
        print("系统随机生成的私钥PR=[d={},n={}]".format(d, self.p * self.q))
        return {
            'n': self.p * self.q,
            'e': e,
            'd': d,
        }

    def encrypt(self, plaintext, e, n):
        return [self.quick_power(ord(char), e, n) for char in plaintext]

    def decrypt(self, ciphertext, d, n):
        return ''.join(chr(self.quick_power(char, d, n)) for char in ciphertext)

def main():
    rsa = RSA()
    keys = rsa.generate()
    while True:
        select = input("输入1加密;输入2解密;输入3退出程序;请输入:\n")
        if select == '1':
            plaintext = input("输入要加密的明文:\n")
            ciphertext = rsa.encrypt(plaintext, keys['e'], keys['n'])
            print("密文是:{}".format(ciphertext))
        elif select == '2':
            encrypted_input = input("输入要解密的密文:\n").strip('[]')
            ciphertext = list(map(int, encrypted_input.split(',')))
            d, n = map(int, input("请输入私钥PR的d和n值,用逗号分隔:\n").split(','))
            plaintext = rsa.decrypt(ciphertext, d, n)
            print("明文:{}".format(plaintext))
        elif select == '3':
            print("退出程序。")
            break
        else:
            print("重新选择!")

if __name__ == '__main__':
    main()

四、运行结果 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风起晨曦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值