26

我想用 C/C++ 编写一个小程序,它读取一个小文本文件,并使用“内部”密钥对其进行加密。然后我还想编写另一个小程序,它可以在内部使用相同的密钥解密加密文件。

我查看了 openSSL 站点并用谷歌搜索,但发现不是简单的例子,有人试过做这件事吗?

4

3 回答 3

24

理想情况下,您可以使用现有的工具,例如ccrypt,但这里是:

#include <openssl/aes.h>

/* ... */


{
  int bytes_read, bytes_written;
  unsigned char indata[AES_BLOCK_SIZE];
  unsigned char outdata[AES_BLOCK_SIZE];

  /* ckey and ivec are the two 128-bits keys necesary to
     en- and recrypt your data.  Note that ckey can be
     192 or 256 bits as well */
  unsigned char ckey[] =  "thiskeyisverybad";
  unsigned char ivec[] = "dontusethisinput";

  /* data structure that contains the key itself */
  AES_KEY key;

  /* set the encryption key */
  AES_set_encrypt_key(ckey, 128, &key);

  /* set where on the 128 bit encrypted block to begin encryption*/
  int num = 0;

  while (1) {
    bytes_read = fread(indata, 1, AES_BLOCK_SIZE, ifp);

    AES_cfb128_encrypt(indata, outdata, bytes_read, &key, ivec, &num,
           AES_ENCRYPT);

    bytes_written = fwrite(outdata, 1, bytes_read, ofp);
    if (bytes_read < AES_BLOCK_SIZE)
  break;
  }
}

解密是通过调用AES_cfb128_encryptwithAES_DECRYPT作为最后一个参数来完成的。请注意,此代码只提供了最基本的测试,并且您确实应该为 ckey 和 ivec 使用适当的 8 位随机数据​​。

编辑:它似乎AES_cfb128_encrypt接受任意长度的数据,因此您不需要以AES_BLOCK_SIZE(16) 字节的块进行加密。

于 2009-06-18T06:09:37.607 回答
14

以前的答案已向您指出如何按照您的要求进行操作。

我想补充一下为什么你可能不应该这样做

您所说的称为“对称加密”(相同的密钥用于加密和解密,而不是非对称加密,使用一个密钥加密的所有内容只能由特定的对应方解密)。

反汇编可执行文件以确定正在使用的硬编码密钥几乎是微不足道的。这意味着,任何人只要掌握了您的一个可执行文件,就可以破解任何曾经交换过的消息的加密。

除非您想到的应用程序非常具体,否则这意味着您的设置可能“看起来”安全,但实际上并非如此。在这些情况下,通常最好根本不加密,以免相关人员陷入这种虚假的安全感……

您正在寻找标准库来进行加密非常好(而不是自己实现/创建算法),但是协议如何使用和交换应用程序、密钥和消息)至少与密码本身一样重要。您可能希望让从事密码学的人测试您的想法,以告诉您其中的弱点。(我敢肯定 StackOverflow 有足够的这种类型。;-))

于 2009-06-18T13:39:21.623 回答
1

OpenSSL 特别关注实现 SSL 和 TLS,它们是通过网络加密数据的协议。由于您只是想加密文件,因此可以使用 OpenSSL,但并不理想。

相反,我会使用BeeCryptCrypto++® Library 5.6.0之类的东西,它们都提供了使用示例。

于 2009-06-17T15:14:06.157 回答