2017-05-23 8 views
0

は、その後、私は構築し、私は同じ結果を取得したいのであればDES_ncbc_encryptのAPIに対するopensslの同等のコマンドは何ですか?

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

それを実行し、私はシェル

> 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 

およびC++コード

#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; 
} 

でこのコマンドがあるとし+tzti+tpQls=opensslユーティリティを使用して、それを使用する方法を変更するには、エンディアンをkeyまたはに変更する必要がありますか、わからない暗号名かもしれません。前もって感謝します。

答えて

0

私はそれを理解しました。

opensslユーティリティはブロックの長さのの倍数を必要とするので、これを行う方法はありません。 C++のコードで

入力クリアテキストが​​ですが、それはDES_ncbc_encrypt("abc\x05\x05\x05\x05\x05", ...)を呼び出し、それを意味し、opensslユーティリティに"abc\x05\x05\x05\x05\x05"可能に取り付けられ、パディングと入力クリアテキストを「ABC」を渡して、それだけであるためopensslあるDES_ncbc_encrypt("abc", ...)を呼び出しますユーティリティエンベロープモードDES_ncbc_encryptを呼び出す代わりにDES_ncbc_encryptを直接呼び出すと、EVP_ *モードがパディング処理を行いました。

しかし、クリアテキストは、すでにブロック長倍数である入力の場合には、あなただけのような方法であれば、我々が得る、EVP自動パディング手順を無効にするにはopensslユーティリティコマンドで-nopadを使用することができます同じ結果。

関連する問題