2011-10-22 3 views
1

알려진 암호화 키를 사용하여 외부 소스에서 DES 암호화 파일을 해독하려고합니다. OpenSSL을 사용하여 IV를 해독하려고합니다. (다른 라이브러리는 실제로 옵션이 아닙니다. 새로운 의존성을 도입하고 싶지 않음). 그것은 Qt 애플리케이션이므로 데이터는 QByteArrays로 들어오고 나옵니다. 여기 OpenSSL을 사용하여 DES 암호 해독

순간에 내가 가지고있는 코드입니다 (검사를위한 파일에서 해독 된 데이터를 기록 할 설정) :

AmzHandler::AmzHandler(QByteArray encoded) 
{ 
    QByteArray encrypted = QByteArray::fromBase64(encoded); 
    QByteArray decrypted = decrypt(encrypted); 
    QFile fred ("decrypted"); 
    fred.open(QFile::WriteOnly); 
    fred.write(decrypted); 
    fred.close(); 
} 

QByteArray AmzHandler::decrypt(QByteArray encrypted) 
{ 
    DES_cblock key = {0x29, 0xab, 0x9d, 0x18, 0xb2, 0x44, 0x9e, 0x31}; 
    DES_cblock iv = {0x5e, 0x72, 0xd7, 0x9a, 0x11, 0xb3, 0x4f, 0xee}; 
    DES_key_schedule schedule; 
    unsigned char decrypted[encrypted.size()]; 

    DES_set_odd_parity(&key); 
    DES_set_key_checked(&key, &schedule); 

    DES_ncbc_encrypt((unsigned char *)encrypted.constData(), (unsigned char *)decrypted, encrypted.size(), &schedule, &iv, DES_DECRYPT); 

    return QByteArray::fromRawData((char *)decrypted, length); 
} 

내 테스트 입력에 대한 출력 파일은 넌센스이며, 여러 일관되지 않습니다 실행됩니다. (나는이 포스트의 하단에 붙어있는 파이썬에서 작동하는 구현을 테스트하고있다.) 무슨 일이 일어나고 있는지 잘 모르겠다. 내가 char 변환을 간단하게 만들었거나 OpenSSL을 오용했는지 여부.

편집 : 해결. DES_set_odd_parity(&key); 라인이 없습니다. 그것을 추가하면 효과가 있습니다.

여기 파이썬 코드를 작업입니다 :

def AmzHandler(encoded): 
    encrypted = base64.b64decode(encoded) 
    d = pyDes.des(hex_to_str("29AB9D18B2449E31"), mode=pyDes.CBC, IV=hex_to_str("5E72D79A11B34FEE")) 
    decrypted = d.decrypt(encrypted) 
    f = open("decrypted-py", "w") 
    f.write(decrypted) 
    f.close() 
+1

이것은 의심스러워 보입니다 :'unsigned char * decrypted [encrypted.size()];'. 그것은 포인터 또는 배열 중 하나 여야합니다. – vhallac

+0

@vhallac 오케이. 나는 이제 unsigned char decrypted [encrypted.size()];와 (다음의 [this] (http://www.codealias.info/technotes/des_encryption_using_openssl_a_simple_example))'unsigned char * decrypted;를 시도했다. 복호화 된 = (서명되지 않은 char *) malloc (encrypted.size());'. 둘 다 서로 다른 크기의 출력을 생성하지만 여전히 수백 바이트의 순서로 나타나며 분명히 정확하지는 않습니다. – Sam

+0

'QByteArray'는 아마도 배열의 길이를 필요로 할 것입니다. 버퍼 주소에서 결정할 방법이 없습니다. – vhallac

답변

2

이 문제는 그냥이 구현 정확한 디코딩에 필요한 것으로 보인다 DES_set_odd_parity(&key);에 누락 된 호출했다. 작업 코드는 다음과 같습니다 :

QByteArray AmzHandler::decrypt(QByteArray encrypted) 
{ 
    DES_cblock key = {0x29, 0xab, 0x9d, 0x18, 0xb2, 0x44, 0x9e, 0x31}; 
    DES_cblock iv = {0x5e, 0x72, 0xd7, 0x9a, 0x11, 0xb3, 0x4f, 0xee}; 
    DES_key_schedule schedule; 
    unsigned char decrypted[encrypted.size()]; 

    DES_set_odd_parity(&key); 
    DES_set_key_checked(&key, &schedule); 

    DES_ncbc_encrypt((unsigned char *)encrypted.constData(), (unsigned char *)decrypted, encrypted.size(), &schedule, &iv, DES_DECRYPT); 

    return QByteArray::fromRawData((char *)decrypted, length); 
} 
관련 문제