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