我需要使用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,\0}
char *arr_ptr = &a_str[0];
//unsigned char* data_to_encrypt = (unsigned char*)"8 Bytes"; // 7 + \0
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] = '\0';
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的:
答案 0 :(得分:0)
问题是ret
可能包含空字节,加密是基于8位字节的,不是基于字符的,并且将包含来自整个范围0-255的值。 strlen
将在它找到的第一个空字节上终止,其长度小于加密数据的全长。
注意:使用加密时要特别注意提供精确正确的长度参数和数据,不要依赖填充。 (例外情况是输入数据到支持数据填充的加密函数,例如PKCS#7(néePKCS#5)填充。