我想在C / C ++中编写一个小程序,它读取一个小文本文件,并使用“内部”键对其进行加密。然后我还想编写另一个小程序,它可以使用内部相同的密钥解密加密文件。
我查看了openSSL网站并用google搜索但发现不是简单的例子,有人试图做过这件事吗?
答案 0 :(得分:21)
理想情况下,您可以使用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_encrypt
作为最后一个参数调用AES_DECRYPT
来完成解密。请注意,除了最基本的测试之外,还没有给出这个代码,并且你真的应该为ckey和ivec使用正确的8位随机数据。
编辑:似乎AES_cfb128_encrypt
接受任意长度的数据,因此您不需要以AES_BLOCK_SIZE
(16)字节的块加密。
答案 1 :(得分:13)
以前的答案指出了如何做你要求的事情。
我想补充说明为什么你可能不应该这样做。
您所谈论的内容称为“对称加密”(相同的密钥用于加密和解密,而不是非对称加密,其中使用一个密钥加密的所有内容只能由特定对应方解密)。
反汇编可执行文件以确定正在使用的硬编码密钥是琐碎的。这意味着,任何能够获得您的可执行文件的人都可以破解任何已交换的消息的加密。
除非您考虑的应用程序非常具体,否则这意味着您的设置可能“看起来”安全,但事实并非如此。在这些情况下,通常最好不要加密,这样就没有人因为那种错误的安全感而陷入困境......
非常好,你正在寻找标准库来进行加密(而不是自己实现/创建算法),但 protocoll (如何应用程序,密钥,并且消息被使用和交换)至少与密码本身一样重要。您可能希望由密码学专家测试您的想法,告诉您缺点。 (我确信StackOverflow上有足够的那种。;-))
答案 2 :(得分:1)
OpenSSL专门用于实现SSL和TLS,它们是用于通过网络加密数据的协议。由于您只是想加密文件,因此可以使用OpenSSL但不理想。
相反,我会使用类似BeeCrypt或Crypto++® Library 5.6.0的内容,它们都提供了使用它们的示例。