Openssl函数接口介绍

合集下载

OpenSSL简单介绍

OpenSSL简单介绍

OpenSSL简单介绍本⽂对密码学中常⽤的底层库OpenSSL进⾏简单说明,包括基本介绍、简单使⽤等内容。

简单介绍是密码学中⼀个流⾏的底层密码库,也是SSL和TLS最常见的开源实现。

SSL全称为Secure Sockets Layer,安全套接层协议( 对⽹络连接进⾏加密处理 )。

TLS全称为Transport Layer Security,安全传输层协议(由记录协议和握⼿协议组成 )。

SSL协议由Netscape(⽹景)公司开发,因为应⽤⼴泛,到了1999年SSL已经成为互联⽹上的事实标准。

同年,IETF把SSL标准化后改名为TLS,它建⽴在SSL 3.0协议规范上,是SSL的后续版本。

TLS 和 SSL,两者差别极⼩,可以简单看做是同⼀个东西的两个不同阶段。

是由⼀些志愿者合作开发的开源⼯具库,其⽬标是开发⼀个强壮的、具有完备功能的商业级⼯具集,以实现SSL 和 TLS协议以及⼀个全功能的通⽤加密库。

OpenSSL主要以C语⾔实现,⽬前最新稳定版本为2018年9⽉11⽇发布的1.1.1版本。

OpenSSL的主要组成❏ openssl 多⽤途的命令⾏⼯具。

❏ libcrypto 常⽤加密算法库。

❏ libssl 实现了SSL及TLS的加密模块应⽤库。

⽀持许多不同的加密算法:其中包括但不限于单向散列函数的、、MD2、、、、RIPEMD-160、MDC-2、GOST R 34.11-94、BLAKE2、Whirlpool、SM3等算法,对称加密有、Blowfish、Camellia、Chacha20、Poly1305、SEED、CAST-128、、IDEA、RC2、RC4、、SM4、TDES、GOST 28147-89等算法,以及⾮对称加密的、DSA、迪菲-赫尔曼密钥交换、椭圆曲线、SM2、X25519、Ed25519、X448、Ed448、GOST R 34.10-2001等算法。

参考资料opsnssl 命令⾏简单说明的安装通常,很多操作系统都会默认安装OpenSSL ⼯具,我们可以通过在终端中输⼊openssl version命令来查看和进⾏验证。

openssl操作手册

openssl操作手册

OpenSSL 是一个开源的加密库,提供了各种加密算法、数字证书、SSL/TLS 协议等功能,被广泛用于网络安全和加密通信领域。

以下是OpenSSL 的一些常见用法和操作:1. 生成证书:使用OpenSSL 可以生成各种类型的数字证书,包括自签名证书、CA 证书、服务器证书、客户端证书等。

您可以使用OpenSSL 提供的命令行工具或API 接口来生成证书。

2. 加密和解密:OpenSSL 提供了各种加密算法,包括对称加密和非对称加密。

您可以使用OpenSSL 提供的命令行工具或API 接口来进行加密和解密操作。

3. 签名和验证:OpenSSL 提供了数字签名和验证的功能,可以用于保证数据的完整性和真实性。

您可以使用OpenSSL 提供的命令行工具或API 接口来进行签名和验证操作。

4. SSL/TLS 安全通信:OpenSSL 提供了SSL/TLS 协议的实现,可以用于安全通信。

您可以使用OpenSSL 提供的命令行工具或API 接口来实现SSL/TLS 安全通信。

5. 网络安全工具:OpenSSL 提供了各种网络安全工具,包括OpenSSL s_server、OpenSSL s_client、OpenSSL speed、OpenSSL rand 等。

这些工具可以用于测试和评估网络安全性能。

要使用OpenSSL,您需要安装OpenSSL 库,并包含相应的头文件。

在编写代码时,您可以调用OpenSSL 提供的函数和数据结构来实现您需要的加密、签名、SSL/TLS 安全通信等功能。

OpenSSL 提供了详细的文档和使用手册,您可以在OpenSSL 官方网站上找到完整的文档和参考手册。

在文档中,您可以找到各种函数的使用说明、示例代码和详细的接口说明,以帮助您更好地使用OpenSSL 库。

php openssl_encrypt option参数释义

php openssl_encrypt option参数释义

php openssl_encrypt option参数释义【原创实用版】目录1.PHP 中 openssl_encrypt 函数的作用2.openssl_encrypt 函数的参数列表3.参数详解3.1.明文(plaintext)3.2.密钥(key)3.3.加密算法(algorithm)3.4.填充方式(padding)3.5.加密后输出长度(length)3.6.额外的选项(options)正文在 PHP 中,openssl_encrypt 函数是一个用于加密数据的函数。

该函数接收一个明文字符串,以及一个密钥,然后使用指定的加密算法对明文进行加密,最后返回加密后的数据。

openssl_encrypt 函数的参数列表如下:```phpopenssl_encrypt(string $plaintext, string $key, string $algorithm, string $padding, int $length, string $options);```下面我们来详细了解一下每个参数的含义:1.明文(plaintext):需要加密的字符串。

2.密钥(key):用于加密的密钥。

密钥可以是一个字符串,也可以是一个数字。

在使用数字密钥时,需要将其转换为十六进制字符串。

3.加密算法(algorithm):指定加密算法的字符串。

例如:"AES-128-CBC"、"DES-ECB"等。

