openssl aes128 应用程序

原创 2018年04月17日 11:35:22

本文记录 使用 openssl aes128 进行文件加密的应用程序。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define ENCRYPT_MODULE_DBG
#ifndef ENCRYPT_MODULE_DBG
#define DBG(s...)   ((void) 0)
#else
#define DBG(fmt, arg...)    printf("[encrypt_module %d] "fmt, __LINE__, ##arg)
#endif

#define ERR(fmt, arg...)                                    \
    do {                                                    \
        printf("[encrypt_module %d] "fmt, __LINE__, ##arg); \
        exit(-1);                                           \
    } while (0)

#define GET_PADDING(size, align)    \
    ((((size) + (align) - 1) & ~((align) - 1)) - size)

#define PATH_MAX    1024
char command[PATH_MAX] = {0};
char path[PATH_MAX] = {0};
char file[PATH_MAX] = {0};

int main(int argc, char *argv[])
{
    DBG(" =================================== \n");
    DBG("|       *encrypt module tool*       |\n");
    DBG("|      argv[0]:encrypt_module       |\n");
    DBG("|      argv[1]:input file name      |\n");
    DBG("|      argv[2]:output file name     |\n");
    DBG(" =================================== \n");

    if (argc != 3) {
        ERR("ERROR:Usage: ./encrypt_module input_file output_file\n");
        exit(-1);
    }

    DBG("input file: %s\n", argv[1]);

    /*
     * TODO: You can customize your encryption algorithm,
     * the following is the sample code(AES128).
     */
    // 1.open input file
    FILE *fpin;
    long size = 0;
    fpin = fopen(argv[1], "rb");
    if (!fpin) {
        ERR("can't open %s\n", argv[1]);
        exit(-1);
    }
    fseek(fpin, 0, SEEK_END);
    size = ftell(fpin);
    if (size == 0) {
        ERR("%s size is zero!\n", argv[1]);
        exit(-1);
    }
    fseek(fpin, 0, SEEK_SET);

    // 2.create tmp file xxx.padding.aligned
    // *******************************************
    //      xxx.padding.aligned syntax
    //  syntax                          bits
    //  body length                      32
    //  body data                   argv[1] size
    //  padding
    // *******************************************
    char *tmp_str;
    memset(path, 0x00, sizeof(path));
    tmp_str = strrchr(argv[1], '/');
    if (tmp_str != NULL) {
        strncpy(path, (char *)&argv[1][0], (tmp_str - (char *)&argv[1][0]) + 1);
    } else {
        strncpy(path, "./", 2);
        tmp_str = argv[1];
    }
    memset(file, 0x00, sizeof(path));
    snprintf(file, PATH_MAX, "%s%s.padding.aligned", path, tmp_str);
    FILE *fpout;
    if ((fpout = fopen(file,"wb+")) == NULL) {
        ERR("create tmp %s.padding.aligned fail!\n", tmp_str);
        exit(-1);
    }

    // 3.insert 4 bytes of body length at the beginning of the file xxx.padding.aligned
    DBG("%s size: 0x%x\n", argv[1], size);
    unsigned char byte[4] = {0};
    byte[0] = (unsigned char)(size >> 24);
    byte[1] = (unsigned char)(size >> 16);
    byte[2] = (unsigned char)(size >> 8);
    byte[3] = (unsigned char)size;
    int i = 0;
    for (i = 0; i < 4; i++) {
        // DBG("byte = 0x%x\n", byte[i]);
        fputc(byte[i], fpout);
    }
    char *buf = (char *)malloc(size);
    if (buf == NULL) {
        ERR("malloc fail!\n");
        exit(-1);
    }
    memset(buf, 0x00, size);
    long count = 0;
    while ((count = fread(buf, 1, size, fpin)) != 0) {
        fwrite(buf, 1, count, fpout);
    }
    if (buf != NULL) {
        free(buf);
        buf = NULL;
    }

    // 4.padding: because the encryption algorithm(AES128) requires 16-byte alignment
    int padding = GET_PADDING((size + 4), 16);
    DBG("16-byte alignment requires %d bytes to be filled\n", padding);
    for (i = 0; i < padding; i++) {
        fputc(0xFF, fpout);
    }

    fclose(fpin);
    fclose(fpout);

    // 5.AES128 encrypt
    int err = 0;
    snprintf(command, PATH_MAX, "openssl enc -e -aes-128-cbc -K 82BDAC1428B29011971567477A10A091 -iv 82BDAC1428B29011971567477A10A091 -nosalt -nopad -in %s.padding.aligned -out %s", argv[1], argv[2]);
    err = system(command);
    if ((err == -1) || (WEXITSTATUS(err) != 0)) {
        DBG("err = %d\n", err);
        DBG("WEXITSTATUS(err) = %d\n", WEXITSTATUS(err));
        exit(-1);
    }

    DBG("output file: %s\n", argv[2]);

    return 0;
}

openssl的AES128加密总结

AES加密基本原理: 1.把明文按照128bit拆分成若干个明文块。 2.按照选择的填充方式来填充最后一个明文块。 3.每一个明文块利用AES加密器和密钥,加密成密文块。 4.拼接所有...
  • viewsky11
  • viewsky11
  • 2018-01-05 17:02:49
  • 201

AES128-ecb加解密

最近使用AES加解密的过程中遇到了一些问题,我这段采用的是openssl的AES.h的库进行加密的,因为传输的数据并不重要,考虑到并发性和安全性的原因,采用了AES128-ecb的加密模式,然而在和对...
  • u014436243
  • u014436243
  • 2017-12-08 01:54:20
  • 427

php AES128加密解密类的使用

AES128下载页(下载需要注册)require(./AES128.php); $aes=new AES128(); // 实例化$key=$aes->makeKey("china"); // key...
  • jom_ch
  • jom_ch
  • 2008-06-26 13:05:00
  • 1977

信息安全:OpenSSL之AES加密简单示例

AES      即高级加密标准,典型AES的基本操作是把128比特明文在128比特密钥的作用下加密成128比特密文。 函数      在openssl/openssl-1.0.1c/crypto/a...
  • Code_Thinking
  • Code_Thinking
  • 2014-12-05 22:54:38
  • 2910

一个PHP与JAVA使用AES128位加密通信示例

  • 2013年04月18日 17:48
  • 6KB
  • 下载

Linux下使用openssl的AES加密-CBC模式

最近需要用到AES加密,为了图方便就打算使用openssl自带的AES加密算法的API来实现。 主要用到了ECB和CBC两种加密模式。 ECB模式之前一篇已经写过了。这篇就写一下CBC模式。...
  • liuyueyi1995
  • liuyueyi1995
  • 2017-04-12 18:51:31
  • 1866

使用PHP7.1的openssl加解密AES-128-CBC,与7.0之前的版本匹配

因为老版本与线上环境的mcrypt不兼容,在php7.1上使用会报错,官网也说了:Warning This function has been DEPRECATED as of PHP 7.1.0....
  • buer2202
  • buer2202
  • 2017-12-20 14:53:07
  • 671

linux下面C 利用openssl的AES库加密,解密

OpenSSL提供了AES加解密算法的API const char *AES_options(void); AES算法状态,是全部支持或者是部分支持。 返回值:“aes(...
  • LunaW
  • LunaW
  • 2015-12-29 14:52:41
  • 6613

Openssl aes对称加密算法 加解密例程

假设我们已经下载了 openssl的源码,并成功编译,设置好了编程环境。 我们现在来看看如何调用openssl的API。 openssl对aes加密算法进行了良好的封装,调用接口简单明了,...
  • itmes
  • itmes
  • 2012-07-04 13:23:30
  • 5209

openssl AES 加密算法及代码实例

一、AES算法简介 1、AES算法介绍         密码学中的高级加密标准(Advanced Encryption Standard,AES),又称 Rijndael加密法,是美国联邦...
  • alan00000
  • alan00000
  • 2015-03-13 15:29:14
  • 3546
收藏助手
不良信息举报
您举报文章:openssl aes128 应用程序
举报原因:
原因补充:

(最多只允许输入30个字)