如何使用 OpenSSL 加密发送给 Blowfish 的消息?
How to encrypt a message to Blowfish using OpenSSL?
我需要使用 OpenSSL 库获取 Blowfish 加密。但是有些东西不起作用。
我究竟做错了什么?我正在尝试这样做:
#include <iostream>
#include <openssl/blowfish.h>
#include "OpenSSL_Base64.h"
#include "Base64.h"
using namespace std;
int main()
{
unsigned char ciphertext[BF_BLOCK];
unsigned char plaintext[BF_BLOCK];
// blowfish key
const unsigned char *key = (const unsigned char*)"topsecret";
//unsigned char key_data[10] = "topsecret";
BF_KEY bfKey;
BF_set_key(&bfKey, 10, key);
/* Open SSL's Blowfish ECB encrypt/decrypt function only handles 8 bytes of data */
char a_str[] = "8 Bytes";//{8, ,B,y,t,e,s,[=10=]}
char *arr_ptr = &a_str[0];
//unsigned char* data_to_encrypt = (unsigned char*)"8 Bytes"; // 7 + [=10=]
BF_ecb_encrypt((unsigned char*)arr_ptr, ciphertext, &bfKey, BF_ENCRYPT);
unsigned char* ret = new unsigned char[BF_BLOCK + 1];
strcpy((char*)ret, (char*)ciphertext);
ret[BF_BLOCK + 1] = '[=10=]';
char* base_enc = OpenSSL_Base64::Base64Encode((char*)ret, strlen((char*)ret));
cout << base_enc << endl;
cin.get();
return 0;
}
但是我得到了错误的输出:
fy7maf+FhmbM
我检查了一下:
http://sladex.org/blowfish.js/
应该是:fEcC5/EKDVY=
Base64:
问题是 ret
可能包含一个空字节,加密是基于 8 位字节的,而不是基于字符的,并且将包含 0-255 的完整范围内的值。 strlen
将在它找到的第一个空字节处终止,给出的长度小于加密数据的全长。
注意:使用加密时要注意提供准确正确的长度参数和数据,不要依赖padding。 (例外情况是支持数据填充的加密函数的输入数据,例如 PKCS#7(née PKCS#5)填充。
我需要使用 OpenSSL 库获取 Blowfish 加密。但是有些东西不起作用。
我究竟做错了什么?我正在尝试这样做:
#include <iostream>
#include <openssl/blowfish.h>
#include "OpenSSL_Base64.h"
#include "Base64.h"
using namespace std;
int main()
{
unsigned char ciphertext[BF_BLOCK];
unsigned char plaintext[BF_BLOCK];
// blowfish key
const unsigned char *key = (const unsigned char*)"topsecret";
//unsigned char key_data[10] = "topsecret";
BF_KEY bfKey;
BF_set_key(&bfKey, 10, key);
/* Open SSL's Blowfish ECB encrypt/decrypt function only handles 8 bytes of data */
char a_str[] = "8 Bytes";//{8, ,B,y,t,e,s,[=10=]}
char *arr_ptr = &a_str[0];
//unsigned char* data_to_encrypt = (unsigned char*)"8 Bytes"; // 7 + [=10=]
BF_ecb_encrypt((unsigned char*)arr_ptr, ciphertext, &bfKey, BF_ENCRYPT);
unsigned char* ret = new unsigned char[BF_BLOCK + 1];
strcpy((char*)ret, (char*)ciphertext);
ret[BF_BLOCK + 1] = '[=10=]';
char* base_enc = OpenSSL_Base64::Base64Encode((char*)ret, strlen((char*)ret));
cout << base_enc << endl;
cin.get();
return 0;
}
但是我得到了错误的输出:
fy7maf+FhmbM
我检查了一下:
http://sladex.org/blowfish.js/
应该是:fEcC5/EKDVY=
Base64:
问题是 ret
可能包含一个空字节,加密是基于 8 位字节的,而不是基于字符的,并且将包含 0-255 的完整范围内的值。 strlen
将在它找到的第一个空字节处终止,给出的长度小于加密数据的全长。
注意:使用加密时要注意提供准确正确的长度参数和数据,不要依赖padding。 (例外情况是支持数据填充的加密函数的输入数据,例如 PKCS#7(née PKCS#5)填充。