4.填充方式(padding):指定如何填充明文,使其长度满足加密算法的要求。

常用的填充方式有 PKCS5Padding、PKCS7Padding 等。

5.加密后输出长度(length):指定加密后输出的长度。

如果设置了这个参数,那么加密后的数据将被截断或填充,以满足指定的长度。

6.额外的选项(options):指定一些额外的选项,例如:OPENSSL_RAW_DATA、OPENSSL_NO_PADDING 等。

openssl之PEM系列

openssl之PEM系列

openssl之BIO系列之1---抽象的IO接口---根据openssl源代码、SSLeay Documents以及其它相关材料写成(作者:DragonKing, Mail: wzhah@ ,发布于:之openssl专业论坛,版本:openssl-0.9.7)PEM全称是Privacy Enhanced Mail,该标准定义了加密一个准备要发送邮件的标准。

它的基本流程是这样的:1.信息转换为ASCII码或其它编码方式;2.使用对称算法加密转换了的邮件信息;3.使用BASE64对加密后的邮件信息进行编码;4.使用一些头定义对信息进行封装,这些头信息格式如下(不一定都需要,可选的):Proc-Type,4:ENCRYPTEDDEK-Info: cipher-name, ivec其中,第一个头信息标注了该文件是否进行了加密,该头信息可能的值包括ENCRY PTED(信息已经加密和签名)、MIC-ONL Y(信息经过数字签名但没有加密)、MIC-CLEAR(信息经过数字签名但是没有加密、也没有进行编码,可使用非PEM格式阅读)以及CLEAR(信息没有签名和加密并且没有进行编码,该项好象是openssl自身的扩展,但是并没有真正实现);;第二个头信息标注了加密的算法以及使用的ivec参量,ivec其实在这儿提供的应该是一个随机产生的数据序列,与块加密算法中要使用到的初始化变量(IV)不一样。

5.在这些信息的前面加上如下形式头标注信息:-----BEGIN PRIV ACY-ENHANCED MESSAGE-----在这些信息的后面加上如下形式尾标注信息:-----END PRIV ACY-ENHANCED MESSAGE-----上面是openssl的PEM文件的基本结构,需要注意的是,Openssl并没有实现PEM的全部标准,它只是对openssl中需要使用的一些选项做了实现,详细的PEM格式,请参考RF C1421-1424。

OpenSSL:消息摘要算法

OpenSSL:消息摘要算法

OpenSSL:消息摘要算法简单接⼝:简单接⼝使⽤⼀个函数调⽤就可以完成消息摘要计算,这些接⼝包括MD2,MD4,MD5,MDC2,RIPEMD,SHA1,函数声明都⼀样。

以MD5为例,函数声明为:unsigned char *MD5(const unsigned char *d, unsigned long n, unsigned char *md);其中 d 指向要计算消息摘要的数据,n 为数据长度,md 指向保存消息摘要的缓冲区。

如果 md 不为 NULL,那么它的长度必须能够容纳计算出来的消息摘要。

对MD5,这个长度⾄少是 MD5_DIGEST_LENGTH。

如果 md 为 NULL,那么计算出来的消息摘要保存在⼀个静态数组⾥,函数返回指向这个数组的指针。

下⾯是⼀个使⽤MD()计算消息摘要的⼩程序://ex1.cpp#include <stdio.h>#include <string.h>#include <openssl/md5.h>static char *hexstr(unsigned char *buf,int len){const char *set = "0123456789abcdef";static char str[65],*tmp;unsigned char *end;if (len > 32)len = 32;end = buf + len;tmp = &str[0];while (buf < end){*tmp++ = set[ (*buf) >> 4 ];*tmp++ = set[ (*buf) & 0xF ];buf ++;}*tmp = '';return str;}int main(int argc, char* argv[]){char *buf = "Hello,OpenSSL\n";unsigned char *md;md = MD5((const unsigned char*)buf,strlen(buf),NULL);printf("%s\n",hexstr(md,MD5_DIGEST_LENGTH));return0;}这个程序计算出字符串”Hello,OpenSSL\n”的消息摘要为97aa490ee85f397134404f7bb524b587。

OpenSSL之X509系列

OpenSSL之X509系列

OpenSSL之X509系列之1---引言和X509概述【引言】X509是系列的函数在我们开发与PKI相关的应用的时候我们都会用到,但是OpenSSL中对X509的描述并不是很多,鉴于些,我将以前工作与学习过程的经验整理出来,供大家参考,不用多走弯路,可以将精力集中在自己要处理的业务逻辑上,同时也希望更多的人参与到研究与整理信息安全的理论与技术中来,提高中国的科研与应用技术水平。

提高中国信息安全意识与能力从我做起。

【X509概述】X.509是国际标准化组织CCITT建议作为X.500目录检索的一部分提供安全目录检索服务。

一份X.509证书是一些标准字段的集合,这些字段包含有关用户或设备及其相应公钥的信息一种非常通用的证书格式,所有的证书都符合X.509国际标准。

目前X.509有不同的版本,例如X.509V2和x.509v3都是目前比较新的版本,2000年还推出V4版本,但是都在原有版本基础上进行功能的扩充,其中每一版本必须包含下列信息:(1)用来区分X.509的不同版本号既版本号(2)由CA给予每一个证书的分配的编号即序列号;(3)用于产生证书所用的方法以及一切参数即签名算法(4) CA的x.500名字即发出该证书的认证机构(5)证书有效的时间包括两个日期,在所指定的两个时间之间有效即有效期限(6)证书持有人的姓名、服务处所等信息即主题信息(7)认证机构的数字签名(8)被证明的公钥值,加上使用这个公钥的方法名称即公钥信息【X.509证书格式】X.509是另一种非常通用的证书格式。

