我目前正在用C语言编写一个从配置文件中读取的Linux应用程序。此配置文件包含一些我想要加密的数据,因此它不是纯文本。我花了几个小时研究这个并没有找到可行的解决方案。由于应用程序需要从配置中读取,因此我需要能够对其进行加密并在运行时对其进行解密。到目前为止研究我真的很喜欢openSSL加密库。我从命令行知道你可以做到:
openssl enc -aes-256-cbc -salt -in file.txt -out file.enc
如果有人能提供我在C中如何做到这一点的例子,那将是非常感激的。
答案 0 :(得分:4)
你应该看一下O'Reilly-Book。有几个关于如何加密事物的例子。不幸的是,最多的是网络加密。
我在书中找到了一个例子,但没有测试它:
#include <openssl/evp.h>
int main(int argc, char *argv[])
{
EVP_CIPHER_CTX ctx;
char key[EVP_MAX_KEY_LENGTH];
char iv[EVP_MAX_IV_LENGTH];
char *ct, *out;
char final[EVP_MAX_BLOCK_LENGTH];
char str[] = "123456789abcdef";
int i;
if (!seed_prng())
{
printf("Fatal Error! Unable to seed the PRNG!\n");
abort();
}
select_random_key(key, EVP_MAX_KEY_LENGTH);
select_random_iv(iv, EVP_MAX_IV_LENGTH);
EVP_EncryptInit(&ctx, EVP_bf_cbc(), key, iv);
ct = encrypt_example(&ctx, str, strlen(str), &i);
printf("Ciphertext is %d bytes.\n", i);
EVP_DecryptInit(&ctx, EVP_bf_cbc(), key, iv);
out = decrypt_example(&ctx, ct, 8);
printf("Decrypted: >>%s<<\n", out);
out = decrypt_example(&ctx, ct + 8, 8);
printf("Decrypted: >>%s<<\n", out);
if (!EVP_DecryptFinal(&ctx, final, &i))
{
printf("Padding incorrect.\n");
abort();
}
final[i] = 0;
printf("Decrypted: >>%s<<\n", final);
}
char *encrypt_example(EVP_CIPHER_CTX *ctx, char *data, int inl, int *rb)
{
char *ret;
int i, tmp, ol;
ol = 0;
ret = (char *)malloc(inl + EVP_CIPHER_CTX_block_size(ctx));
for (i = 0; i < inl / 100; i++)
{
EVP_EncryptUpdate(ctx, &ret[ol], &tmp, &data[ol], 100);
ol += tmp;
}
if (inl % 100)
{
EVP_EncryptUpdate(ctx, &ret[ol], &tmp, &data[ol], inl%100);
ol += tmp;
}
EVP_EncryptFinal(ctx, &ret[ol], &tmp);
*rb = ol + tmp;
return ret;
}
char *decrypt_example(EVP_CIPHER_CTX *ctx, char *ct, int inl)
{
/* We're going to null-terminate the plaintext under the assumption it's
* non-null terminated ASCII text. The null can be ignored otherwise.
*/
char *pt = (char *)malloc(inl + EVP_CIPHER_CTX_block_size(ctx) + 1);
int ol;
EVP_DecryptUpdate(ctx, pt, &ol, ct, inl);
if (!ol) /* there's no block to decrypt */
{
free(pt);
return NULL;
}
pt[ol] = 0;
return pt;
}
希望这会对你有所帮助。
答案 1 :(得分:1)
您可以将EVP_bf_cbc()
替换为EVP_aes_128_cbc() EVP_aes_192_cbc() or EVP_aes_256_cbc()
,具体取决于您的需求。
答案 2 :(得分:0)
您需要SSL开发包。 (Ubuntu中的libssl-dev)。根据您的实现方式,您还需要libcrypto-dev。
答案 3 :(得分:0)
我不是一个伟大的O'Reilly粉丝,但我发现this本书在第一次开始这类事情时非常有帮助。
答案 4 :(得分:0)
为什么不做自己的?从dev / random(您的密钥)读取足够的字节,并用它对配置文件进行异或。要解密,请使用相同的密钥再次进行异或。这很简单,快速且安全。不需要复杂的库。