如何使用 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:

http://pastebin.com/wNLZQxQT

问题是 ret 可能包含一个空字节,加密是基于 8 位字节的,而不是基于字符的,并且将包含 0-255 的完整范围内的值。 strlen 将在它找到的第一个空字节处终止,给出的长度小于加密数据的全长。

注意:使用加密时要注意提供准确正确的长度参数和数据,不要依赖padding。 (例外情况是支持数据填充的加密函数的输入数据,例如 PKCS#7(née PKCS#5)填充。