ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

在C中加密纯文本文件

2019-06-21 19:39:25  阅读:201  来源: 互联网

标签:c-3 linux cryptography encryption


我目前正在用C语言编写一个从配置文件中读取的Linux应用程序.此配置文件包含一些我想要加密的数据,因此它不是纯文本.我花了几个小时研究这个并没有找到可行的解决方案.由于应用程序需要从配置中读取,因此我需要能够对其进行加密并在运行时对其进行解密.到目前为止研究我真的很喜欢openSSL加密库.我从命令行知道你可以这样做:

openssl enc -aes-256-cbc -salt -in file.txt -out file.enc

如果有人能提供一个如何在C中做到这一点的例子,那将是非常感激的.

解决方法:

你应该看一下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;
}

希望这会帮助你.

标签:c-3,linux,cryptography,encryption
来源: https://codeday.me/bug/20190621/1256715.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有