2017년 1월 13일 금요일

공개키 암호(Public-key Cryptography)

공개키 암호(Public-key Cryptography)

이번 장은 공개키 암호에 대해 설명하는 장이다. 공개키 암호화 방법은 한쌍의 키를 사용해 암호화 하며 개인키(또는 비밀키)와 다른 하나는 누구나 가지고 있는 공개키이다. 이는 곧 암호화키가 서로 다르기 때문에 비대칭키 암호화라고 부른다.

공개키 암호화 - DH(Diffie-Hellman), DSA(Digital Signature Algorithm), ECDH(Elliptic Curve DH), ECDSA(Elliptic Curve DSA), EIGamal, RSA(Rivest, Shamir and Adleman) 등

하이브리드 암호화를 적용한 대표적인 프로그램은 GNU Privacy Guard(GPG)이며, GPG는 시만텍사의 PGP 암호화 소프트웨어 제품군을 대체하기 위해 오픈 진영에서 개발한 무료 소프트웨어이며 리눅스, Mac OS, 윈도우를 지원한다.

이산로그 기반으로한 공개키 암호화 - 타원곡성(Elliptic Curve)

PKI

수신자에 공개키에 대해 신뢰하기 위해 만들어진 공개키 기반 구조이다.

PKI 구성

  • 디지털 인증서 인증기관
  • 디지털 인증서
  • 인증기관을 대행하는 등록기관
  • 인증서를 보관하는 하나 이상의 디렉토리
  • 인증서 관리 시스템

PKI의 일반적인 기능

  • 인증서 발급
  • 인증서 관리
  • 인증서 배포
  • 인증서 사용
  • 인증서 저장
  • 인증서 삭제

RSA 공개키 암호 구현 예제

PyCrypto가 제공하는 공개키 암호 알고리즘은 DSA, ElGamal, RSA가 있으며 DSA는 공개키 서명을 위한 알고리즘이며, ElGamal과 RSA는 공개키 암호화 공개키 서명을 모두 지원하는 알고리즘이다.


from Crypto.PublicKey import RSA
from Crypto.Hash import SHA256 as SHA

def createPEM():
    private_key = RSA.generate(1024)
    f = open('mykey.pem', 'wb+')
    f.write(private_key.exportKey('PEM'))
    f.close()

def readPEM():  # mykey.pem 파일에 저장된 개인 키를 읽어서 리턴
    h = open('mykey.pem', 'r')
    key = RSA.importKey(h.read())
    h.close()
    return key

def rsa_sign(msg):  # 사용자의 개인키로 서명
    private_key = readPEM()
    public_key = private_key.public_key()
    hash = SHA.new(msg).digest()
    signature = private_key.sign(hash, '')
    return public_key, signature

def ras_verify(msg, public_key, signature): # 사용자의 공개키로 서명
    hash = SHA.new(msg).digest()
    if public_key.verify(hash, signature)
        print('VERIFIED')
    else:
        print('DENIED')

def rsa_enc(msg):   # RSA 공개키로 메시지를 암호화 하는 함수
    private_key = readPEM()
    public_key = private_key.publickey()
    encdata = public_key.encrypt(msg, 32)
    return encdata

def rsa_dec(msg):   # RSA 개인키로 메시지를 복호화 하는 함수
    private_key = readPEM()
    decdata = private_key.decrypt(msg)
    return decdata


if __name__ == '__main__':
    createPEM()
    msg = 'qingfro9 python script'
    ciphered = rsa_enc(msg.encode('utf-8'))
    print(ciphered)
    deciphered = rsa_dec(ciphered)
    print(deciphered)
    
    

댓글 없음:

댓글 쓰기