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函数来进行验签操作,同时要注意国密算法的特殊性和验签所需的数据准备工作。

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

  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)。

相关文档
最新文档