RSA python实现

RSA,一种非对称加密算法

这次写的有点偷懒…

import random

class RSA:
    """
    RSA,一种非对称加密算法,n大小影响加密长度,res%=n
    e,d的生成函数写的很粗糙,效果不太理想,仅适合小规模数据

    @author ZJH
    2021/10/13
    """

    def gcd(self, a: int, b: int) -> int:
        """
        求最大公约数
        :param a:
        :param b:
        :return:
        """
        return self.gcd(b, a % b) if b else a

    def generateE(self, target: int) -> int:
        """
        生成互素随机数e
        :param target:
        :return:
        """
        ran = target - random.randint(1, target - 1)
        for i in range(ran, target):
            if self.gcd(target, i) == 1:
                return i
        for i in range(ran, 1, -1):
            if self.gcd(target, i) == 1:
                return i

    def generateD(self, e: int, nf: int) -> int:
        """
        生成数d
        :param e:
        :param nf:
        :return:
        """
        i = 1
        while i * e % nf != 1 or i == e:
            i += 1
        return i

    def generateKey(self, p: int, q: int) -> tuple:
        """
        生成密钥
        :param p:
        :param q:
        :return:
        """
        self.n = p * q
        nf = (p - 1) * (q - 1)
        self.e = self.generateE(nf)
        self.d = self.generateD(self.e, nf)

        print(f'公钥:({self.n},{self.e})\t'
              f'私钥:{self.d}')

        return (self.n, self.e, self.d)

    def encode(self, target: int, n: int=None, key: int=None) -> int:
        if n==None: n=self.n
        if key==None: key=self.e
        if target>n:
            print('该密钥太小,无法得到正确的加密/解密结果')
        res=(target ** key) % n
        print(f'加密完成,密文:{res}')
        return res

    def decode(self, target: int, n: int=None, key: int=None) -> int:
        if n==None: n=self.n
        if key==None: key=self.d
        if target>n:
            print('该密钥太小,无法得到正确的加密/解密结果')
        res=(target ** key) % n
        print(f'解密完成,明文:{res}')
        return res

    def __init__(self, *args, **kwargs):
        if args or kwargs:
            self.generateKey(*args, **kwargs)

if __name__ == '__main__':
    rsa=RSA()
    rsa.generateKey(61,53)
    # a,b,c=rsa.generateKey(7,17)
    C=rsa.encode(666)
    P=rsa.decode(C)


    print()

    # a,b,c=rsa.generateKey(9613034531358350457419158128061542790930984559499621582258315087964794045505647063849125716018034750312098666606492420191808780667421096063354219926661209,12060191957231446918276794204450896001555925054637033936061798321731482148483764659215389453209175225273226830107120695604602513887145524969000359660045617)
    # C = rsa.encode(1907081826081826002619041819,115935041739676149688925098646158875237714573754541447754855261376147885408326350817276878815968325168468849300625485764111250162414552339182927162507656772727460097082714127730434960500556347274566628060099924037102991424472292215772798531727033839381334692684137327622000966676671831831088373420823444370953,35535)
    print()