所有的证书都符合ITU-T X.509国际标准;因此(理论上)为一种应用创建的证书可以用于任何其他符合X.509标准的应用。

但实际上,不同的公司对X.509证书进行了不同的扩展,不是所有的证书都彼此兼容。

在一份证书中,必须证明公钥及其所有者的姓名是一致的。

对PGP 证书来说,任何人都可以扮演认证者的角色。

对X.509证书来说,认证者总是CA或由CA指定的人(其实PGP证书也完全支持使用CA来确认证书的体系结构),一份X.509证书是一些标准字段的集合,这些字段包含有关用户或设备及其相应公钥的信息。

SSL函数API编程.pdf

SSL函数API编程.pdf

22.
23. #define PKEY_FILE "sslserverkey.pem"
24. #define CERT_FILE "sslservercert.pem"
25.
26. int main()
27. {
28.
int sockfd,client_fd;
29.
socklen_t len;
30.
SSL 编程- 简单函数介绍
分类: MFC2013-12-10 10:59 1944 人阅读 评论(0) 收藏 举报
SSL 编程 OpenSSL 是一个开放源代码的 SSL 协议的产品实现,它采用 C 语言作为开发语言,具备了跨 系统的性能。调用 OpenSSL 的函数就可以实现一个 SSL 加密的安全数据传输通道,从而保护 客户端和服务器之间数据的安全。
下面首先是服务器端的程序:
[cpp] view plaincopy
1. #include <stdio.h>
2. #include <stdlib.h>
3. #include <signal.h>
4. #include <errno.h>
5. #include <string.h>ห้องสมุดไป่ตู้
6. #include <netdb.h>
tcpserver_init(&sockfd);
63.
while(1)
64. {
65.
printf("Please Chose Channel No.:\n");
2.服务端程序的框架为:
[cpp] view plaincopy

openssl国密验签函数

openssl国密验签函数

openssl国密验签函数
openssl是一个开放源代码的加密工具包,它提供了一系列的加密和解密函数,包括国密算法的支持。

国密算法是中国政府推动的一种密码算法标准,主要包括SM2、SM3和SM4算法。

在openssl 中,对国密算法的支持是在1.1.1版本中加入的。

要使用openssl进行国密验签,你可以使用以下步骤:
1. 首先,你需要安装支持国密算法的openssl版本,确保你的openssl版本是1.1.1或以上的版本。

2. 确保你的openssl库已经编译了国密算法的支持,你可以通过openssl的官方文档或者源码编译选项来确认。

3. 使用openssl的API调用,你可以使用openssl提供的函数来进行国密验签操作。

具体的函数调用取决于你使用的编程语言,比如C语言、C++、Python等。

4. 在进行验签操作时,你需要准备好验签所需的数据、签名和公钥等信息,然后调用openssl提供的相应函数来进行验签操作。

5. 在进行国密验签操作时,需要注意国密算法的特殊性,比如SM2算法需要使用公钥进行验签,而SM3算法是消息摘要算法,需要对消息进行摘要后再进行验签。

总的来说,要使用openssl进行国密验签操作,首先需要确保你的openssl版本支持国密算法,然后使用相应的API函数来进行验签操作,同时要注意国密算法的特殊性和验签所需的数据准备工作。

希望这些信息能够帮助到你。

openssl中文简介

openssl中文简介

openssl简介(中文版本)广州全通数码科技有限公司软件技术部制作(内部资料,禁止外传)目录前言............................................................... 1openssl简介-证书.. (2)openssl简介-加密算法 (7)openssl简介-协议 (9)openssl简介-入门 (11)openssl简介-指令 verify (13)openssl简介-指令asn1parse (17)openssl简介-指令ca(一) (19)openssl简介-指令ca(二) (22)openssl简介-指令cipher (24)openssl简介-指令dgst (28)openssl简介-指令dhparam (29)openssl简介-指令enc (31)openssl简介-指令gendsa (34)openssl简介-指令genrsa (35)openssl简介-指令passwd (36)openssl简介-指令pkcs7 (37)openssl简介-指令rand (38)openssl简介-指令req(一) (39)openssl简介-指令req(二) (42)openssl简介-指令rsa (45)openssl简介-指令rsautl (47)openssl简介-指令s_client(一) (50)openssl简介-指令s_client(二) (53)openssl简介-指令s_server (57)openssl简介-指令sess_id (59)openssl简介-指令speed (61)openssl简介-指令version (62)openssl简介-指令x509(一) (63)openssl简介-指令x509(二) (66)前言不久前接到有关ssl的活,结果找遍中文网站资料实在奇缺。

感觉是好象现在国内做这个技术的人不多。

OpenSSL常用函数(签名与验证)

OpenSSL常用函数(签名与验证)

[推荐]C++基础:OpenSSL常用函数(签名与验证)openssl中的验证是先对原始数据计算摘要, 再对摘要进行私钥加密. 验证的过程是对原始消息计算摘要,解密验证值, 和摘要对比是否一致.如果一致, 说明验证有效:否则,则认为原文或验证值已经被篡改.函数介绍:因为要先对原始数据计算摘要, 所以在计算摘要时用的函数是计算摘要的函数一样. 最后在结束函数中进行验证或验证. 为了方便描述, openssl对计算摘要函数进行了宏定义封装.下边是函数定义:1、签名初始化函数#define evp_signinit_ex(a, b, c) evp_digestinit_ex(a, b, c)int evp_digestinit_ex(evp_md_ctx *ctx, const evp_md *type, engine *imp1);2、签名更新函数#define evp_signupdate(a, b, c) evp_digestupdate(a, b, c)int evp_digestupdate(evp_md_ctx *ctx, const *d, size_t cnt);3、签名结束函数int evp_signfinal(evp_md_ctx *ctx, unsigned char *md, unsigned int *s,evp_pkey pkey);功能:计算签名结束,输出签名值。

参数说明:ctx:[in]上下文变量md:[out] 签名结果输出值的指针s:[out] 签名的长度pkey:[in] 签名的私钥。

(*后面有私钥的计算过程)4、验证初始化函数(* 跟签名调用同一个函数)#define evp_verifyinit_ex(a, b, c) evp_digestinit_ex(a, b, c)int evp_digestinit_ex(evp_md_ctx *ctx, const evp_md *type, engine *imp1);5、验证更新函数(* 跟签名调用同一个函数)#define evp_verifyupdate(a, b, c) evp_digestupdate(a, b, c)int evp_digestupdate(evp_md_ctx *ctx, const *d, size_t cnt);6、验证结束函数int evp_verifyfinal(evp_md_ctx *ctx, const unsigned char *sigbuf, unsigned int siglen, evp_pkey pkey);功能:计算验证结束,提示输出验证值。

C++基础:OpenSSL常用函数(签名与验证)

C++基础:OpenSSL常用函数(签名与验证)

C++基础:OpenSSL常用函数(签名与验证)OpenSSL中的验证是先对原始数据计算摘要, 再对摘要进行私钥加密. 验证的过程是对原始消息计算摘要,解密验证值, 和摘要对比是否一致.如果一致, 说明验证有效:否则,则认为原文或验证值已经被篡改.函数介绍:因为要先对原始数据计算摘要, 所以在计算摘要时用的函数是计算摘要的函数一样. 最后在结束函数中进行验证或验证. 为了方便描述, OpenSSL对计算摘要函数进行了宏定义封装.下边是函数定义:1、签名初始化函数#define EVP_SignInit_ex(a, b, c) EVP_DigestInit_ex(a, b, c)Int EVP_DigestInit_ex(EVP_MD_CTX *ctx, const EVP_MD *type, ENGINE *imp1);2、签名更新函数#define EVP_SignUpdate(a, b, c) EVP_DigestUpdate(a, b, c)Int EVP_DigestUpdate(EVP_MD_CTX *ctx, const *d, size_t cnt);3、签名结束函数Int EVP_SignFinal(EVP_MD_CTX *ctx, unsigned char *md, unsigned int *s, EVP_PKey pkey);功能:计算签名结束,输出签名值。

参数说明:Ctx:[IN]上下文变量Md:[OUT] 签名结果输出值的指针 s:[OUT] 签名的长度Pkey:[IN] 签名的私钥。

(*后面有私钥的计算过程)4、验证初始化函数 (* 跟签名调用同一个函数)#define EVP_VerifyInit_ex(a, b, c) EVP_DigestInit_ex(a, b, c)Int EVP_DigestInit_ex(EVP_MD_CTX *ctx, const EVP_MD *type, ENGINE *imp1);5、验证更新函数(* 跟签名调用同一个函数)#define EVP_VerifyUpdate(a, b, c) EVP_DigestUpdate(a, b, c)Int EVP_DigestUpdate(EVP_MD_CTX *ctx, const *d, size_t cnt);6、验证结束函数Int EVP_VerifyFinal(EVP_MD_CTX *ctx, const unsigned char *sigbuf, unsigned int siglen, EVP_PKey pkey);功能:计算验证结束,考试大提示输出验证值。

openssl接口调用方法

openssl接口调用方法

openssl接口调用方法`openssl` 是一个强大的工具集,用于处理 SSL 和 TLS 协议,以及各种加密操作。

以下是一些常见的 `openssl` 命令行接口调用方法:1. 生成自签名证书```bashopenssl req -x509 -newkey rsa:2048 -keyout -out -days 365```2. 生成 CSR (证书签名请求)```bashopenssl req -new -newkey rsa:2048 -keyout -out```3. 查看证书详情```bashopenssl x509 -in -text```4. 生成 Diffie-Hellman 密钥交换参数```bashopenssl dhparam -out 2048```5. 生成 ECDSA 密钥对```bashopenssl ecparam -genkey -name prime256v1 -out private_ ```6. 生成 RSA 密钥对```bashopenssl genpkey -algorithm RSA -out private_ -pkeyopt rsa_keygen_bits:2048```7. 验证证书链```bashopenssl verify -CAfile```8. 查看私钥内容```bashopenssl pkey -in private_ -text```9. 查看公钥内容```bashopenssl rsa -in -pubout -out public_ ```10. 查看证书链内容```bashopenssl crl -in -text```11. 生成随机数 (例如,用于设置密码哈希盐)```bashopenssl rand 16```这只是 `openssl` 功能的冰山一角。

该工具还有许多其他功能和选项,可用于处理证书、生成密钥、加密/解密数据等。

openssl_private_decrypt 参数

openssl_private_decrypt 参数

openssl_private_decrypt是一个 OpenSSL 函数,用于解密使用私钥加密的数据。

以下是该函数的参数:
1.$data:这是要解密的数据,通常是以二进制的格式提供。

2.$private_key:这是用于解密的私钥。

它可以是字符串形式,也可以是文
件路径指向的私钥文件。

3.$flags:这是一个可选参数,用于指定解密操作的选项。

常用的标志包括
OPENSSL_PKCS1_OAEP_PADDING(用于 PKCS#1 OAEP 填充)和
OPENSSL_PKCS1_PADDING(用于传统的 PKCS#1 填充)。

使用openssl_private_decrypt时,你需要确保提供的私钥是正确的,并且与用于加密数据的公钥匹配。

此外,还要注意解密操作的安全性,确保不会泄露敏感数据或私钥。

OpenSSLAPI:asn1_par.c源码分析

OpenSSLAPI:asn1_par.c源码分析

OpenSSLAPI:asn1_par.c源码分析序openssl有关asn1编解码的函数都定义在crypto/asn1/asn1_par.c下,这些函数直接在官⽅⽂档⾥是找不到的,也就是说openssl其实没有直接暴露asn1编解码的接⼝,⽽是在这之上⼜封装了⼀层证书格式,⽐如X509。

但是由于我们要做的是asn1的解码器,⽽不是针对证书格式的解码,所以⽆法直接调⽤openssl暴露的接⼝,只能通过学习源码来编写API供后⾯的软件使⽤。

概览原型⼀共有五个函数static int asn1_print_info(BIO *bp, int tag, int xclass, int constructed, int indent)int ASN1_parse(BIO *bp, const unsigned char *pp, long len, int indent)int ASN1_parse_dump(BIO *bp, const unsigned char *pp, long len, int indent, int dump)static int asn1_parse2(BIO *bp, const unsigned char **pp, long length, int offset, int depth, int indent, int dump)const char *ASN1_tag2str(int tag)功能ASN1_parse(),ASN1_parse_dump()openssl asn1parse命令直接调⽤的函数,其实内部都调⽤了asn1_parse2(),唯⼀的区别就是输出格式的不同,详情看后⾯的分析asn1_parse2()真正进⾏解码的函数。

本函数⽤于将pp和len指明的DER编码值写在BIO中,其中indent和dump⽤于设置打印的格式。

indent⽤来设置打印出来当列之间空格个数,ident越⼩,打印内容越紧凑。

OpenSSL使用之API指南

OpenSSL使用之API指南

OpenSSL使用之API指南4算法编程APIOpenSSL中支持众多的密码算法,并提供了很好的封装和接口。

密码算法主要分为如下几类:对称算法、公钥算法、散列算法、随机数产生算法等。

OpenSSL的目标是实现安全协议。

其中相关协议和标准包括:SSL/TLS、PKCS#1、PCKS#10、X.509、PEM、OCSP等。

4.1对称算法接口OpenSSL中实现的对称算法太多,举三个例子:DES、AES、RC4。

4.1.1DESDES加密算法是分组算法。

DES的基本操作是把64比特明文在56比特密钥指引下加密成64比特密文。

在实际使用中把密钥看作64比特可以更方便。

DES(IN,KEY)= OUT4.1.1.1DES ECB模式在OpenSSL中ECB操作模式对应的函数是DES_ecb_encrypt(),该函数把一个8字节明文分组input加密成为一个8字节密文分组output。

参数中密钥结构ks是用函数DES_set_key()准备好的,而密钥key是用随机数算法产生的64个随机比特。

参数enc指示是加密还是解密。

该函数每次只加密一个分组,因此用来加密很多数据时不方便使用。

void DES_ecb_encrypt(const_DES_cblock *input,DES_cblock *output, DES_key_schedule *ks,int enc);int DES_set_key(const_DES_cblock *key,DES_key_schedule *schedule);4.1.1.2DES CBC模式DES算法CBC操作模式加解密函数是DES_ncbc_encrypt()。

参数length指示输入字节长度。

如果长度不是8字节的倍数,则会被用0填充到8字节倍数。

因此,输出可能比length长,而且必然是8字节的倍数。

void DES_ncbc_encrypt(const unsigned char *input,unsigned char *output, long length, DES_key_schedule *schedule, DES_cblock *ivec, int enc);4.1.1.3DES CFB模式DES算法CFB操作模式加解密函数是DES_cfb_encrypt()。

openssl 编译参数

openssl 编译参数

OpenSSL 编译参数1. 什么是 OpenSSL?OpenSSL 是一个开源的软件库,提供了一系列加密和安全相关的功能。

它可以用于构建安全的通信应用程序,包括网站、电子邮件、虚拟专用网络(VPN)等。

OpenSSL 支持各种密码算法,包括对称加密、非对称加密和散列函数等。

2. 编译 OpenSSL编译 OpenSSL 可以根据不同的需求进行定制,以满足特定的应用场景。

下面将介绍一些常用的编译参数。

2.1. 配置选项在编译 OpenSSL 之前,我们需要先进行配置。

配置选项可以用于启用或禁用特定的功能,以及指定编译器、库路径等信息。

常用的配置选项包括:•--prefix=<path>:指定安装路径,默认为/usr/local/ssl。

•--openssldir=<dir>:指定 OpenSSL 的配置文件存放路径,默认为<prefix>/etc。

•--with-threads:启用多线程支持。

•--with-zlib=<dir>:指定 zlib 库的路径。

•--with-ssl=<dir>:指定已安装的 OpenSSL 库的路径。

2.2. 环境变量在编译 OpenSSL 之前,我们还可以设置一些环境变量,以影响编译过程和结果。

常用的环境变量包括:•CC:指定 C 编译器。

•CXX:指定 C++ 编译器。

•CFLAGS:指定编译选项。

•LDFLAGS:指定链接选项。

•CPPFLAGS:指定预处理选项。

•LD_LIBRARY_PATH:指定运行时库的搜索路径。

2.3. 编译命令配置完成后,我们可以使用以下命令进行编译和安装:./config [options]makemake testmake install其中,config命令用于生成 Makefile,make命令用于编译源代码,make test命令用于运行测试,make install命令用于安装生成的文件。

openssl_init_crypto的函数原型 -回复

openssl_init_crypto的函数原型 -回复

openssl_init_crypto的函数原型-回复题目:openssl_init_crypto函数原型解析及其应用引言:在网络通信和信息安全领域中,加密与解密是非常重要的技术手段。

而OpenSSL作为一个开源的安全套接字层密码库,提供了一系列用于加密、解密、签名和验证的函数。

其中,openssl_init_crypto函数是OpenSSL 库中的一个重要函数,本文将对其函数原型进行全面解析,并探讨其在实际应用中的使用方案和技巧。

一、函数原型解析在开始讨论openssl_init_crypto函数之前,先来看一下其函数原型:cint openssl_init_crypto(unsigned long options, const OPENSSL_INIT_SETTINGS *settings);从函数原型中可以看出,openssl_init_crypto函数接受两个参数:options 和settings。

下面将逐一解析这两个参数的含义和作用。

1. options参数:options是一个无符号长整型数,用于设置初始化密码环境时的一些选项。

这个参数可以使用多个选项的按位或操作来组合,常用的选项包括:- OPENSSL_INIT_LOAD_CONFIG:加载OpenSSL配置文件。

- OPENSSL_INIT_NO_LOAD_CONFIG:不加载OpenSSL配置文件。

- OPENSSL_INIT_ADD_ALL_CIPHERS:添加所有的密码算法。

- OPENSSL_INIT_ADD_ALL_DIGESTS:添加所有的散列算法。

- OPENSSL_INIT_LOAD_CRYPTO_STRINGS:加载加密算法字符串。

- OPENSSL_INIT_NO_LOAD_CRYPTO_STRINGS:不加载加密算法字符串。

2. settings参数:settings是一个指向OPENSSL_INIT_SETTINGS结构体的指针,用于设置其他初始化密码环境的选项。

openssl系列函数api

openssl系列函数api

Openssl之EVP系列作者: LaoKa200804261.算法封装EVP系列的函数定义包含在"evp.h"里面,这是一系列封装了openssl加密库里面所有算法的函数。

通过这样的统一的封装,使得只需要在初始化参数的时候做很少的改变,就可以使用相同的代码但采用不同的加密算法进行数据的加密和解密。

EVP系列函数主要封装了三大类型的算法,要支持全部这些算法,请调用OpenSSL_add_all_algorithms 函数,下面分别就其结构作一个简单的介绍。

1.1公开密钥算法函数名称:EVP_Seal*...*,EVP_Open*...*功能描述:该系列函数封装提供了公开密钥算法的加密和解密功能,实现了电子信封的功能。

相关文件:p_seal.c,p_open.c1.2数字签名算法函数名称:EVP_Sign*...*,EVP_Verify*...*功能描述:该系列函数封装提供了数字签名算法和功能。

相关文件:p_sign.c,p_verify.c1.3对称加密算法函数名称:EVP_Encrypt*...*功能描述:该系列函数封装提供了对称加密算法的功能。

相关文件:evp_enc.c,p_enc.c,p_dec.c,e_*.c1.4信息摘要算法函数名称:EVP_Digest*...*功能描述:该系列函数封装实现了多种信息摘要算法。

相关文件:digest.c,m_*.c1.5信息编码算法函数名称:EVP_Encode*...*功能描述:该系列函数封装实现了ASCII码与二进制码之间的转换函数和功能。

相关文件:encode.c注意:自从出现engin版本以后,所有对称加密算法和摘要算法可以用ENGINE模块实现的算法代替。

如果ENGINE模块实现的对称加密和信息摘要函数被注册为缺省的实现算法,那么当使用各种EVP函数时,软件编译的时候会自动将该实现模块连接进去。

2.对称加密算法概述对称加密算法封装的函数系列名字是以EVP_Encrypt*...*开头的,其实,这些函数只是简单调用了EVP_Cipher*...*系列的同名函数,换一个名字可能是为了更好的区别和理解。

Openssl函数接口介绍

Openssl函数接口介绍

Openssl有关大数运算函数接口介绍主要介绍Openssl中的有关大数运算函数,这个对于以后的RSA研究和实现比较有价值1.初始化函数BIGNUM *BN_new(void); 新生成一个BIGNUM结构void BN_free(BIGNUM *a); 释放一个BIGNUM结构,释放完后a=NULL; void BN_init(BIGNUM *); 初始化所有项均为0,一般为BN_ init(&c)void BN_clear(BIGNUM *a); 将a中所有项均赋值为0,但是内存并没有释放void BN_clear_free(BIGNUM *a); 相当与将BN_free和BN_clear综合,要不就赋值0,要不就释放空间。

2.上下文情景函数,存储计算中的中间过程BN_CTX *BN_CTX_new(void);申请一个新的上下文结构void BN_CTX_init(BN_CTX *c);将所有的项赋值为0,一般BN_CTX_init(&c) void BN_CTX_free(BN_CTX *c);释放上下文结构,释放完后c=NULL;3.复制以及交换函数BIGNUM *BN_copy(BIGNUM *a, const BIGNUM *b);将b复制给a,正确返回a,错误返回NULLBIGNUM *BN_dup(const BIGNUM *a);新建一个BIGNUM结构,将a复制给新建结构返回,错误返回NULLBIGNUM *BN_swap(BIGNUM *a, BIGNUM *b);交换a,b4.取位函数int BN_num_bytes(const BIGNUM *a);返回a的位数,大量使用int BN_num_bits(const BIGNUM *a);int BN_num_bits_word(BN_ULONG w);他返回有意义比特的位数,例如0x00000432 为11。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Openssl有关大数运算函数接口介绍主要介绍Openssl中的有关大数运算函数,这个对于以后的RSA研究和实现比较有价值1.初始化函数BIGNUM *BN_new(void); 新生成一个BIGNUM结构void BN_free(BIGNUM *a); 释放一个BIGNUM结构,释放完后a=NULL; void BN_init(BIGNUM *); 初始化所有项均为0,一般为BN_ init(&c)void BN_clear(BIGNUM *a); 将a中所有项均赋值为0,但是内存并没有释放void BN_clear_free(BIGNUM *a); 相当与将BN_free和BN_clear综合,要不就赋值0,要不就释放空间。

2.上下文情景函数,存储计算中的中间过程BN_CTX *BN_CTX_new(void);申请一个新的上下文结构void BN_CTX_init(BN_CTX *c);将所有的项赋值为0,一般BN_CTX_init(&c) void BN_CTX_free(BN_CTX *c);释放上下文结构,释放完后c=NULL;3.复制以及交换函数BIGNUM *BN_copy(BIGNUM *a, const BIGNUM *b);将b复制给a,正确返回a,错误返回NULLBIGNUM *BN_dup(const BIGNUM *a);新建一个BIGNUM结构,将a复制给新建结构返回,错误返回NULLBIGNUM *BN_swap(BIGNUM *a, BIGNUM *b);交换a,b4.取位函数int BN_num_bytes(const BIGNUM *a);返回a的位数,大量使用int BN_num_bits(const BIGNUM *a);int BN_num_bits_word(BN_ULONG w);他返回有意义比特的位数,例如0x00000432 为11。

5.基本计算函数int BN_add(BIGNUM *r, const BIGNUM *a, const BIGNUM *b);r=a+bint BN_sub(BIGNUM *r, const BIGNUM *a, const BIGNUM *b);r=a-bint BN_mul(BIGNUM *r, BIGNUM *a, BIGNUM *b, BN_CTX *ctx);r=a*bint BN_sqr(BIGNUM *r, BIGNUM *a, BN_CTX *ctx);r=a*a,效率高于bn_mul(r,a,a)int BN_div(BIGNUM *dv, BIGNUM *rem, const BIGNUM *a, const BIGNUM *d, BN_CTX *ctx);d=a/b,r=a%bint BN_mod(BIGNUM *rem, const BIGNUM *a, const BIGNUM *m, BN_CTX*ctx);r=a%bint BN_nnmod(BIGNUM *rem, const BIGNUM *a, const BIGNUM *m, BN_CTX*ctx);r=abs(a%b)int BN_mod_add(BIGNUM *ret, BIGNUM *a, BIGNUM *b, const BIGNUM *m,BN_CTX *ctx);r=abs((a+b)%m))int BN_mod_sub(BIGNUM *ret, BIGNUM *a, BIGNUM *b, const BIGNUM *m,BN_CTX *ctx); r=abs((a-b)%m))int BN_mod_mul(BIGNUM *ret, BIGNUM *a, BIGNUM *b, const BIGNUM *m,BN_CTX *ctx); r=abs((a*b)%m))int BN_mod_sqr(BIGNUM *ret, BIGNUM *a, const BIGNUM *m, BN_CTX *ctx); r=abs((a*a)%m))int BN_exp(BIGNUM *r, BIGNUM *a, BIGNUM *p, BN_CTX *ctx);r=pow(a,p) int BN_mod_exp(BIGNUM *r, BIGNUM *a, const BIGNUM *p,const BIGNUM *m, BN_CTX *ctx); r=pow(a,p)%Mint BN_gcd(BIGNUM *r, BIGNUM *a, BIGNUM *b, BN_CTX *ctx);r=a,b最大公约数int BN_add_word(BIGNUM *a, BN_ULONG w);int BN_sub_word(BIGNUM *a, BN_ULONG w);int BN_mul_word(BIGNUM *a, BN_ULONG w);BN_ULONG BN_div_word(BIGNUM *a, BN_ULONG w);BN_ULONG BN_mod_word(const BIGNUM *a, BN_ULONG w);BIGNUM *BN_mod_inverse(BIGNUM *r, BIGNUM *a, const BIGNUM *n,BN_CTX *ctx);模逆,((a*r)%n==1).6.比较函数int BN_cmp(BIGNUM *a, BIGNUM *b); -1 if a < b, 0 if a == b and 1 if a > b.int BN_ucmp(BIGNUM *a, BIGNUM *b); 比较a,b觉得值,返回值和上同。

