RSAアルゴリズム実装(Python版)


暗号化={対称暗号化、非対称暗号化}
対称暗号化の効率は非対称暗号化よりも高い.対称暗号化アルゴリズムを用いて非対称暗号化の鍵を協議し、非対称暗号化でデータを伝送するのに便利である.
非対称暗号化アルゴリズムには多くの実装アルゴリズムがあり、RSAはその1つである(RとSは不可逆式one-way functionを計算したいが、数学者Aは式を探す不足である).
非対称暗号化アルゴリズムステップ:鍵ペアを生成し、公開鍵を配布し、暗号化し、復号する.用途:暗号化伝送、デジタル署名.
RSAは離散対数の実現に基づいて、ウィキペディアRSAに移行することを設計し、証明する.以下は百科事典を見て自分でPython 3で試したコードリストです.
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を学ぶことができます)