如何使用OpenSSL加密到Blowfish的消息?

时间:2016-09-29 15:51:51

标签: c++ encryption openssl blowfish

我需要使用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的:

http://pastebin.com/wNLZQxQT

1 个答案:

答案 0 :(得分:0)

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

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