int BN_is_zero(BIGNUM *a);int BN_is_one(BIGNUM *a);int BN_is_word(BIGNUM *a, BN_ULONG w);int BN_is_odd(BIGNUM *a); 上面四个返回1,假如条件成立,否则将返回07.设置函数int BN_zero(BIGNUM *a); 设置a为0int BN_one(BIGNUM *a); 设置a为1const BIGNUM *BN_value_one(void); 返回一个为1的大数int BN_set_word(BIGNUM *a, unsigned long w); 设置a为wunsigned long BN_get_word(BIGNUM *a); 假如a能表示为long型,那么返回一个long型数8.随机数函数int BN_rand(BIGNUM *rnd, int bits, int top, int bottom);产生一个加密用的强bits的伪随机数,若top=-1,最高位为0,top=0,最高位为1,top=1,最高位和次高位为1,bottom为真,随机数为偶数int BN_pseudo_rand(BIGNUM *rnd, int bits, int top, int bottom);产生一个伪随机数,应用于某些目的。

int BN_rand_range(BIGNUM *rnd, BIGNUM *range);产生的0<rnd<rangeint BN_pseudo_rand_range(BIGNUM *rnd, BIGNUM *range);同上面道理9.产生素数函数BIGNUM *BN_generate_prime(BIGNUM *ret, int bits,int safe, BIGNUM *add, BIGNUM *rem, void (*callback)(int, int, void *), void *cb_arg);产生一个bits位的素数,后面几个参数都可以为NULLint BN_is_prime(const BIGNUM *p, int nchecks,void (*callback)(int, int, void *), BN_CTX *ctx, void *cb_arg);判断是否为素数,返回0表示成功,1表示错误概率小于0。

