2017-05-23 1 views
0

Angenommen, ich diesen Befehl in der Schale habenWas ist der äquivalente Befehl in openssl zu API von DES_ncbc_encrypt?

> echo -n "abc" | openssl enc -e -K 4a08805813ad4689 -iv 1112131415161718 -des-cbc -a -p -v 
salt=E0BE670000000000 
key=4A08805813AD4689 
iv =1112131415161718 
lb5mBZNE/nU= 
bytes read :  3 
bytes written:  13 

> echo -n "abc" | openssl enc -e -K 4a08805813ad4689 -iv fadced8beb69425b -des-cbc -a -p -v 
salt=E0BE670000000000 
key=4A08805813AD4689 
iv =FADCED8BEB69425B 
XXlljYbfJYg= 
bytes read :  3 
bytes written:  13 

und die C++ Code

#include <string.h> 

#include <iostream> 
#include <string> 

#include <openssl/bio.h> 
#include <openssl/des.h> 
#include <openssl/evp.h> 

int b64encode(char* in, int in_len, char* out, int out_cap_len); 
int b64decode(char* in, int in_len, char* out, int out_cap_len); 
int b64code(char* in, int in_len, char* out, int out_cap_len, bool way); 

int b64encode(char* in, int in_len, char* out, int out_cap_len) 
{ 
    return b64code(in, in_len, out, out_cap_len, true); 
} 

int b64decode(char* in, int in_len, char* out, int out_cap_len) 
{ 
    return b64code(in, in_len, out, out_cap_len, false); 
} 

int b64code(char* in, int in_len, char* out, int out_cap_len, bool way) 
{ 
    BIO* b64 = BIO_new(BIO_f_base64()); 
    BIO_set_flags(b64, BIO_FLAGS_BASE64_NO_NL); 
    BIO* bio = BIO_new(BIO_s_mem()); 
    BIO_push(b64, bio); 
    int out_len = 0; 
    if (way) 
    { 
     BIO_write(b64, in, in_len); 
     BIO_flush(b64); 
     out_len = BIO_read(bio, out, out_cap_len); 
    } 
    else 
    { 
     BIO_write(bio, in, in_len); 
     BIO_flush(bio); 
     out_len = BIO_read(b64, out, out_cap_len); 
    } 
    BIO_free_all(b64); 
    return out_len; 
} 

void hexdump(unsigned char* ptr, int len) 
{ 
    for (int i = 0; i < len; ++i) 
    { 
     printf("%02x", *(ptr + i)); 
    } 
    printf("\n"); 
    return; 
} 

int main(int argc, char* argv[]) 
{ 
    std::string text("abc"); 
    unsigned char cipher[1024] = ""; 
    DES_key_schedule schedule; 
    DES_cblock key = { 0x4a, 0x08, 0x80, 0x58, 0x13, 0xad, 0x46, 0x89 }; 
    DES_cblock ivec = { 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18 }; 
    DES_set_key_checked(&key, &schedule); 
    printf("initialized:\n"); 
    printf("key="); 
    hexdump(key, sizeof key); 
    printf("iv ="); 
    hexdump(ivec, sizeof ivec); 
    DES_ncbc_encrypt((unsigned char*)text.c_str(), cipher, (long)text.length(), &schedule, &ivec, DES_ENCRYPT); 
    printf("updated:\n"); 
    printf("key="); 
    hexdump(key, sizeof key); 
    printf("iv ="); 
    hexdump(ivec, sizeof ivec); 
    char b64encoded[1024] = ""; 
    b64encode((char*)cipher, strlen((char*)cipher), b64encoded, sizeof b64encoded - 1); 
    std::cout << b64encoded << std::endl; 
    return 0; 
} 

Dann ist es ich bauen und laufen

> g++ -o zdex.bex zdes.cpp -lcrypto && ./zdex.bex 
initialized: 
key=4a08805813ad4689 
iv =1112131415161718 
updated: 
key=4a08805813ad4689 
iv =fadced8beb69425b 
+tzti+tpQls= 

Also, wenn ich das gleiche Ergebnis erhalten möchten +tzti+tpQls= mit openssl Dienstprogramm, wie man den Weg, um es zu ändern, muss ich die Endianness von key oderändernoder vielleicht der Chiffre-Name, den ich nicht kenne. Danke im Voraus.

Antwort

0

Ich habe es herausgefunden.

Es gibt keine Möglichkeit dies zu tun, da openssl Dienstprogramm erfordert mehrere der Blocklänge Eingabedaten.

in der C++ Code rufe DES_ncbc_encrypt("abc", ...) der Eingangsklartext ist "abc", aber „abc“ zu openssl Dienstprogramm den Eingangsklartext mit Polsterung vorbei angebracht "abc\x05\x05\x05\x05\x05", sein, die es es DES_ncbc_encrypt("abc\x05\x05\x05\x05\x05", ...) Rufmittel, ist es nur, weil openssl Dienstprogramm verwendet HüllkurvenmodusDES_ncbc_encrypt Funktion aufrufen, anstatt DES_ncbc_encrypt direkt, EVP_ * -Modus hat die Auffüllung der Arbeit.

Aber im Fall von Eingabeklartext ist mehrere der Blocklänge bereits, können Sie die -nopad im openssl Dienstprogramm Befehl verwenden können, Executive Vice President Auto-Polsterung Prozedur zu deaktivieren, nur dann, wenn in einer solchen Art und Weise, wir bekommen die identische Ergebnisse

Verwandte Themen