linux以下C 利用openssl的AES库加密,解密
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: 失败
C实例分析:
首先要了解AES加密是什么。以及几种加密模式的差别。之后才是编程。
详细的编程案例,在以下的链接。
openssl之aes加密(AES_cbc_encrypt 与 AES_encrypt 的编程案例)
看源代码。
- int aes_encrypt(char* in, char* key, char* out)//, int olen)
- {
- 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;
- while(en_len<len)//输入输出字符串够长。而且是AES_BLOCK_SIZE的整数倍,须要严格限制
- {
- 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;
- }
分组对称加密模式:ECB/CBC/CFB/OFB缺CTR
http://fossies.org/dox/openssl-1.0.1f/index.html (具体源代码)
--建立文件test.txt, 特意写入中英文
# cd /tmp
# echo "test測试" > test.txt
--開始加密, 使用aes-128-cbc算法, 也能够使用其它算法, 通过查看openssl的帮助可获知
# openssl aes-128-cbc -salt -in test.txt -out test.txt.aes
enter aes-128-cbc encryption password:<输入密码>
Verifying - enter aes-128-cbc encryption password:<确认密码>
--查看加密前后的文件大小, 加密后文件明显增大了
# ll test.txt*
-rw-r--r-- 1 root root 9 Aug 11 15:42 test.txt
-rw-r--r-- 1 root root 32 Aug 11 15:43 test.txt.aes
--查看加密前后的文件内容, 加密后文件无法直接查看, 显示乱码
# cat test.txt
test測试
# cat test.txt.aes
Salted__碾RTqm6棚顱
--如今開始解密, 会提示输入password, 假设password有误则无法解密
# openssl aes-128-cbc -d -salt -in test.txt.aes -out test.txt.out
enter aes-128-cbc decryption password:<输入错误密码>
bad decrypt
6150:error:06065064:digital envelope routines:EVP_DecryptFinal:bad decrypt:evp_enc.c:438:
# openssl aes-128-cbc -d -salt -in test.txt.aes -out test.txt.out
enter aes-128-cbc decryption password:<输入正确密码>
--查看解密前后的文件大小, 和加密前是一样的
# ll test.txt*
-rw-r--r-- 1 root root 9 Aug 11 15:42 test.txt
-rw-r--r-- 1 root root 32 Aug 11 15:43 test.txt.aes
-rw-r--r-- 1 root root 9 Aug 11 15:45 test.txt.out
--查看解密前后的文件内容, 和加密前是一样的
# cat test.txt.out
test測试
这样的方法很适合Linux下的文件内容保密, 呵呵....以上命令加參数比較复杂, 我们能够把命令加參数做个函数, 然后放到.bash_profile里, 这样每次登陆后直接使用函数就可以, 例如以下:
function jiami()
{
/usr/bin/openssl aes-128-cbc -salt -in $1 -out $1.aes && rm -f $1
}
function jiemi()
{
/usr/bin/openssl aes-128-cbc -d -salt -in $1.aes -out $1 && rm -f $1.aes
}
然后就能够例如以下使用了(注意输入參数都是原文件名称, 且会自己主动删除原文件):
# jiami test.txt
enter aes-128-cbc encryption password:
Verifying - enter aes-128-cbc encryption password:
# jiemi test.txt
enter aes-128-cbc decryption password:
# ll test.txt*
-rw-r--r-- 1 root root 9 Aug 11 15:46 test.txt
-rw-r--r-- 1 root root 9 Aug 11 15:45 test.txt.out
--End--
linux以下C 利用openssl的AES库加密,解密的更多相关文章
- JS和利用openssl的object C加密得到相同的aes加密密文
这是之前接到的一个工作内容,项目原本的登录操作是获得账号和密码以后,对密码进行一遍MD5加密,然后传递账号和密文到cgi文件.在c中获取到账户以后,从数据库中获取到密码,对密码进行一次MD5的加密,然 ...
- 利用openssl进行BASE64编码解码、md5/sha1摘要、AES/DES3加密解密
国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...
- PHP7.* AES的加密解密
之前写过一篇: PHP AES的加密解密-----[弃用] 使用的是php5.*之前的mcrypt_decrypt 函数,该函数已经在php7.1后弃用了,上马的是openssl的openssl_en ...
- PHP AES的加密解密
AES加密算法 密码学中的高级加密标准(Advanced Encryption Standard,AES),又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准.这个标准用来替代原先的DE ...
- Golang之AES/DES加密解密
AES/DES加密/解密涉及4个概念:1. Block, 也叫分组, 相应加密/解密的算法. 2. BlockMode, 模式, 相应加密/解密的处理.3. InitalVectory, 初始向量4. ...
- AES在线加密解密-附AES128,192,256,CBC,CFB,ECB,OFB,PCBC各种加密解密源码
一.AES在线加密解密:AES 128/192/256位CBC/CFB/ECB/OFB/PCBC在线加密解密|在线工具|在线助手|在线生成|在线制作 http://www.it399.com/aes ...
- PHP AES的加密解密-----【弃用】
mcrypt_decrypt在PHP7.*已经被弃用,取而代之的是openssl_decrypt/encrypt,请参考: PHP7.* AES的加密解密 AES加密算法 密码学中的高级加密标准(Ad ...
- PHP 服务端 和 APP 客户端 实现 RSA+AES 双向加密解密
目的:服务端和移动端双向加密解密 共有七个文件 其中包括三个类文件 lib_aes.php aes对称加密解密类 server_rsa_crypt.php 服务端RSA公钥私钥非对称加密解密类 cli ...
- AES对称加密解密类
import java.io.UnsupportedEncodingException; import javax.crypto.Cipher; import javax.crypto.spec.Se ...
随机推荐
- http://www.cnblogs.com/langtianya/archive/2013/02/01/2889682.html
http://www.cnblogs.com/langtianya/archive/2013/02/01/2889682.html
- [转载]Oracle批量执行
FROM: http://www.cnblogs.com/wangyayun/p/4514411.html //批量添加20000条数据用时8秒. try { String url = "j ...
- 2017.11.21 查询某个字段为null的记录
注意,不使用 = null, 而是 is null. select fd_username, fd_tenantid, fd_validity from t_user WHERE fd_validit ...
- onbeforepaste事件用法
onkeyup="value=value.replace(/[^\d]/g,'')" onbeforepaste="clipboardData.setData('text ...
- 使用MyEclipse创建可执行jar
MyEclipse请从这里下载: http://pan.baidu.com/s/1o6Jm5vk 具体步骤: 右键点工程->Export->选择Java下面的Runnable Jar Fi ...
- Quartz任务监听器
在Quartz框架提供了JobListener接口,可在任务执行前.任务被拒绝及任务执行完成后实现对任务的拦截,该接口的声明如下: public interface JobListener { /** ...
- centos 6.5 下使用nginx 反向代理 多个tornado
centos 6.5 nginx 1.4.4 /etc/nginx/conf.d 下创建tornado.conf upstream tornado { server 127.0.0.1:8887; s ...
- windows系统下GCC的安装与配置
刚开始看 C++ Primer,看到编译器的部分,自己搜了搜怎么搭建GCC,搜到以下内容,复制过来留个印象: windows系统下GCC的安装方法,以及一些环境变量的配置,如果对GCC不是很清楚,关于 ...
- 《让LoadRunner走下神坛》
这几天碰到这么几件事情,觉得挺有意思的:1. 有个朋友问了我一个问题:LoadRunner的缺点在哪?然后我反问她:LoadRunner的优点在哪?她一时语塞,后来说:感觉都是优点没有什 ...
- iOS学习笔记-地图MapKit入门
代码地址如下:http://www.demodashi.com/demo/11682.html 这篇文章还是翻译自raywenderlich,用Objective-C改写了代码.没有逐字翻译,如有错漏 ...