1.OpenSSL提供了AES加解密算法的API

const char *AES_options(void);

AES算法状态,是所有支持或者是部分支持。

返回值:“aes(full)” 或者"aes(partial)"

int AES_set_encrypt_key(const unsigned char *userKey, const int bits,AES_KEY *key);

设定加密用的Key;

userKey: 密钥数值。

bits:密钥长度,以bit为单位。假设密钥数字是16个字节,则此參数值应为128。

key: AES_KEY对象指针;

返回值: 0 成功, -1 userkey,key为空, -2: 密钥长度不是128。192。256;

int AES_set_decrypt_key(const unsigned char *userKey, const int bits,  AES_KEY *key);

设定解密用的Key;

userKey: 密钥数值;

bits:密钥长度,以bit为单位,假设密钥数字是16个字节。则此參数值应为128;

key: AES_KEY对象指针;

返回值: 0 成功, -1 userkey。key为空。 -2: 密钥长度不是128。192,256。

void AES_encrypt(const unsigned char *in, unsigned char *out,const AES_KEY *key);

AES 加密。加密单个数据块。in,out能够是同一内存区;

in: 须要加密的数据;

out: 加密后的数据。

key:AES 密钥。

void AES_decrypt(const unsigned char *in, unsigned char *out,const AES_KEY *key);

AES 解密。解密单个数据块,in。out能够是同一内存区;

in: 须要解密的数据。

out: 解密后的数据;

key:AES 密钥。

void AES_ecb_encrypt(const unsigned char *in, unsigned char *out,    const AES_KEY *key, const int enc);

AES加密/解密单个数据块,ECB模式

in: 须要加密/解密的数据;

out: 计算后输出的数据。

key:密钥

enc: AES_ENCRYPT 代表加密, AES_DECRYPT代表解密。

void AES_cbc_encrypt(const unsigned char *in, unsigned char *out,   size_t length, const AES_KEY *key,    unsigned char *ivec, const int enc);

AES加密/解密单个数据块,CBC模式

in: 须要加密/解密的数据;

out: 计算后输出的数据。

length: 数据长度

key:密钥

ivec: 初始向量

enc: AES_ENCRYPT 代表加密, AES_DECRYPT代表解密;

void AES_cfb128_encrypt(const unsigned char *in, unsigned char *out,
    size_t length, const AES_KEY *key,
    unsigned char *ivec, int *num, const int enc);
AES CFB128位模式加密/解密。输入输出数据区能够重叠。
in: 须要加密/解密的数据。
out: 计算后输出的数据;
length: 数据长度;
key: 密钥;
ivec: 初始化向量
num: 输出參数。计算状态。多少个CFB数据块
enc: 计算模式。 加密: AES_ENCRYPT 。 解密: AES_DECRYPT

void AES_cfb1_encrypt(const unsigned char *in, unsigned char *out,
    size_t length, const AES_KEY *key,
    unsigned char *ivec, int *num, const int enc);
AES CFB1位模式加密/解密。输入输出数据区能够重叠;
in: 须要加密/解密的数据;
out: 计算后输出的数据;
length: 数据长度;
key: 密钥;
ivec: 初始化向量
num: 输出參数,计算状态,多少个CFB数据块
enc: 计算模式, 加密: AES_ENCRYPT , 解密: AES_DECRYPT
    
    
void AES_cfb8_encrypt(const unsigned char *in, unsigned char *out,
    size_t length, const AES_KEY *key,
    unsigned char *ivec, int *num, const int enc);
AES CFB8位模式加密/解密。输入输出数据区能够重叠;
in: 须要加密/解密的数据;
out: 计算后输出的数据;
length: 数据长度;
key: 密钥;
ivec: 初始化向量
num: 输出參数,计算状态,多少个CFB数据块
enc: 计算模式, 加密: AES_ENCRYPT , 解密: AES_DECRYPT

void AES_ofb128_encrypt(const unsigned char *in, unsigned char *out,
    size_t length, const AES_KEY *key,
    unsigned char *ivec, int *num);
AES OFB128位模式加密/解密,输入输出数据区能够重叠;
in: 须要加密/解密的数据;
out: 计算后输出的数据。
length: 数据长度;
key: 密钥。
ivec: 初始化向量
num: 输出參数,计算状态,多少个CFB数据块
enc: 计算模式, 加密: AES_ENCRYPT , 解密: AES_DECRYPT

void AES_ctr128_encrypt(const unsigned char *in, unsigned char *out,
    size_t length, const AES_KEY *key,
    unsigned char ivec[AES_BLOCK_SIZE],
    unsigned char ecount_buf[AES_BLOCK_SIZE],
    unsigned int *num);
AES CTR128位模式加密/解密,输入输出数据区能够重叠;
in: 须要加密/解密的数据。
out: 计算后输出的数据;
length: 数据长度;
key: 密钥。
ivec: 初始化向量
ecount_buf: 输出參加,加密的次数,在第一次调用此函数时,须要初始化为0
num: 输出參数,计算状态,多少个CFB数据块,在第一次调用此函数时,须要初始化为0
enc: 计算模式。 加密: AES_ENCRYPT , 解密: AES_DECRYPT

