티스토리 뷰

암호학

RSA python 구현

삼전동해커 2022. 1. 12. 11:19
import random
import math

def gcd(a,b):
    while b != 0:
        a,b = b,a%b
    return a
    
def prime_num(num):
    pm_num = num
    for i in range(2,int(math.sqrt(pm_num)) + 1):
        if pm_num % i == 0:
           return prime_num(pm_num+1)
    return pm_num 
        
def get_public_key_e(euler):
    e = 2
    while e<euler and gcd(e,euler) != 1:
        e += 1
    return e

def get_private_key_d(e,euler):
    d = 1
    while (e*d) % euler != 1 or d == e:
        d = d+1
    return d

def encrypt(pk,m):
    n,e = pk
    #C = M^e mod n
    C = [(ord(char) ** e) % n for char in m]
    return C

def main():
    m = input("enter plaintext : ")

    pp = prime_num(random.randrange(1,20))
    pq = prime_num(random.randrange(1,20))

    print("(p , q) = ("+str(pp)+","+str(pq)+")")
    
    #get public_key
    n = pp*pq
    print("n = ",str(n))
    
    euler = ((pp-1)*(pq-1))
    print("Φ(n) = ",str(euler))
    
    e = get_public_key_e(euler)
    print("e = ",str(e))
    
    print("public_key(n,e) = ("+str(n)+","+str(e)+")")
    
    
    #get private_key
    d = get_private_key_d(e,euler)
    print("private_key(n,d) = (" + str(n) + "," + str(d) + ")")
    
    #encrypt
    encrypted_M = encrypt((n,e),m)
    print("encrypted_M : "+ ''.join(map(lambda x:str(x),encrypted_M)))
    
if __name__ == "__main__":
    main()

'암호학' 카테고리의 다른 글

OpenSSL을 이용해 파일 암호화  (0) 2022.01.19
DES  (0) 2020.10.19
SSO  (0) 2020.10.17
OTP(One Time Password)  (0) 2020.10.16
SSL  (0) 2020.10.15
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함