2012-09-01 3 views
4

나는 openssl 복어 암호화 된 암호를 해독하는 데 도움이되는 파이썬 라이브러리를 찾고있었습니다.Python으로 unsalted openssl 호환 복어 CBC/PKCS5Padding 암호를 해독하는 방법?

나는 자바에서 이것을 달성 할 수 있었다. 그러나 이것을 지원하기위한 파이썬 라이브러리는 더 많은 학습 곡선을 나타 냈고, 자신 만의 롤링이 필요했다.

우리가 달성해야하는 측면에서 암호는 무제한이며 암호를 사용합니다.이 질문에서이 암호를 "AAAAAAAA"로 설정했습니다. Cipher는 "Blowfish/CBC/PKCS5Padding"입니다. 암호화 된 텍스트는 키와 같은 문자열로 읽히고 iv. 하려면 openssl에서

,이 '단순히'이다

private static final String KEY = "AAAAAAAA000000000000000000000000"; 
private static final String IV = "AAAAAAAA00000000"; 
private static final String FCN = "Blowfish/CBC/PKCS5Padding"; 
private static final String CN = "Blowfish"; 

final byte[] encoded = Base64.decode("eAIUXziwB8QbBexkiIDR3A=="); 
final SecretKeySpec key = 
new SecretKeySpec(Hex.decodeHex(KEY.toCharArray()), CN); 
final Cipher cipher = Cipher.getInstance(FCN, JCE_PROVIDER); 
cipher.init(Cipher.DECRYPT_MODE, key, new IvParameterSpec(Hex.decodeHex(IV.toCharArray()))); 
final byte[] decrypted = cipher.doFinal(encoded); 
return new String(decrypted); 

사람이 파이썬에 대한 몇 가지 지침을 제공 할 수 있습니다 : 자바에서

~$ # This is encrypting 
~$ echo -n 'password' | openssl enc -bf -nosalt -a -K AAAAAAAA -iv AAAAAAAA 
eAIUXziwB8QbBexkiIDR3A== 
~$ # This is reversing the encryption 
~$ echo 'eAIUXziwB8QbBexkiIDR3A==' | openssl enc -d -bf -nosalt -a -K AAAAAAAA -iv AAAAAAAA 
password 

에서, descryption가의 라인을 따라입니까?

답변

2

디코딩 및베이스 64 진수 문자열 인코딩 내장되어

In [1]: "AAAAAAAA000000000000000000000000".decode('hex') 
Out[1]: '\xaa\xaa\xaa\xaa\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 

In [2]: "eAIUXziwB8QbBexkiIDR3A==".decode('base64') 
Out[2]: 'x\x02\x14_8\xb0\x07\xc4\x1b\x05\xecd\x88\x80\xd1\xdc' 

PyCrypto 라이브러리 BlowFish (무엇보다도) 처리한다.

In [1]: from Crypto.Cipher import Blowfish 

In [2]: KEY = "AAAAAAAA000000000000000000000000".decode('hex') 

In [3]: IV = "AAAAAAAA00000000".decode('hex') 

In [4]: cipher = Blowfish.new(KEY, Blowfish.MODE_CBC, IV) 

In [5]: ciphertext = "eAIUXziwB8QbBexkiIDR3A==".decode('base64') 

In [6]: cipher.decrypt(ciphertext) 
Out[6]: 'password\x08\x08\x08\x08\x08\x08\x08\x08' 

당신이 한 번에 일반 텍스트에서 패딩을 제거하려면

:

In [14]: cipher.decrypt(ciphertext).replace('\x08', '') 
Out[14]: 'password' 
+0

가 완벽하게 작동, 감사합니다. 나는 도서관을 시험해 보았지만 실제로 hex/base64 사이의 적절한 변환을 놓쳤다. – user1640422

+0

여러분을 환영합니다! 그런데, 소금을 사용해야합니다. 소금을 사용하지 않으면 암호에 대한 사전 사전 공격을 수행 할 수 있습니다. –