void AES_ige_encrypt(const unsigned char *in, unsigned char *out,
             size_t length, const AES_KEY *key,
             unsigned char *ivec, const int enc);
AES 加密/解密,输入输出数据区能够重叠,初始化向量是加密数据块的2倍,加密前用前半部分做一次异或。加密后用后半部分做一次异或;
in: 须要加密/解密的数据;
out: 计算后输出的数据。
length: 数据长度;
key: 密钥;
ivec: 初始化向量
enc: 计算模式。 加密: AES_ENCRYPT , 解密: AES_DECRYPT

void AES_bi_ige_encrypt(const unsigned char *in, unsigned char *out,
            size_t length, const AES_KEY *key,
            const AES_KEY *key2, const unsigned char *ivec,
            const int enc);
AES 加密/解密。输入输出数据区能够重叠。初始化向量是加密数据块的4倍,加密前用第一部分做一次异或。加密后用第二部分做一次异或;
最后一个加密数据块,加密前用第三部分异或,加密后用第四部分异或;
in: 须要加密/解密的数据;
out: 计算后输出的数据;
length: 数据长度。
key: 密钥。
ivec: 初始化向量
enc: 计算模式, 加密: AES_ENCRYPT , 解密: AES_DECRYPT

int AES_wrap_key(AES_KEY *key, const unsigned char *iv,
        unsigned char *out,
        const unsigned char *in, unsigned int inlen)

用AES算法对明文key数据加密

key: AES Key,用于加密密钥数据

iv: 初始化向量

out: 加密后的密钥数据

in: 密钥数据

inlen: 密钥数据长度

返回值: 1: 成功。 0: 失败

int AES_unwrap_key(AES_KEY *key, const unsigned char *iv,
        unsigned char *out,
        const unsigned char *in, unsigned int inlen)

用AES算法对明文key数据加密

key: AES Key,用于加密密钥数据

iv: 初始化向量

out: 加密后的密钥数据

in: 密钥数据

inlen: 密钥数据长度

返回值: 1: 成功, 0: 失败

2.C实例分析

首先要了解AES加密是什么。以及几种加密模式的差别。之后才是编程。

ECB模式

  长处:

  1.简单;

  2.有利于并行计算。

  3.误差不会被传送。

  缺点:

  1.不能隐藏明文的模式;

  2.可能对明文进行主动攻击;

CBC模式:

  长处:

  1.不easy主动攻击,安全性好于ECB,适合传输长度长的报文,是SSL、IPSec的标准。

  缺点:

  1.不利于并行计算。

  2.误差传递。

  3.须要初始化向量IV

CFB模式:

  长处:

  1.隐藏了明文模式;

  2.分组password转化为流模式;

  3.能够及时加密传送小于分组的数据;

  缺点:

  1.不利于并行计算;

  2.误差传送:一个明文单元损坏影响多个单元;

  3.唯一的IV;

ofb模式:

  长处:

  1.隐藏了明文模式;

  2.分组password转化为流模式;

  3.能够及时加密传送小于分组的数据;

  缺点:

  1.不利于并行计算;

  2.对明文的主动攻击是可能的;

  3.误差传送:一个明文单元损坏影响多个单元;

了解这些加密模式之后,再看openssl提供的接口就好理解了。

aes.c 源代如下:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <openssl/aes.h>// out的内存大小需要注意 后边有 out += AES_BLOCK_SIZE
// 所以out 内存最小不能小于 AES_BLOCK_SIZE
int aes_encrypt(char* in, char* key, char* out)
{if (!in || !key || !out){return 0;}AES_KEY aes;if (AES_set_encrypt_key((unsigned char*)key, 128, &aes) < 0){return 0;}int len = strlen(in), en_len = 0;//输入输出字符串够长。而且是AES_BLOCK_SIZE的整数倍,须要严格限制while (en_len < len){AES_encrypt((unsigned char*)in, (unsigned char*)out, &aes);in   += AES_BLOCK_SIZE;out += AES_BLOCK_SIZE;en_len += AES_BLOCK_SIZE;}return 1;
}int aes_decrypt(char* in, char* key, char* out)
{if (!in || !key || !out){return 0;}AES_KEY aes;if (AES_set_decrypt_key((unsigned char*)key, 128, &aes) < 0){return 0;}int len = strlen(in), en_len = 0;while (en_len < len){AES_decrypt((unsigned char*)in, (unsigned char*)out, &aes);in  += AES_BLOCK_SIZE;out += AES_BLOCK_SIZE;en_len += AES_BLOCK_SIZE;}return 1;
}int main(int argc, char**argv)
{char *data, *key = "1111222", encrypt_buffer[100] = {0}, decrypt_buffer[100] = {0};size_t len;if (argc != 2){printf("请输入待加密的明文。\n");return -1;}data = argv[1];printf("原始数据:%s\n", data);len = strlen(data);printf("明文长度:%d\n", len);aes_encrypt(data, key, encrypt_buffer);printf("加密结果:%s\n", encrypt_buffer);aes_decrypt(encrypt_buffer, key, decrypt_buffer);printf("解密结果:%s\n", decrypt_buffer);
}

