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

  1. 一步式操作

    unsigned char *MD5(const unsigned char *d, unsigned long n, unsigned char *md);
    
  2. 三段式操作

    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

  1. 一步式操作

    unsigned char *SHA1(const unsigned char *d, size_t n, unsigned char *md);
    
  2. 三段式操作

    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常用函数分类索引相关推荐

  1. php 数组合并_PHP数组常用函数分类整理

    微信公众号:PHP在线 PHP数组常用函数分类整理 一.数组操作的基本函数 数组的键名和值array_values($arr); 获得数组的值array_keys($arr); 获得数组的键名arra ...

  2. SQL常用函数、索引、视图、序列

    一.SQL常用函数 1.sysdate:当前的日期包含时间 select sysdate from dual; 2.length(str)函数:返回字符串的长度,str表示一个字符串 select l ...

  3. MySQL运算符,函数,索引,图形化管理工具

    文章目录 运算符 算术运算符 比较运算符 逻辑运算符 MySQL运算符 数字函数 字符串函数 日期时间函数 条件函数 系统信息函数 加密函数 其他常用函数 MySQL索引 索引的概念 索引的分类 创建 ...

  4. numpy随机生成01矩阵_Python数据分析Numpy库常用函数详解,提到循环就该想到的库...

    Python进行数据分析的核心库肯定是Pandas,该库差不多可以解决结构化数据的绝大部分处理需求.在<Python数据分析常用函数及参数详解,可以留着以备不时之需 >一文中也已经对该库的 ...

  5. mysql学习总结-初识+数据管理+增删改查+常用函数+事务理解+数据库设计+JDBC引入

    1.初识MySQL 1.1数据库的定义 数据库(DataBase,简称DB),是一个按数据结构来存储和管理数据的计算机软件系统.每个数据库都有一个或多个不同的 API 用于创建,访问,管理,搜索和复制 ...

  6. 《SQL高级应用和数据仓库基础(MySQL版)》学习笔记 ·008【常用函数】

    文章目录 一.常用函数 1.建议 2.MySQL函数概述 3.常用函数分类 一.常用函数 1.建议 使用函数时,建议将MySQL升级为8.0版本 2.MySQL函数概述 单行函数 语法 函数名(参数列 ...

  7. MYSQL天花板函数和地板函数_2020-08-04常用函数

    •单行函数语法 –语法: 函数名[(参数1,参数2,-)] –其中的参数可以是以下之一: •变量 •列名 •表达式 •单行函数特征 –单行函数对单行操作 –每行返回一个结果 –有可能返回值与原参数数据 ...

  8. Oracle 语言分类 数据类型 数据类型转换 常用函数 集合操作 子查询

    SQL分类 SQL(Structure Query Language)语言是数据库的核心语言.SQL语言共分为四大类:数据定义语言DDL,数据操纵语言DML,数据查询语言DQL,数据控制语言DCL.1 ...

  9. 函数分类,HIVE CLI命令,简单函数,聚合函数,集合函数,特殊函数(窗口函数,分析函数,混合函数,UDTF),常用函数Demo

    1.1. 函数分类 1.2. HIVE CLI命令 显示当前会话有多少函数可用  SHOW FUNCTIONS; 显示函数的描述信息  DESC FUNCTION concat; 显示函数的扩展描述信 ...

最新文章

  1. 使用EF Oracle实现DevExpress绑定大数据的ServerMode模式
  2. DOM事件与jQuery事件的是非纠葛
  3. 和谐社区,和谐技术:微软的宠儿们,为什么富人的孩子就不能早当家?
  4. flex布局,属性用法
  5. 第三回 Bootstrap3.x 起步
  6. [转载] Python 完整实现的简单遗传算法(SGA)
  7. 绘图的尺寸_【科研绘图1】你离顶级期刊封面仅差一步
  8. opencv 学习之 亮度检测
  9. 快闪ppt音乐_冬日午后南昌路,音乐快闪引人驻足
  10. HTML+CSS 制作下拉菜单
  11. Mysql数据库的tinyint类型
  12. 电子商务复习笔记三:网络营销
  13. lisp实心圆点怎么画_cad中怎么样画实心圆点
  14. Android-你真的懂AIDL的oneway嘛?
  15. python输入一个三位整数、输出三位数之和_编写程序,从键盘输入一个3位的正整数,输出它的百位数,十位数和个位数,并且计算它的和...
  16. c语言less函数,LESS使用方法
  17. 金融量化-金叉和死叉
  18. python offset函数_Python Pandas tseries.offsets.BusinessHour.copy用法及代码示例
  19. 【Rust每周一库】sled - 嵌入式数据库
  20. 使用esp8266 wifi芯片和DFRduino开发板(Arduino也可以),向自己的服务器发送请求(尽可能详细的说明)

热门文章

  1. 口服缓控释制剂研发的理论基础
  2. 程序员中年了40岁,公司里熬到中层年薪30w+,突然接到被辞退消息,应该怎么办?
  3. Sentinel初次使用Demo测试
  4. 怎样让你的客户服务更高效
  5. 网络安全事件应急演练规划
  6. 揭穿 6 个顽固的公有云神话
  7. DIY XILINX 下载器
  8. burpsuite靶场——CSRF
  9. 用ARM实现音乐电子相册
  10. 免费C++IDE(官方版)