我想用C/C++编写一个小程序,它读取一个小文本文件,并使用"内部"键对其进行加密.然后我还想写另一个小程序,它可以使用内部相同的密钥解密加密文件.
我看了一下openSSL网站并用google搜索但发现不是简单的例子,有人试图做过这件事吗?
理想情况下,您可以使用现有工具ccrypt
,但这里是:
#include/* ... */ { 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)字节的块加密.
以前的答案指出了如何做你所要求的.
我想补充说明为什么你不应该这样做.
您所谈论的内容称为"对称加密"(相同的密钥用于加密和解密,而非对称加密,其中使用一个密钥加密的所有内容只能由特定对应方解密).
反汇编可执行文件以确定正在使用的硬编码密钥是琐碎的.这意味着,任何能够掌握您的可执行文件的人都可以破解任何已交换的消息的加密.
除非您考虑的应用程序非常具体,否则这意味着您的设置可能"看起来"安全,但事实并非如此.在这些情况下,通常最好不要加密,这样就没有人因为那种错误的安全感而陷入困境......
这是非常好,你正在寻找标准库做加密(而不是执行/创建算法自己),但protocoll(如何应用,密钥和信息的使用和交换)是至少作为密码本身一样重要.您可能希望由密码学专家测试您的想法,告诉您缺点.(我确信在StackOverflow这里有足够的那种.;-))