ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Python] cryptography 라이브러리로 RSA에 쓰일 .pem file 로드하기
    Python 2023. 10. 24. 23:43
    728x90
    반응형

    이번에는 내가 .pem 파일을 통해 encryption과 decryption을 진행해야하는데

    내가 로드한 코드가 맞는 코드인지좀 체크해야돼서 이렇게 작성을 진행한다.

    그리고 보통 다른 포스팅은 Pycrypto 혹은 Pycryptodome인가? 그 라이브러리로 많이 진행을 하던데

    나는 cryptography라는 라이브러리로 하는게 필요했다고 생각해서 이걸로 적어보려한다.

     

    설치는

    pip3 install cryptography

    를 진행하면된다.

     

    -----BEGIN CERTIFICATE-----
    MIIDWjCCAkICFA5LS3zQkHbZX6fry6Rzd3Bkt12uMA0GCSqGSIb3DQEBCwUAMHEx
    CzAJBgNVBAYTAlVTMQswCQYDVQQIDAJDQTERMA8GA1UEBwwIQmVya2VsZXkxDTAL
    BgNVBAoMBEVFQ1MxHTAbBgNVBAsMFENlcnRpZmljYXRlQXV0aG9yaXR5MRQwEgYD
    VQQDDAtpb3RhdXRoLm9yZzAeFw0yMzEwMjMwOTM2MTRaFw0yNTEwMjIwOTM2MTRa

    다음으로 나의 .pem 파일 중 public key를 담은 내용의 시작은

    -----BEGIN CERTIFICATE----- 일 경우이다.

    이는 PKI 인증서로 불리는데 이것을 로드할때는 기존의 public key를 로드할때처럼 코드를 진행하면 안된다.

     

    왜냐하면 cryptography에서 제공할 때, 저 문구의 시작이면 이는 x509로 로드를 진행해야하기 때문이다.

    https://cryptography.io/en/latest/x509/reference/#cryptography.x509.load_pem_x509_certificate

     

    X.509 Reference — Cryptography 42.0.0.dev1 documentation

    CRL Entry Extensions These extensions are only valid within a RevokedCertificate object. class cryptography.x509.CertificateIssuer(general_names)[source] The certificate issuer is an extension that is only valid inside RevokedCertificate objects. If the in

    cryptography.io

    자세한 사항은 이 페이지를 참고하길바람.

     

    불러오는 코드와 public key로 변경하는 코드는 다음과같다.

    from cryptography import x509
    from cryptography.hazmat.backends import default_backend
    
    with open(pubkey_path, 'rb') as content:
        public_key = (x509.load_pem_x509_certificate(content.read(), default_backend)).public_key()

    다음으로 진행하면 올바르게 public key를 불러오는것으로 생각할 수 있다.

    (이는 내가 실험까지 진행했기에 맞다고 확신한다는....ㅎㅎ)

     

    다음으로는 private key를 로드하는 코드인데 .pem 파일은 다음과같다.

    -----BEGIN PRIVATE KEY-----
    MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDLcq/flKYwjXsf
    7ixQjiAVw/9yTghmT2rmrxyjzAavZS49eOWByx+aGmH0OYqISzS+YPJMGUk9wc2s
    jetYjql4T5SSabq9YJ1j3avPGwfXAOiTpw3lkCEyXZ1TE6iMplV5OX2H0gf4tesh
    OxNOajo5KgyvZAcHLF7E++9lNw8tHyylXWDBPI6piARiVzlOrVkcEIXmwS25eoQK
    ZeAFDZ05hTfvMFAhAEzt/xeHniKZsbO6Qfdb/nk8FqBO24oEeb6eq8Rgw478JCC4
    /BCzTaGBciX9D7/cj3T+0XI5xLxAK0AhWQnUpNJJllm1u72MCa/a/HhlVW96eeOE
    2rpRQWHFAgMBAAECggEAFKn27BYclSThoxodXSc6YguQyArd9opNeNXDam2gJjN4
    MV00rmyzroLMfTJU/EfrOQT+xzTwR/oFymd1xn5i/ynSFNbxVSfZhJmwyC3eK3vX
    o5udoTn07Tkt8BC4l2STnOb2dZOjJKNRmQP3j4jhlgnL1QqrXhKnI4nVRGoFvBbW
    aVH2MxLwoOyxG1cCWPdGzVDMjJjKXTgcW

    PRIVATE KEY로 되어있으면 그래도 손쉽게 로드할 수 있다.

    물론 이는 RSA기준이므로 그에 해당하는 사람이 일단 쓰길 권장.

    그리고 다 코드를 뜯어볼수는있는데 꽤나 힘들긴하다... 실제로 잘되는지 어떤 arg가 필요한지 파악하느라 꽤나 애먹었다.

     

    from cryptography.hazmat.primitives import serialization
    
    with open(privkey_path, 'rb') as content:
        private_key= serialization.load_pem_private_key(content.read(), None)

    이렇게 진행하면 private key를 얻을 수 있다.

     

    증명 방법은 encryption과 decryption이 있는데 이는 다음장에서 다시 올리는걸루!!

     

    이번 포스팅은 이만 안녕!

    728x90
    반응형
Designed by Tistory.