25,-1表示错误10.位数函数int BN_set_bit(BIGNUM *a, int n);将a中的第n位设置为1,假如a小于n 位将扩展int BN_clear_bit(BIGNUM *a, int n);将a中的第n为设置为0,假如a小于n 位将出错int BN_is_bit_set(const BIGNUM *a, int n);测试是否已经设置,1表示已设置int BN_mask_bits(BIGNUM *a, int n);将a截断至n位,假如a小于n位将出错int BN_lshift(BIGNUM *r, const BIGNUM *a, int n);a左移n位,结果存于r int BN_lshift1(BIGNUM *r, BIGNUM *a); a左移1位,结果存于rint BN_rshift(BIGNUM *r, BIGNUM *a, int n); a右移n位,结果存于rint BN_rshift1(BIGNUM *r, BIGNUM *a); a左移1位,结果存于r 11.与字符串的转换函数int BN_bn2bin(const BIGNUM *a, unsigned char *to);将abs(a)转化为字符串存入to,to的空间必须大于BN_num_bytes(a)BIGNUM *BN_bin2bn(const unsigned char *s, int len, BIGNUM *ret);将s 中的len位的正整数转化为大数char *BN_bn2hex(const BIGNUM *a);转化为16进制字符串char *BN_bn2dec(const BIGNUM *a);转化为10进制字符串int BN_hex2bn(BIGNUM **a, const char *str);同上理int BN_dec2bn(BIGNUM **a, const char *str);同上理int BN_print(BIO *fp, const BIGNUM *a);将大数16进制形式写入内存中int BN_print_fp(FILE *fp, const BIGNUM *a); 将大数16进制形式写入文件int BN_bn2mpi(const BIGNUM *a, unsigned char *to);BIGNUM *BN_mpi2bn(unsigned char *s, int len, BIGNUM *ret);12.其他函数下面函数可以进行更有效率的模乘和模除,假如在重复在同一模下重复进行模乘和模除计算,计算r=(a*b)%m 利用了recp=1/mBN_RECP_CTX *BN_RECP_CTX_new(void);void BN_RECP_CTX_init(BN_RECP_CTX *recp);void BN_RECP_CTX_free(BN_RECP_CTX *recp);int BN_RECP_CTX_set(BN_RECP_CTX *recp, const BIGNUM *m, BN_CTX *ctx); int BN_mod_mul_reciprocal(BIGNUM *r, BIGNUM *a, BIGNUM *b,BN_RECP_CTX *recp, BN_CTX *ctx);下面函数采用蒙哥马利算法进行模幂计算,可以提高效率,他也主要应用于在同一模下进行多次幂运算BN_MONT_CTX *BN_MONT_CTX_new(void);void BN_MONT_CTX_init(BN_MONT_CTX *ctx);void BN_MONT_CTX_free(BN_MONT_CTX *mont);int BN_MONT_CTX_set(BN_MONT_CTX *mont, const BIGNUM *m, BN_CTX *ctx); BN_MONT_CTX *BN_MONT_CTX_copy(BN_MONT_CTX *to, BN_MONT_CTX *from);int BN_mod_mul_montgomery(BIGNUM *r, BIGNUM *a, BIGNUM *b,BN_MONT_CTX *mont, BN_CTX *ctx);int BN_from_montgomery(BIGNUM *r, BIGNUM *a, BN_MONT_CTX *mont,BN_CTX *ctx);int BN_to_montgomery(BIGNUM *r, BIGNUM *a, BN_MONT_CTX *mont,BN_CTX *ctx)。

相关文档
最新文档