applan의 개발 이야기
[ Python ] RSA String타입의 PrivateKey을 이용한 복호화 본문
Java 에서 DB에 등록한 String타입의 PrivateKey를 가지고
Python에서 해당 PrivateKey값을 이용하여 비밀번호를 복호화 해야 하는 일이 생겼다.
다양한 방법을 사용해봤지만 에러 발생 후 최종적으로 해결되었다.
실패했던 소스 ( 더 있지만 생략 )
# DB에서 가지고온 privateKey와 Password 값
key = v['privateKey']
pw = v['password']
# python에서 String타입의 privateKey값을 맞게 변환하기 위해서는 해당 문자열 형식 필요
pem_prefix = '-----BEGIN RSA PRIVATE KEY-----\n'
pem_suffix = '\n-----END RSA PRIVATE KEY-----'
key = '{}{}{}'.format(pem_prefix, key, pem_suffix)
prk = rsa.PrivateKey.load_pkcs1(key)
cipher = Cipher_PKCS1_v1_5.new(prk)
cipher_text = cipher.decrypt(pw, None)
# Error 발생
Traceback (most recent call last):
File "{sourcePath}/test12.py", line 43, in <module>
prk = rsa.PrivateKey.load_pkcs1(key)
File "C:\ProgramData\Anaconda3\lib\site-packages\rsa\key.py", line 124, in load_pkcs1
return method(keyfile)
File "C:\ProgramData\Anaconda3\lib\site-packages\rsa\key.py", line 592, in _load_pkcs1_pem
return cls._load_pkcs1_der(der)
File "C:\ProgramData\Anaconda3\lib\site-packages\rsa\key.py", line 527, in _load_pkcs1_der
key = cls(*as_ints)
TypeError: int() argument must be a string, a bytes-like object or a number, not 'Sequence'
해결한 소스
pem_prefix = '-----BEGIN RSA PRIVATE KEY-----\n'
pem_suffix = '\n-----END RSA PRIVATE KEY-----'
key = '{}{}{}'.format(pem_prefix, v['privateKey'], pem_suffix)
keyPriv = RSA.importKey(key)
cipher = Cipher_PKCS1_v1_5.new(keyPriv)
raw_cipher_data = b64decode(v['password'])
decrypt_text = cipher.decrypt(raw_cipher_data, None).decode()
print("decrypted msg->", decrypt_text)
마주친 에러
1. ValueError: Ciphertext with incorrect length.
2. ValueError: RSA key format is not supported
3. binascii.Error: Incorrect padding
4. ValueError: Plaintext is too long.
이용했던 stack overflow
https://stackoverflow.com/questions/35683598/decrypting-large-files-with-rsa-in-pycrypto
https://stackoverflow.com/questions/19242381/how-to-load-adbkey-pub-with-python-rsa
https://stackoverflow.com/questions/44746907/converting-java-crypto-code-to-python-equivalent
https://stackoverflow.com/questions/42668142/how-to-load-rsa-keystring-in-python
해결했던 stack overflow
https://stackoverflow.com/questions/39131630/python-decryption-using-private-key