Theory/Cipher protocol
RSA공개키를 이용한 암호화 구현
1. RSA공개키를 이용한 암호화
(1) RSA공개키 암호 알고리즘
▶ 예전에 정리한 내용이 있어서 아래 URL을 통해 확인이 가능하다.
(2) RSA의 특징
[1] 개인키를 알면 공개키를 구할 수 있다.
[2] 그러나 공개키를 안다고해서 개인키를 구할 수는 없다.
[3] 소스
from Crypto.PublicKey import RSA def main(): msg = b'hellow!' print(msg) private_key = RSA.generate(1024) # 개인키를 하나 만듬 print('private_key : {}'.format(private_key)) public_key = private_key.publickey() # private_key를 알면 public_key를 구할 수 있음 print('public_key : {}'.format(public_key)) cipher_msg = public_key.encrypt(msg, 32) print('cipher_msg : {}'.format(cipher_msg)) # ctrl + p = 자동완성 plain_msg = private_key.decrypt(cipher_msg) print('plain_msg : {}'.format(plain_msg)) if __name__ == '__main__': main()
[4] 시연
(3) RSA의 공개키와 개인키 추출
[1] 소스
from Crypto.PublicKey import RSA def main(): private_key = RSA.generate(1024) public_key = private_key.publickey() # print('1. private_key : {}'.format(private_key.exportKey('PEM'))) # 키의 객체를 문자열로 변경 with open('private_key.pem', 'w', encoding='utf-8') as fd: fd.write(private_key.exportKey('PEM').decode()) # private_key.pem 파일을 쓰기모드로 열고 키의 객체(문자열)를 저장 fd = open('public_key.pem', 'wb+') fd.write(public_key.exportKey('PEM')) fd.close() # public_key.pem 파일을 쓰기모드로 열고 키의 객체를 문자열로 저장 # with open으로 열 때는 'w'모드로 열었고 그러면 byte는 쓸 수 없고 str만 쓰기가능 # open으로 열 때는 'wb+'모드로 열었고 그러면 str과 byte 모두 쓰기가능 # 그래서 with open은 byte를 str로 바꾸는 decode()를 추가로 사용 if __name__ == '__main__': main()
[2] 시연
(4) RSA의 공개키와 개인키를 읽어오기
[1] 소스
from Crypto.PublicKey import RSA def main(): msg = b'I love you' print(msg) fin = open('public_key.pem', 'rb') public_key = RSA.importKey(fin.read()) fin.close() # 공개키를 파일에서 읽어오기 cipher_msg = public_key.encrypt(msg, 32) print(cipher_msg) # 평문을 공개키로 암호화 fin = open('private_key.pem', 'rb') private_key = RSA.importKey(fin.read()) # 개인키를 파일에서 읽어오기 plain_msg = private_key.decrypt(cipher_msg) print(plain_msg) # 개인키로 암호문을 복호화 if __name__ == '__main__': main()
[2] 시연
'Theory > Cipher protocol' 카테고리의 다른 글
Ciphertext Only Attack(암호문 단독 공격) 구현 (0) | 2019.05.31 |
---|---|
Known Plaintext Attack(기지 평문 공격) 구현 (0) | 2019.05.31 |
RSA를 이용한 전자서명(디지털서명) 구현 (0) | 2019.05.31 |
3DES를 이용한 암호화 (0) | 2019.04.11 |
시저암호 (0) | 2019.03.19 |
댓글