【问题标题】:Blowfish C++ does not correctly encrypt/decrypt.. why..?Blowfish C++ 不能正确加密/解密..为什么..?
【发布时间】:2011-07-10 16:56:27
【问题描述】:

我有这段测试代码,它使用 Blowfish (openssl/blowfish.h) 来加密,然后解密一个字符串。但是当它再次出现时,它并没有被正确解密。谁能告诉我为什么?

(复制自 OP 在http://pastebin.com/AaWSF5pX 的原件)

#include <stdlib.h>
#include <cstdio>
#include <string.h>
#include <iostream>
using namespace std;

int main(int argc, char **argv)
{
  // blowfish key
  const char *key = "h&6^5fVghasV_Fte";
  BF_KEY bfKey;
  BF_set_key(&bfKey, strlen(key), (const unsigned char*)key);

  // encrypt
  const unsigned char *inStr = (const unsigned char *)"hello world\0";
  unsigned char *outStr = (unsigned char *)malloc(sizeof(unsigned char) * 100);
  BF_ecb_encrypt(inStr, outStr, &bfKey, BF_ENCRYPT);

  // decrypt
  unsigned char buf[100];
  BF_ecb_encrypt((const unsigned char*)outStr, buf, &bfKey, BF_DECRYPT);
  std::cout << "decrypted: " << buf << "\n";
  free(outStr);

  return 0;
}

输入:“Hello World”

输出:“你好 wo4�\Z��”

【问题讨论】:

  • 请在问题中包含代码,而不是将其放在外部网站上

标签: c++ encryption blowfish


【解决方案1】:

Blowfish 在 64 位块上运行:即 8 字节的倍数。 BF_ecb_* 处理单个这样的块。那是字符串的前 8 个字符。 BF_ecb_* 忽略其余部分。如果您想加密更长的时间,如果您真的很乐意使用 ECB 模式,请在循环中将 BF_ecb_* 应用于一个又一个块,或者使用类似 BF_ofb_* 的东西。

【讨论】:

  • 您很可能需要填充输出和输入,使它们是 8 字节的倍数。
【解决方案2】:

来自BF_ecb_encrypt 手册页:

它使用密钥对in的前64位进行加密或解密,将结果放入out。

阅读文档。

【讨论】:

    猜你喜欢
    • 2015-09-25
    • 1970-01-01
    • 1970-01-01
    • 2018-12-23
    • 1970-01-01
    • 2015-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多