编译:

gcc aes.c -lssl -lcrypto

运行效果:

linux c openssl aes 加解密相关推荐

  1. Openssl Aes加解密使用示例

    Openssl Aes加解密使用示例 Aes简介 设置Aes密钥 Aes算法CBC加解密 Aes简介 Aes是分组加密算法,主要基于块加密,选取固定长度的密钥去加密明文中固定长度的块,生成的密文块与明 ...

  2. openssl aes加解密的使用

    1.先写一个用于生产二进制文件的工具 使用说明:新建main.c,将代码拷贝到main.c中,在linux环境下执行gcc main.c -o x,输出可执行文件x #include <stdi ...

  3. linux c openssl rsa 加解密

    1.PEM私钥文件格式 -----BEGIN RSA PRIVATE KEY----- -----END RSA PRIVATE KEY----- 生成该密钥的Linux命令:OpenSSL>g ...

  4. openssl c++实现bouncycastle中AES加解密

    0x01 为什么要用bouncycastle 先说说JCE(Java Cryptography Extension)是一组包,它们提供用于加密.密钥生成和协商以及 Message Authentica ...

  5. 利用openssl进行aes加解密

    之前写过aes加密算法简单说明,本篇用openssl对aes的ecb和cbc模式进行代码编写. 现在拿128位的aes加解密进行说明. 首先强调的是,在openssl提供的函数中,加密和解密每次只能针 ...

  6. linux证书存放路径,利用Tar和OpenSSL轻松加/解密文件和目录

    众所周知要想保护数据的安全比较简单快捷的方法无疑是给文件和目录进行加密的操作.相比于Windows给文件和目录进行加/解密的操作,在Linux上进行加/解密文件和目录要复杂一点.那么我们到底有没有什么 ...

  7. php aes 256 加解密,PHP完整的AES加解密算法使用及例子(256位)

    依赖PHP自身的mcrypt扩展 class aes { // CRYPTO_CIPHER_BLOCK_SIZE 32 private $_secret_key = 'default_secret_k ...

  8. AES加解密效率测试(纯软件AES128/256)--以嵌入式Cortex-M0与M3 平台为例

    目录 AES256/128 纯软件加解密时间效率测试--以Cortex-M0与M3 MCU为例 一.测试环境与方法: 二.测试代码介绍(以AES256为例) 三.测试结果与抓包截图 1.主频统一设置为 ...

  9. C语言实现AES加解密

    C语言实现AES加解密 AES算法 具体代码 AES算法 (AES)RIJNDAEL算法是一个数据块长度盒密钥长度都可变的分组加密算法,其数据块长度和密钥长度都可独立地选定为大于等于128位且小于等于 ...

最新文章

  1. log4cxx第三篇----使用多个logger
  2. vue 滚动条_轻量级 React.js 虚拟美化滚动条组件RScroll
  3. 看张子阳的书真是收获很多,也醒悟了很多(一)
  4. WCF学习之旅—实现支持REST客户端应用(二十四)
  5. 六招教你快速提升网站交互体验,降低跳出率
  6. 配色的协调性的重要性,你知道吗?
  7. 淘宝电影“追杀”猫眼电影,同门相争不可避免
  8. C# 通过DebugView进行调试
  9. 几个例子弄懂JS 的setInterval的运行方式
  10. [Canvas]空战游戏进阶 增加发射子弹 敌机中弹爆炸功能
  11. 丰田凯美瑞android系统,丰田第八代凯美瑞装了它,让中控“大脑”更智能!
  12. 第二章 西门子数控机床采集方案
  13. html style设置靠右,css怎么设置右对齐
  14. file xxx from install of xxx conflicts with file from xxx
  15. PCM开发板模块实验指导--无刷马达实验
  16. 基于Opencv的人脸&姓名&表情&年龄&种族&性别识别系统(源码&教程)
  17. _spellmod_leech_spell
  18. Linux系统1.md
  19. 高德地图 gps坐标偏移到火星坐标系
  20. 货郎问题的实例 c语言编程,货郎担问题的C语言解法

热门文章

  1. trickle 限制用户空间带宽
  2. 技术VS管理,哪个更重要?
  3. excel电子表格插件_电子表格的美好时光
  4. 华为鸿蒙删除视频报错rm: local.mp4: Owner died
  5. Spring JMS 整合Weblogic JMS(weblogicMQ)
  6. IDEA离线插件安装包下载方法
  7. 120行代码爬取电子书网站
  8. 微信如何设置延迟到账 | 微信到账时间设置在哪里设置 | 微信转账后24小时/2小时/立即到账怎么设置
  9. input和textarea设置placeholder属性的颜色、字体大小
  10. 通过页面验证hadoop是否安装成功的方法