Openssl AES

news/2024/7/22 4:24:33

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: 失败

 

转自:http://blog.csdn.net/sunspider107/article/details/7375816

感谢分享


http://www.niftyadmin.cn/n/3653122.html

相关文章

给Ajax技术初学者的一些建议

Yu Sueng你好:我推荐你先看一下《Ajax实战》,然后再看看《征服Ajax——Dojo、Prototype、script.aculo.us框架解析与实例》。这两本书的内容我感觉都不错。Ajax的核心内容是XMLHttpRequest对象,只要掌握了这个对象的使用方法,就可…

Redis介绍及常用命令

一 Redis介绍 Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。从2010年3月15日起,Redis的开发工作由VMware主持。 Redis能运行在大多数POSIX(Linux, *BSD, OS X 和Solaris等)系统…

如果你不肯告诉我你的架构所做的假设,我就认为你是在有意行骗

Fielding先生在其博士论文中,明确地给出了REST架构风格所基于的一些基本的假设。事实上,在任何一种架构风格中都存在着一些基本的假设,当然,作为架构风格的实例的某种特定的架构中也包含了这些假设。Fielding先生本人并不认为REST…

REST架构风格的性能为何比其他的架构风格更好

今天与一起翻译Fielding论文的朋友杨光讨论技术问题,杨光认为因为REST是基于文本来进行通信,所以其性能肯定不如基于二进制格式的通信协议好。因为这是一个对于REST的明显的误解,所以我觉得有必要专门在这里澄清一下。以下是我们的讨论内容&a…

Fielding的论文已经翻译完成

Fielding关于REST的经典论文我们已经翻译完成,已经发给国内的一些专家做review。我在两周后综合各位专家的review意见再做一次修订,然后就发给Fielding先生来发布。这篇论文绝对是所有做Web开发的人的必读,大家期待吧。

想当然和偏执狂都要不得!握其法而又能知其度,善莫大焉!

“劫后余生” 的感叹,及时写下以作日后之鉴!--------------------------------------------想当然是什么呢?是没有准备充分,尚未弄清楚事情的来龙去脉凭主管臆断,一言以蔽之,那是YY !偏执狂是什…

让 VMWare Workstation 5.5.3 能够在 Ubuntu 7.04 (Feisty Fawn)中正常运行!

今天查看Linux Kernel modules,忽然发现/lib/modules下面有一个旧内核的目录,好奇之下进去看看,结果有了新发现,里面还有一些残存的配置,从名称看来应该是VMWare相关的,难不成是当初安装的时候,…

FreeBSD 最小化安装 +diablo-jdk +Apache 与 Tomcat 整合 !

这篇文章算是补交很久之前的一篇作业,也顺便平息坛子里面很多同学的疑问!我先说明一下配置环境的大概情况:OSFreeBSD 6.2-RELEASEJDKdiablo-jdk-1.5.0.07.01Apacheapache-2.2.3Tomcattomcat-5.5.23具体的版本信息显示如下:[rootFr…