前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >openssl使用-- 之 AES算法库使用

openssl使用-- 之 AES算法库使用

原创
作者头像
无限之生
修改2020-06-30 14:28:01
2.2K0
修改2020-06-30 14:28:01
举报
文章被收录于专栏:技术日记

树莓派上面使用openssl-- 之 AES算法库使用

1 OPENSSL 提供AES 库接口调用的两种方式

1.1 第一种方法,使用aes.h的方式

 aes.h 代码如下, 添加了中文注释表示含义

代码语言:javascript
复制
/*
 * Copyright 2002-2016 The OpenSSL Project Authors. All Rights Reserved.
 *
 * Licensed under the OpenSSL license (the "License").  You may not use
 * this file except in compliance with the License.  You can obtain a copy
 * in the file LICENSE in the source distribution or at
 * https://www.openssl.org/source/license.html
 */

#ifndef HEADER_AES_H
# define HEADER_AES_H

# include <openssl/opensslconf.h>

# include <stddef.h>
# ifdef  __cplusplus
extern "C" {
# endif

# define AES_ENCRYPT     1
# define AES_DECRYPT     0

/*
 * Because array size can't be a const in C, the following two are macros.
 * Both sizes are in bytes.
 */
# define AES_MAXNR 14
# define AES_BLOCK_SIZE 16

/* This should be a hidden type, but EVP requires that the size be known */
struct aes_key_st {
# ifdef AES_LONG
    unsigned long rd_key[4 * (AES_MAXNR + 1)];
# else
    unsigned int rd_key[4 * (AES_MAXNR + 1)];
# endif
    int rounds;
};
typedef struct aes_key_st AES_KEY;

/* AES算法状态,是全部支持或者是部分支持。
返回值:“aes(full)” 或者"aes(partial)" */
const char *AES_options(void);

/* 设定加密用的Key;
    userKey: 密钥数值;
    bits:密钥长度,以bit为单位,如果密钥数字是16个字节,则此参数值应为128;
    key: AES_KEY对象指针;
返回值: 0 成功, -1 userkey,key为空, -2: 密钥长度不是128,192,256;
*/
int AES_set_encrypt_key(const unsigned char *userKey, const int bits,
                        AES_KEY *key);
int AES_set_decrypt_key(const unsigned char *userKey, const int bits,
                        AES_KEY *key);

/*
AES 加密,加密单个数据块,in,out可以是同一内存区;
in: 需要加密的数据;
out: 加密后的数据;
key:AES 密钥;
*/
void AES_encrypt(const unsigned char *in, unsigned char *out,
                 const AES_KEY *key);
void AES_decrypt(const unsigned char *in, unsigned char *out,
                 const AES_KEY *key);

/*
AES加密/解密单个数据块,ECB模式
in: 需要加密/解密的数据;
out: 计算后输出的数据;
key:密钥
enc: AES_ENCRYPT 代表加密, AES_DECRYPT代表解密;
*/
void AES_ecb_encrypt(const unsigned char *in, unsigned char *out,
                     const AES_KEY *key, const int enc);

/*
AES加密/解密单个数据块,CBC模式
in: 需要加密/解密的数据;
out: 计算后输出的数据;
length: 数据长度
key:密钥
ivec: 初始向量
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 CFB128位模式加密/解密,输入输出数据区可以重叠;
in: 需要加密/解密的数据;
out: 计算后输出的数据;
length: 数据长度;
key: 密钥;
ivec: 初始化向量
num: 输出参数,计算状态,多少个CFB数据块
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);
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);
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);
void AES_ofb128_encrypt(const unsigned char *in, unsigned char *out,
                        size_t length, const AES_KEY *key,
                        unsigned char *ivec, int *num);

/*
AES 加密/解密,输入输出数据区可以重叠,初始化向量是加密数据块的2倍,加密前用前半部分做一次异或,加密后用后半部分做一次异或;
in: 需要加密/解密的数据;
out: 计算后输出的数据;
length: 数据长度;
key: 密钥;
ivec: 初始化向量
enc: 计算模式, 加密: AES_ENCRYPT , 解密: AES_DECRYPT
*/                       
/* NB: the IV is _two_ blocks long */
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 加密/解密,输入输出数据区可以重叠,初始化向量是加密数据块的4倍,加密前用第一部分做一次异或,加密后用第二部分做一次异或;
最后一个加密数据块,加密前用第三部分异或,加密后用第四部分异或;
in: 需要加密/解密的数据;
out: 计算后输出的数据;
length: 数据长度;
key: 密钥;
ivec: 初始化向量
enc: 计算模式, 加密: AES_ENCRYPT , 解密: AES_DECRYPT           
*/
/* NB: the IV is _four_ blocks long */
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算法对明文key数据加密
key: AES Key,用于加密密钥数据
iv: 初始化向量
out: 加密后的密钥数据
in: 密钥数据
inlen: 密钥数据长度
返回值: 1: 成功, 0: 失败
*/
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);


# ifdef  __cplusplus
}
# endif

#endif

1.1 第二种方法,使用EVP框架,示例如下

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 树莓派上面使用openssl-- 之 AES算法库使用
  • 1 OPENSSL 提供AES 库接口调用的两种方式
    • 1.1 第一种方法,使用aes.h的方式
      • 1.1 第二种方法,使用EVP框架,示例如下
      相关产品与服务
      SSL 证书
      腾讯云 SSL 证书(SSL Certificates)为您提供 SSL 证书的申请、管理、部署等服务,为您提供一站式 HTTPS 解决方案。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档