OpenSSL常用函数分类索引
OpenSSL常用函数分类索引
内存管理
void *OPENSSL_malloc(size_t num)
void *OPENSSL_zalloc(size_t num)
void *OPENSSL_realloc(void *addr, size_t num)
void *OPENSSL_memdup(void *data, size_t s)
void OPENSSL_free(void *addr)char *OPENSSL_strdup(const char *str)
char *OPENSSL_strndup(const char *str, size_t s)
size_t OPENSSL_strlcat(char *dst, const char *src, size_t size);
size_t OPENSSL_strlcpy(char *dst, const char *src, size_t size);void *OPENSSL_clear_realloc(void *p, size_t old_len, size_t num)
void OPENSSL_clear_free(void *str, size_t num)
void OPENSSL_cleanse(void *ptr, size_t len);
抽象IO库BIO
二进制数据与字符串互转
与16进制字符串互转
unsigned char *OPENSSL_hexstr2buf(const char *str, long *len);
char *OPENSSL_buf2hexstr(const unsigned char *buffer, long len);
int OPENSSL_hexchar2int(unsigned char c);
与base64字符串互转
#include <openssl/evp.h>EVP_ENCODE_CTX *EVP_ENCODE_CTX_new(void);
void EVP_ENCODE_CTX_free(EVP_ENCODE_CTX *ctx);
int EVP_ENCODE_CTX_copy(EVP_ENCODE_CTX *dctx, EVP_ENCODE_CTX *sctx);
int EVP_ENCODE_CTX_num(EVP_ENCODE_CTX *ctx);
void EVP_EncodeInit(EVP_ENCODE_CTX *ctx);
int EVP_EncodeUpdate(EVP_ENCODE_CTX *ctx, unsigned char *out, int *outl,const unsigned char *in, int inl);
void EVP_EncodeFinal(EVP_ENCODE_CTX *ctx, unsigned char *out, int *outl);
int EVP_EncodeBlock(unsigned char *t, const unsigned char *f, int n);void EVP_DecodeInit(EVP_ENCODE_CTX *ctx);
int EVP_DecodeUpdate(EVP_ENCODE_CTX *ctx, unsigned char *out, int *outl,const unsigned char *in, int inl);
int EVP_DecodeFinal(EVP_ENCODE_CTX *ctx, unsigned char *out, int *outl);
int EVP_DecodeBlock(unsigned char *t, const unsigned char *f, int n);
哈希算法
MD5/MD4/MD2
一步式操作
unsigned char *MD5(const unsigned char *d, unsigned long n, unsigned char *md);
三段式操作
int MD5_Init(MD5_CTX *c); int MD5_Update(MD5_CTX *c, const void *data, unsigned long len); int MD5_Final(unsigned char *md, MD5_CTX *c);
SHA1/SHA224/SHA256/SHA384/SHA512
一步式操作
unsigned char *SHA1(const unsigned char *d, size_t n, unsigned char *md);
三段式操作
int SHA1_Init(SHA_CTX *c); int SHA1_Update(SHA_CTX *c, const void *data, size_t len); int SHA1_Final(unsigned char *md, SHA_CTX *c);
对称加密
DES加解密
DES加解密模式参考man des_modes
命令
常用的模式有:
1. ecb
2. cbc
DES加解密相关API参考man DES_random_key
命令
加密过程有:
1. 单次加密:DES_ecb_encrypt 和 DES_xxx_encrypt
2. 双密码三次加密:DES_ecb2_encrypt 和 DES_ede2_xxx_encrypt
3. 三密码三次加密:DES_ecb3_encrypt 和 DES_ede3_xxx_encrypt
其中xxx是加密模式,对于cbc单次加密,应使用DES_ncbc_encrypt
密码每个字节的LSB是校验位,一组密码8个字节除了校验位,有效位只有56位,双密码是112位,三密码就是168位;
使用DES加密需要选择加密模式、加密过程、设置密钥,对使用初始向量的加密模式还需要设置初始向量,加密模式加密过程通常为双方约定,密钥和初始向量则通过握手过程协商获得或通过其他渠道获得。
使用步骤:
生成或者获取密钥:
void DES_random_key(DES_cblock *ret);
需要从密码字符串生成密钥,推荐使用hash算法,而不是用DES_string_to_key或DES_string_to_2key
根据需要对密钥设置奇校验
void DES_set_odd_parity(DES_cblock *key);
根据需要检查密钥强度
int DES_is_weak_key(const_DES_cblock *key);
由密钥生成key_schedule
int DES_set_key_checked(const_DES_cblock *key, DES_key_schedule *schedule);
void DES_set_key_unchecked(const_DES_cblock *key, DES_key_schedule *schedule);
对于需要初始向量的加密模式,还需要选择或生成初始向量
执行加解密
void DES_ecb_encrypt(const_DES_cblock *input, DES_cblock *output,DES_key_schedule *ks, int enc);
void DES_ecb2_encrypt(const_DES_cblock *input, DES_cblock *output,DES_key_schedule *ks1, DES_key_schedule *ks2, int enc);
void DES_ecb3_encrypt(const_DES_cblock *input, DES_cblock *output,DES_key_schedule *ks1, DES_key_schedule *ks2,DES_key_schedule *ks3, int enc);void DES_ncbc_encrypt(const unsigned char *input, unsigned char *output,long length, DES_key_schedule *schedule, DES_cblock *ivec,int enc);
void DES_ede2_cbc_encrypt(const unsigned char *input, unsigned char *output,long length, DES_key_schedule *ks1,DES_key_schedule *ks2, DES_cblock *ivec, int enc);
void DES_ede3_cbc_encrypt(const unsigned char *input, unsigned char *output,long length, DES_key_schedule *ks1,DES_key_schedule *ks2, DES_key_schedule *ks3,DES_cblock *ivec, int enc);
其他对称加密算法还有AES、Blowfish、CAST、IDEA、RC2、RC5,都支持电子密码本模式(ECB)、加密分组链接模式(CBC)、加密反馈模式(CFB)和输出反馈模式(OFB)四种常用的分组密码加密模式。其中,AES使用的加密反馈模式(CFB)和输出反馈模式(OFB)分组长度是128位,其它算法使用的则是64位。
以上都是分组加密算法,分组加密每次计算需要一种数据(64位或128位),对于最后一组数据位数不够时根据约定补padding,中间过程如果数据不够需要等待。下面介绍的是流式加密算法RC4
RC4加解密
生成密钥
void RC4_set_key(RC4_KEY *key, int len, const unsigned char *data);
数据加解密
void RC4(RC4_KEY *key, unsigned long len, const unsigned char *indata,unsigned char *outdata);
大数操作BN
BN与字符串互转
char *BN_bn2hex(const BIGNUM *a);
char *BN_bn2dec(const BIGNUM *a);
int BN_hex2bn(BIGNUM **a, const char *str);
int BN_dec2bn(BIGNUM **a, const char *str);
BN与二进制内存数据互转
int BN_bn2bin(const BIGNUM *a, unsigned char *to);
int BN_bn2binpad(const BIGNUM *a, unsigned char *to, int tolen);
BIGNUM *BN_bin2bn(const unsigned char *s, int len, BIGNUM *ret);
BN输出到文件
int BN_print(BIO *fp, const BIGNUM *a);
int BN_print_fp(FILE *fp, const BIGNUM *a);
PEM文件操作
PEM格式密钥保存和读取
int PEM_write_RSAPrivateKey(FILE *fp, RSA *x, const EVP_CIPHER *enc,unsigned char *kstr, int klen,pem_password_cb *cb, void *u);
int PEM_write_bio_RSAPrivateKey(BIO *bp, RSA *x, const EVP_CIPHER *enc,unsigned char *kstr, int klen,pem_password_cb *cb, void *u);
int PEM_write_RSAPublicKey(FILE *fp, RSA *x);
int PEM_write_bio_RSAPublicKey(BIO *bp, RSA *x);
int PEM_write_RSA_PUBKEY(FILE *fp, RSA *x);
int PEM_write_bio_RSA_PUBKEY(BIO *bp, RSA *x);RSA *PEM_read_RSAPrivateKey(FILE *fp, RSA **x,pem_password_cb *cb, void *u);
RSA *PEM_read_bio_RSAPrivateKey(BIO *bp, RSA **x,pem_password_cb *cb, void *u);
RSA *PEM_read_RSAPublicKey(FILE *fp, RSA **x,pem_password_cb *cb, void *u);
RSA *PEM_read_bio_RSAPublicKey(BIO *bp, RSA **x,pem_password_cb *cb, void *u);
RSA *PEM_read_RSA_PUBKEY(FILE *fp, RSA **x,pem_password_cb *cb, void *u);
RSA *PEM_read_bio_RSA_PUBKEY(BIO *bp, RSA **x,pem_password_cb *cb, void *u);
EVP接口
int PEM_write_bio_PrivateKey(BIO *bp, EVP_PKEY *x, const EVP_CIPHER *enc,unsigned char *kstr, int klen,pem_password_cb *cb, void *u);
int PEM_write_bio_PrivateKey_traditional(BIO *bp, EVP_PKEY *x,const EVP_CIPHER *enc,unsigned char *kstr, int klen,pem_password_cb *cb, void *u);
int PEM_write_PrivateKey(FILE *fp, EVP_PKEY *x, const EVP_CIPHER *enc,unsigned char *kstr, int klen,pem_password_cb *cb, void *u);
int PEM_write_bio_PUBKEY(BIO *bp, EVP_PKEY *x);
int PEM_write_PUBKEY(FILE *fp, EVP_PKEY *x);EVP_PKEY *PEM_read_bio_PrivateKey(BIO *bp, EVP_PKEY **x,pem_password_cb *cb, void *u);
EVP_PKEY *PEM_read_PrivateKey(FILE *fp, EVP_PKEY **x,pem_password_cb *cb, void *u);
EVP_PKEY *PEM_read_bio_PUBKEY(BIO *bp, EVP_PKEY **x,pem_password_cb *cb, void *u);
EVP_PKEY *PEM_read_PUBKEY(FILE *fp, EVP_PKEY **x,pem_password_cb *cb, void *u);
非对称加密
RSA加解密
生成密钥
int RSA_generate_key_ex(RSA *rsa, int bits, BIGNUM *e, BN_GENCB *cb);
int RSA_generate_multi_prime_key(RSA *rsa, int bits, int primes, BIGNUM *e, BN_GENCB *cb);
密钥参数打印
int RSA_print(BIO *bp, RSA *x, int offset);
int RSA_print_fp(FILE *fp, RSA *x, int offset);```
密钥的提取和指定
void RSA_get0_key(const RSA *r,const BIGNUM **n, const BIGNUM **e, const BIGNUM **d);
int RSA_set0_key(RSA *r, BIGNUM *n, BIGNUM *e, BIGNUM *d);
有了公钥和私钥数据n,e,d,就可以结合BN(BIGNUM)相关函数做任意格式的保存;但经常使用的方法是配合使用PEM相关的API来保存和读取公钥与私钥数据
密钥的保存和读取
参考前面PEM格式密钥保存和读取
检测私钥是否正确
#include <openssl/rsa.h>int RSA_check_key_ex(RSA *rsa, BN_GENCB *cb);int RSA_check_key(RSA *rsa);
加解密
#include <openssl/rsa.h>int RSA_public_encrypt(int flen, const unsigned char *from,unsigned char *to, RSA *rsa, int padding);int RSA_private_decrypt(int flen, const unsigned char *from,unsigned char *to, RSA *rsa, int padding);
以下私钥加密,公钥解密方法通常用于签名
#include <openssl/rsa.h>int RSA_private_encrypt(int flen, unsigned char *from,unsigned char *to, RSA *rsa, int padding);int RSA_public_decrypt(int flen, unsigned char *from,unsigned char *to, RSA *rsa, int padding);
签名和验签
#include <openssl/rsa.h>int RSA_sign(int type, const unsigned char *m, unsigned int m_len,unsigned char *sigret, unsigned int *siglen, RSA *rsa);int RSA_verify(int type, const unsigned char *m, unsigned int m_len,unsigned char *sigbuf, unsigned int siglen, RSA *rsa);
OpenSSL常用函数分类索引相关推荐
- php 数组合并_PHP数组常用函数分类整理
微信公众号:PHP在线 PHP数组常用函数分类整理 一.数组操作的基本函数 数组的键名和值array_values($arr); 获得数组的值array_keys($arr); 获得数组的键名arra ...
- SQL常用函数、索引、视图、序列
一.SQL常用函数 1.sysdate:当前的日期包含时间 select sysdate from dual; 2.length(str)函数:返回字符串的长度,str表示一个字符串 select l ...
- MySQL运算符,函数,索引,图形化管理工具
文章目录 运算符 算术运算符 比较运算符 逻辑运算符 MySQL运算符 数字函数 字符串函数 日期时间函数 条件函数 系统信息函数 加密函数 其他常用函数 MySQL索引 索引的概念 索引的分类 创建 ...
- numpy随机生成01矩阵_Python数据分析Numpy库常用函数详解,提到循环就该想到的库...
Python进行数据分析的核心库肯定是Pandas,该库差不多可以解决结构化数据的绝大部分处理需求.在<Python数据分析常用函数及参数详解,可以留着以备不时之需 >一文中也已经对该库的 ...
- mysql学习总结-初识+数据管理+增删改查+常用函数+事务理解+数据库设计+JDBC引入
1.初识MySQL 1.1数据库的定义 数据库(DataBase,简称DB),是一个按数据结构来存储和管理数据的计算机软件系统.每个数据库都有一个或多个不同的 API 用于创建,访问,管理,搜索和复制 ...
- 《SQL高级应用和数据仓库基础(MySQL版)》学习笔记 ·008【常用函数】
文章目录 一.常用函数 1.建议 2.MySQL函数概述 3.常用函数分类 一.常用函数 1.建议 使用函数时,建议将MySQL升级为8.0版本 2.MySQL函数概述 单行函数 语法 函数名(参数列 ...
- MYSQL天花板函数和地板函数_2020-08-04常用函数
•单行函数语法 –语法: 函数名[(参数1,参数2,-)] –其中的参数可以是以下之一: •变量 •列名 •表达式 •单行函数特征 –单行函数对单行操作 –每行返回一个结果 –有可能返回值与原参数数据 ...
- Oracle 语言分类 数据类型 数据类型转换 常用函数 集合操作 子查询
SQL分类 SQL(Structure Query Language)语言是数据库的核心语言.SQL语言共分为四大类:数据定义语言DDL,数据操纵语言DML,数据查询语言DQL,数据控制语言DCL.1 ...
- 函数分类,HIVE CLI命令,简单函数,聚合函数,集合函数,特殊函数(窗口函数,分析函数,混合函数,UDTF),常用函数Demo
1.1. 函数分类 1.2. HIVE CLI命令 显示当前会话有多少函数可用 SHOW FUNCTIONS; 显示函数的描述信息 DESC FUNCTION concat; 显示函数的扩展描述信 ...
最新文章
- 使用EF Oracle实现DevExpress绑定大数据的ServerMode模式
- DOM事件与jQuery事件的是非纠葛
- 和谐社区,和谐技术:微软的宠儿们,为什么富人的孩子就不能早当家?
- flex布局,属性用法
- 第三回 Bootstrap3.x 起步
- [转载] Python 完整实现的简单遗传算法(SGA)
- 绘图的尺寸_【科研绘图1】你离顶级期刊封面仅差一步
- opencv 学习之 亮度检测
- 快闪ppt音乐_冬日午后南昌路,音乐快闪引人驻足
- HTML+CSS 制作下拉菜单
- Mysql数据库的tinyint类型
- 电子商务复习笔记三:网络营销
- lisp实心圆点怎么画_cad中怎么样画实心圆点
- Android-你真的懂AIDL的oneway嘛?
- python输入一个三位整数、输出三位数之和_编写程序,从键盘输入一个3位的正整数,输出它的百位数,十位数和个位数,并且计算它的和...
- c语言less函数,LESS使用方法
- 金融量化-金叉和死叉
- python offset函数_Python Pandas tseries.offsets.BusinessHour.copy用法及代码示例
- 【Rust每周一库】sled - 嵌入式数据库
- 使用esp8266 wifi芯片和DFRduino开发板(Arduino也可以),向自己的服务器发送请求(尽可能详细的说明)