は、その後、私は構築し、私は同じ結果を取得したいのであれば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
またはに変更する必要がありますか、わからない暗号名かもしれません。前もって感謝します。