openssl怎么用,openssl命令详解
openssl怎么用,openssl命令详解详细介绍
本文目录一览: openssl命令详解
OpenSSL是一个安全套接字层密码库,其包括常用的密码算法、常用的密钥生成和证书封装管理功能及SSL协议,并提供了丰富的应用程序以供测试。 OpenSSL是一个开源的项目,其由三个部分组成: 1、openssl命令行工具; 2、libencrypt加密算法库; 3、libssl加密模块应用库;
这里主要学习下openssl命令工具的用法,openssl命令工具有两种运行模式: 交换模式 和 批处理模式 。直接输入openssl回车即可进入交互模式,而输入带命令选项的openssl命令则进行批处理模式。
利用OpenSSL作对称加密需要使用其子命令enc,其用法为:
其中常用的选项为:
使用案例 :
OpenSSL单向加密的子命令为dgst,其语法如下:
其常用的选项为:
单向加密除了 openssl dgst 工具还有: md5sum,sha1sum,sha224sum,sha256sum ,sha384sum,sha512sum
使用案例 :
或
OpenSSL还支持生成密码的hash离散值,其子命令为passwd,语法如下:
常用选项为:
使用案例 :
openssl命令也支持生成随机数,其子命令为rand,对应的语法为:
常用选项有:
使用案例 :
利用openssl命令的子命令genrsa生成私钥,然后再使用子命令rsa私钥中提取公钥。 genrsa的语法如下:
通常来说秘钥文件的权限一般只能由管理员访问,因此可以结合umask命令来设置生成的密钥文件的权限,如:
而随后可利用rsa子命令生成的私钥文件中提取公钥,rsa子命令的语法为:
常用选项为: -in FILENAME:指明私钥文件的存放路径; -out FILENAME:指明将公钥的保存路径; -pubout:根据提供的私钥,从中提取出公钥;
如:
在使用OpenSSL命令创建证书前,可查看配置文件/etc/pki/tls/openss.conf文件,查看该文件定义了的证书存放位置及名称。 1)创建自签证书 首先为CA提供所需的目录及文件,并指明证书的开始编号:
随后生成私钥,注意私钥的文件名及其存放的位置,需与配置文件中相匹配:
最后创建自签证书:
其中命令 openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem -days 3650 用到子命令为req,其为证书请求及生成的工具,用到的选项解释为:
2)颁发证书 通常来说在CA签署颁发证书需要进行以下步骤:
上述命令用到了openssl命令的子命令CA,用于在CA服务器上签署或吊销证书。
上述查看证书使用了openssl命令的子命令x509,其选项解释为:
3)吊销证书 吊销证书的步骤通常为:
-gencrl选项为根据/etc/pki/CA/index.txt文件中的信息生成crl文件。
如何使用openssl生成RSA公钥和私钥对 蓝讯
在Linux环境下,可安装OPENSSL工具包(以ubuntu为例,执行sudo apt-get install openssl)。
在Windows环境下,打开OPENSSL安装目录bin文件下面的openssl.exe。在Linux环境下,直接在终端中运行openssl。
1)生成RSA私钥:
genrsa -out rsa_private_key.pem 1024
该命令会生成1024位的私钥,生成成功的界面如下:
如何使用openssl生成RSA公钥和私钥对
此时我们就可以在当前路径下看到rsa_private_key.pem文件了。
2)把RSA私钥转换成PKCS8格式
输入命令pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM –nocrypt,并回车
得到生成功的结果,这个结果就是PKCS8格式的私钥,如下图:
如何使用openssl生成RSA公钥和私钥对
3) 生成RSA公钥
输入命令rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem,并回车,
得到生成成功的结果,如下图:
如何使用openssl生成RSA公钥和私钥对
此时,我们可以看到一个文件名为rsa_public_key.pem的文件,打开它,可以看到-----BEGIN PUBLIC KEY-----开头,
-----END PUBLIC KEY-----结尾的没有换行的字符串,这个就是公钥。
OpenSSL之配置文件用法
OpenSSL配置文件采用linux风格,其文件格式由分组字段名、属性名、属性值三部分组成。
如下面的例子:
其中,属性值还支持变量替换,如该例的属性:
log = $path/log
其值最终会被替换为./module_a/log
本文假设你已经安装好了OpenSSL,并且持有一份1.1.1的源码。
配置文件相关的头文件为conf.h、源文件实现在crypto/conf目录中。
这个结构定义了单个配置项的数据结构。主要字段含义:
section —— 表示一个配置段的名称。
name —— 表示在该配置段下的属性名称。
value —— 表示对应属性的值。
这个结构定义了配置抽象方法集合。主要字段含义:
name —— 配置方法名称。
create —— 根据配置抽象方法,创建一个配置项结构,返回其指针。
init —— 初使化配置。
destroy —— 释放所有配置。
destroy_data —— 仅释放所有配置项数据,不释放配置本身。
load_bio —— 以BIO的方式加载配置。
dump —— 打印配置项到BIO中。
is_number —— 判断指定字符是否数字。
to_int —— 将字符转换为数字。
load —— 从文件(重新)加载所有配置。
这个结构定义了配置存储数据结构。主要字段含义:
meth —— 抽象方法集合。
meth_data —— 附加的内存数据,暂时还没有明确用途。
data —— 配置项哈希表。
在1.1.1中,大多数的数据结构已经不再向使用者开放,从封装的角度来看,这是更合理的。如果你在头文件中找不到结构定义,不妨去源码中搜一搜。
CONF *NCONF_new(CONF_METHOD *meth);
指定一个抽象方法集合,创建配置存储结构。
成功返回有效指针,失败返回NULL。
如果meth传入NULL,表示使用默认的抽象方法。
void NCONF_free(CONF *conf);
释放配置存储。
int NCONF_load(CONF *conf, const char *file, long *eline);
从指定文件加载配置,eline表示出错时输出的行号。
成功返回1,失败返回0。
int NCONF_load_bio(CONF *conf, BIO *bp, long *eline);
从BIO加载配置,eline表示出错时输出的行号。
成功返回1,失败返回0。
int NCONF_load_fp(CONF *conf, FILE *fp, long *eline);
NCONF_load_bio()的FILE版本。
char *NCONF_get_string(const CONF *conf, const char *group, const char *name);
从配置中,获取指定分组下的属性值。
成功返回C风格字符串,失败返回NULL。
若group传NULL,表示取全局属性。
int NCONF_get_number_e(const CONF *conf, const char *group, const char *name, long *result);
从配置中,获取指定分组下的数字属性值,数字值输出到result中。
成功返回1,失败返回0。
若group传NULL,表示取全局属性。
STACK_OF(CONF_VALUE) *NCONF_get_section(const CONF *conf, const char *section);
返回指定分组下的配置项堆栈集合。section不能为NULL。
成功返回有效堆栈指针,失败返回NULL。
下面这个例子演示了使用配置API进行基本的文件操作。
test.cnf文件内容:
user = root
[module_a]
path = ./module_a
log = $path/log
filecount = 10
输出:
global user:[root]
module_a::path:[./module_a]
module_a::log:[./module_a/log]
ret:[1] module_a::filecount:[10]
下面这个例子演示了使用BIO读取配置文件,并且遍历指定的分组。
输出:
section:[module_a] name:[path] value:[./module_a]
section:[module_a] name:[log] value:[./module_a/log]
section:[module_a] name:[filecount] value:[10]
如何利用openssl为iis生成ssl服务器证书
2.在要安加SSL服务的网站,右键打开网站属性Table. 3.选取目录安全中的服务器证书. 4.进入生成服务器证书请求的步骤中,一步步填写相应的信息。每一步相应的信息要记住,这些信息在后面要用到。二、openssl操作: 1.生成私钥。 openssl genrsa -des3 -out cakey.pem 2048 2.生成自签名根证书. openssl req -new -x509 -key cakey.pem -out cacert.pem -days 1825
此处会要求输入一些信息: Country Name: CN //两个字母的国家代号 State or Province Name: guang dong //省份名称 Locality Name: guang zhou //城市名称 Organization Name: sunrising //公司名称
Organizational Unit Name: home //部门名称 Common Name: besunny //你的姓名(要是生成服务器端的证书一定要输入域名或者ip地址) 切记一定要和IIS服务器上填写的信息保持一致。 3.在你的openssl主目录下的bin目录下创建如下目录: demoCA
demoCA/newcerts 在demoCA目录下创建一个空的index.txt文件. 在demoCA目录创建一个serial文件,文件内容为01 . 4.把第二步的生成的cakey.pem拷贝到 demoCA/private目录下; 把cacert.pem 拷贝到demoCA目录下. 5.用CA证书cacert.pem为IIS请求certreq.txt签发证书。(将iis服务器生成的certreq.txt存放在openssl/bin下面) openssl ca -in certreq.txt -out iis.cer 6.打开iis.cer,删掉在"-- Begin Certificate --"的文本。 三.IIS服务器操作: 在该网站属性中目录安全的服务器证书 ,导入该证书。 四、测试是否SSL正常。 二、配置OpenSSL1、建立自己的CA证书在openssl的apps目录下建立自己的CA证书,例如mageCAC:/openssl098b/apps>mkdir mageCA2、生成CA密钥C:/openssl098b/apps>openssl genrsa -out mageCA/ca-key.pem 1024Genrsa[产生密钥命令] –out[密钥文件输出路径] 1024[密钥位数]Loading 'screen' into random state - doneGenerating RSA private key, 1024 bit long modulus..............................++++++......++++++3、生成待签名的证书C:/openssl098b/apps>openssl req -new -out mageCA/ca-req.csr -key mageCA/ca-key.pemreq[产生证书命令]-new[新生成]-out[证书文件输出路径]-key[私钥文件路径]报错:Using configuration from /usr/local/ssl/openssl.cnfUnable to load config infounable to find 'distinguished_name' in configproblems making Certificate Request2188:error:0E06D06A:configurationfileroutines:NCONF_get_string:no conf or environment variable:./crypto/conf/conf_lib.c:344:2188:error:0E06D06A:configurationfileroutines:NCONF_get_string:no conf or environment variable:./crypto/conf/conf_lib.c:344:2188:error:0E06D06A:configurationfileroutines:NCONF_get_string:no conf or environment variable:./crypto/conf/conf_lib.c:344:2188:error:0E06D06A:configurationfileroutines:NCONF_get_string:no conf or environment variable:./crypto/conf/conf_lib.c:344:2188:error:0E06D06A:configurationfileroutines:NCONF_get_string:no conf or environment variable:./crypto/conf/conf_lib.c:344:2188:error:0E06D06A:configurationfileroutines:NCONF_get_string:no conf or environment variable:./crypto/conf/conf_lib.c:344:2188:error:0E06D06A:configurationfileroutines:NCONF_get_string:no conf or environment variable:./crypto/conf/conf_lib.c:344:2188:error:0E06D06A:configurationfileroutines:NCONF_get_string:no conf or environment variable:./crypto/conf/conf_lib.c:344:出现这样的问题后,打开了apps下的req查看DIAGNOSTICS: =head1 DIAGNOSTICSThe following messages are frequently asked about:? Using configuration from /some/path/openssl.cnf? Unable to load config infoThis is followed some time later by...? unable to find 'distinguished_name' in config? problems making Certificate RequestThe first error message is the clue: it can't find the configurationfile! Certain operations (like examining a certificate request) don'tneed a configurationfile so its use isn't enforced. Generation ofcertificates or requests however does need a configurationfile. Thiscould be regarded as a bug.依然不能解决问题,在网上搜索,被告知是环境变量没有设置,于是设置系统用户变量OPENSSL_CONF为C:/openssl098b/apps/openssl_cnf。重开一个命令行窗口,要求输入一系列的信息,如国家、省、市、公司、部门、姓名、电子邮件等,命令执行完成。在设置了环境变量以后,一定要另开一个命令行窗口!一开始我就是没有另开窗口,所以后来又耽误了好多时间,不过,真是因为这个错误,我才搞清楚了openssl_cnf!至于openssl_cnf,笨笨的我还在apps下找了好半天,都没有找到这个文件,后来被高手告知就是那个名为openssl的计算机图标一样的文件,是可以用写字板打开的!狂晕!还有人说是在ssl目录下,但是我的不是!
如何使用OpenSSL工具生成根证书与应用证书
openssl_x509_parse函数解析用户证书与根证书,然后比对颁发机构等信息,判断用户证书是否合法
使用OpenSSL工具生成根证书与应用证书方法:
1、生成顶级CA的公钥证书和私钥文件,有效期10年(RSA 1024bits,默认) openssl req -new -x509 -days 3650 -keyout CARoot1024.key -out CARoot1024.crt
2、 为顶级CA的私钥文件去除保护口令 openssl rsa -in CARoot1024.key -out CARoot1024.key
3、 生成顶级CA的公钥证书和私钥文件,有效期15年(RSA 2048bits,指定) openssl req -newkey rsa:2048 -x509 -days 5480 -keyout CARoot2048.key -out CARoot2048.crt
4、 为顶级CA的私钥文件去除保护口令 openssl rsa -in CARoot2048.key -out CARoot2048.key
5、 为应用证书/中级证书生成私钥文件 openssl genrsa -out app.key 2048
6、 根据私钥文件,为应用证书/中级证书生成 csr 文件(证书请求文件) openssl req -new -key app.key -out app.csr
7、 使用CA的公私钥文件给 csr 文件签名,生成应用证书,有效期5年 openssl ca -in app.csr -out app.crt -cert CARoot1024.crt -keyfile CARoot1024.key -days 1826 -policy policy_anything
8、 使用CA的公私钥文件给 csr 文件签名,生成中级证书,有效期5年 openssl ca -extensions v3_ca -in app.csr -out app.crt -cert CARoot1024.crt -keyfile CARoot1024.key -days 1826 -policy policy_anything
以上是生成根证书与应用证书过程中要用到的所有命令,根据生成目标不同,分为三组。其中,前面两组都用于生成自签名的顶级CA(区别只在于密钥长度不同),实际应用中只需根据需求选择一组即可。 最后一组用于生成非自签名的证书,包括中级证书与应用证书。所谓中级证书,是具有继续颁发下级证书权限的子CA,而本文中所说的应用证书,特指不能用来继续颁发下级证书,只能用来证明个体身份的证书。顶级CA在签发二者的时候,只是多少一个 -extensions v3_ca 选项的区别,这个选项赋予被签发的证书继续签发下级证书的权力。
windows64环境下openssl 1.0.1g 安装包怎么用
安装及使用图解1、首先OpenSSL编译安装需Perl支持载新版ActivePerlOpenSSL源码包
2、安装ActivePerl安装简单需点击Win32OpenSSL-1_0_1g.exe
3、提示用户安装OpenSSL 32位注意仅适合32位操作系统使用点击NExt
4、勾选i accept the agreement即同意协议并点击NExt
5、选择软件安装路径默认路径C:\OpenSSL-Win32点击browse更改安装路径完路径选择点击NExt
6、选择安装文件名直接默认并点击Next
7、选择附加任务勾选:
a.The Windows system directory:窗口系统目录
b.The OpenSSL binaries(/bin)directory:OpenSSL二进制文件(/箱)目录
建议勾选a项并点击Next
8、点击Install始式安装并等待安装完即
9、安装完执行VC安装目录vcvarsall.bat 配置默认环境
10、进入openssl目录执行指令(X64环境)
> perl Configure VC-WIN64A
> ms\do_win64a
> nmake -f ms\ntdll.mak
> cd out32dll
> ..mstest
11、现用户使用OpenSSL啦
openssl
linux下的eclipse怎样使用openssl
一、安装
首先下载openssL的原始文件包,例如openssl-1.0.1f.tar.gz
将该文件复制到工作区目录下,一般是/home下的个人文件夹
解压文件tar zxvf openssl-1.0.1f.tar.gz
进入文件内 cd openssl-1.0.1f
配置,将生成的openssL文件复制到系统默认的文件夹下,该步骤只要复制下面的代码就可以了:”./config --prefix=/usr/local/openssl shared”
执行make命令:make
使用root权限,安装openssL:sudo make install
至此,openssL安装完成。完成的目录中有两个比较重要,一个是include包,里面都是外部调用时可以查阅的.h头文件,另一个是lib包,里面有ssl和crypto的静态和共享文件包。第二步的配置,主要是配置这两个文件。
二、在eclipse中配置的方法
在eclipse中必须配置include和lib两个变量。
新建一个C语言测试工程,例如openssL_test,右键-属性-C/C++ Build-设置,然后单击图中右侧第一个红框,也就是GCC C Compiler 下的include,做如下设置,这里的path就是上面include的位置。
OpenSSL在Linux Eclipse下使用的完整过程-附截图和测试程序
然后单击GCC C Linker 下的libraries ,做如下设置:
OpenSSL在Linux Eclipse下使用的完整过程-附截图和测试程序
ssl和crypto是用户手动加上去的,但不是随意写的,其实这两个变量对应着/usr/local/openssl/lib目录下的libssl.so和libcrypto.so文件。
另外要注意,如果建的工程为C++类型,上图中还会有一个G++的编译器设置选项,设置方式与GCC的一样就可以。
如何使用openssl生成证书
Step 1. Create key (password protected)
openssl genrsa -out prvtkey.pem 1024/2038 (with out password protected)
openssl genrsa -des3 -out prvtkey.pem 1024/2048 (password protected)
这个命令会生成一个1024/2048位的密钥。
Step 2. Create certification request
openssl req -new -key prvtkey.pem -out cert.csr
openssl req -new -nodes -key prvtkey.pem -out cert.csr
这个命令将会生成一个证书请求,当然,用到了前面生成的密钥prvtkey.pem文件
这里将生成一个新的文件cert.csr,即一个证书请求文件,你可以拿着这个文件去数字证书颁发机构(即CA)申请一个数字证书。CA会给你一个新的文件cacert.pem,那才是你的数字证书。
Step 3: Send certificate request to Certification Authority (CA)
如果是自己做测试,那么证书的申请机构和颁发机构都是自己。就可以用下面这个命令来生成证书:
openssl req -new -x509 -key prvtkey.pem -out cacert.pem -days 1095
这个命令将用上面生成的密钥privkey.pem生成一个数字证书cacert.pem
cacert.pem 生成过程见“OpenSSL建立自己的CA”
有了privkey.pem和cacert.pem文件后就可以在自己的程序中使用了,比如做一个加密通讯的服务器
-------------
OpenSSL建立自己的CA
(1) 环境准备
首先,需要准备一个目录放置CA文件,包括颁发的证书和CRL(Certificate Revoke List)。
这里我们选择目录 /var/MyCA。
然后我们在/var/MyCA下建立两个目录,certs用来保存我们的CA颁发的所有的证书的副本;private用来保存CA证书的私钥匙。
除了生成钥匙,在我们的CA体系中还需要创建三个文件。第一个文件用来跟踪最后一次颁发的证书的序列号,我们把它命名为serial,初始化为01。第二个文件是一个排序数据库,用来跟踪已经颁发的证书。我们把它命名为index.txt,文件内容为空。
$ mkdir /var/MyCA
$ cd /var/MyCA
$ mkdir certs private
$ chmod g-rwx,o-rwx private
$ echo "01" > serial
$ touch index.txt
第三个文件是OpenSSL的配置文件,创建起来要棘手点。示例如下:
$ touch openssl.cnf
文件内容如下:
[ ca ]
default_ca = myca
[ myca ]
dir = /var/MyCA
certificate = $dir/cacert.pem
database = $dir/index.txt
new_certs_dir = $dir/certs
private_key = $dir/private/cakey.pem
serial = $dir/serial
default_crl_days= 7
default_days = 365
default_md = md5
policy = myca_policy
x509_extensions = certificate_extensions
[ myca_policy ]
commonName = supplied
stateOrProvinceName = supplied
countryName = supplied
emailAddress = supplied
organizationName= supplied
organizationalUnitName = optional
[ certificate_extensions ]
basicConstraints= CA:false
我们需要告诉OpenSSL配置文件的路径,有两种方法可以达成目的:通过config命令选项;通过环境变量OPENSSL_CONF。这里我们选择环境变量的方式。
$ OPENSSL_CONF=/var/MyCA/openssl.cnf"
$ export OPENSSL_CONF
(2) 生成根证书 (Root Certificate)
我们需要一个证书来为自己颁发的证书签名,这个证书可从其他CA获取,或者是自签名的根证书。这里我们生成一个自签名的根证书。
首先我们需要往配置文件里面添加一些信息,如下所示,节名和命令行工具的命令req一样。我们把所有必要的信息都写进配置,而不是在命令行输入,这是唯一指定X.509v3扩展的方式,也能让我们对如何创建根证书有个清晰的把握。
[ req ]
default_bits = 2048
default_keyfile = /var/MyCA/private/cakey.pem
default_md = md5
prompt = no
distinguished_name = root_ca_distinguished_name
x509_extensions = root_ca_extensions
[ root_ca_distinguished_name ]
commonName = My Test CA
stateOrProvinceName = HZ
countryName = CN
emailAddress = test@cert.com
organizationName = Root Certification Authority
[ root_ca_extensions ]
basicConstraints = CA:true
万事俱备,我们可以生成根证书了。注意设置好环境变量OPENSSL_CONF。
$ openssl req -x509 -newkey rsa -out cacert.pem -outform PEM -days 356
注:“-days 356“控制有效期限为365天,默认为30天。
验证一下我们生成的文件。
$ openssl x509 -in cacert.pem -text -noout
(3) 给客户颁发证书
在给客户颁发证书之前,需要客户提供证书的基本信息。我们另外开启一个终端窗口,使用默认的OpenSSL配置文件(不要让之前的OPENSSL_CONF干扰我们,那个配置是专门用来生成根证书的)。
命令和我们生成根证书的类似,都是req,不过需要提供一些额外的信息。如下:
$ openssl req -newkey rsa:1024 -keyout testkey.pem -keyform PEM -out testreq.pem -outform PEM
有两次提示要口令,第一次的口令用来加密私钥匙testkey.pem,第二次口令一般被OpenSSL忽略。
结果生成两个文件:testkey.pem,私钥匙;testreq.pem,请求信息,其中包括公钥匙。
我们来看看testreq.pem都有哪些信息?
$ openssl req -in testreq.pem -text -noout
现在,我们可以把testreq.pem提交给我们的CA生成证书了。
为了方便起见,我们假定testreq.pem在//var/MyCA/private/中。
$ openssl ca -in testreq.pem
有三次提示,一次是问你CA的私钥匙密码,两次是确认,输出的结果就是为客户颁发的证书。
可以通过batch选项取消命令提示,可通过notext选项取消证书的输出显示。
此外,还可以一次给多个客户颁发证书,方法是用 infiles选项替换in选项,不过这个选项必须放在最后,因为此后的任何字符均被处理为文件名称列表。
生成的证书放在certs目录,同时index.txt和serial的内容都发生了改变。
publicdoubleside=10.0;//去掉static
OpenSSL之EVP用法
OpenSSL EVP(high-level cryptographic functions)提供了丰富的密码学中的各种函数。OpenSSL中实现了各种对称算法、摘要算法以及签名/验签算法。EVP函数将这些具体的算法进行了封装。 EVP主要封装了如下功能函数: 1)实现了BASE64编解码BIO; 2)实现了加解密BIO; 3)实现了摘要BIO; 4)实现了reliable BIO; 5)封装了摘要算法; 6)封装了对称加解密算法; 7)封装了非对称密钥的加密(公钥)、解密(私钥)、签名与验证以及辅助函数; 8)基于口令的加密(PBE); 9)对称密钥处理; 10)数字信封:数字信封用对方的公钥加密对称密钥,数据则用此对称密钥加密。发送给对方时,同时发送对称密钥密文和数据密文。接收方首先用自己的私钥解密密钥密文,得到对称密钥,然后用它解密数据。 11)其他辅助函数。
本文假设你已经安装好了OpenSSL,并且持有一份1.1.1的源码。 EVP相关的头文件在evp.h中、源文件在crypto/evp目录中。 由于EVP的功能过于强大,再加上我的精力和水平有限,暂时只对部分功能进行摘录和说明。
这个结构定义了摘要算法的抽象方法。主要字段含义: type —— 摘要算法的NID。 pkey_type —— 与摘要算法相关的密钥NID。 md_size —— 摘要值的输出大小。 flags —— 内部标志。 init —— 初使化函数。 update —— 输入计算函数。 final —— 输出计算函数。 copy —— 摘要运算上下文复制函数。 cleanup —— 摘要运算上下文清理函数。 block_size —— 摘要运算分组大小。 ctx_size —— 摘要运算分组缓冲区大小。 md_ctrl —— 摘要运算指令控制函数。
支持的摘要算法包括: const EVP_MD *EVP_md5(void); const EVP_MD *EVP_sha1(void); const EVP_MD *EVP_sha256(void); const EVP_MD *EVP_sha512(void);
拿EVP_md5()来说,其返回值为:
下面这几个函数查询md的属性信息:
有时我们对使用的摘要算法不熟悉,这几个函数很有帮助。
EVP_MD_CTX *EVP_MD_CTX_new(void); void EVP_MD_CTX_free(EVP_MD_CTX *ctx); 这两个函数用于创建和释放对称摘要上下文对象。
int EVP_DigestInit(EVP_MD_CTX *ctx, const EVP_MD *type); 初使化摘要上下文,type为摘要算法抽象集合。 成功返回1,失败返回0。
int EVP_DigestUpdate(EVP_MD_CTX *ctx, const void *d, size_t cnt); 向摘要计算的海棉结构输入一段数据。 成功返回1,失败返回0。
int EVP_DigestFinal(EVP_MD_CTX *ctx, unsigned char *md, unsigned int *s); 生成最终摘要,输出摘要值和长度。 成功返回1,失败返回0。
int EVP_Digest(const void *data, size_t count, unsigned char *md, unsigned int *size, const EVP_MD *type, ENGINE *impl); 使用包装的一次性方法计算一段小数据的摘要。 成功返回1,失败返回0。
struct evp_cipher_st { int nid; int block_size; /* Default value for variable length ciphers / int key_len; int iv_len; / Various flags / unsigned long flags; / init key / int ( init) (EVP_CIPHER_CTX *ctx, const unsigned char *key, const unsigned char iv, int enc); / encrypt/decrypt data / int ( do_cipher) (EVP_CIPHER_CTX *ctx, unsigned char *out, const unsigned char in, size_t inl); / cleanup ctx / int ( cleanup) (EVP_CIPHER_CTX ); / how big ctx->cipher_data needs to be / int ctx_size; / Populate a ASN1_TYPE with parameters / int ( set_asn1_parameters) (EVP_CIPHER_CTX *, ASN1_TYPE ); / Get parameters from a ASN1_TYPE / int ( get_asn1_parameters) (EVP_CIPHER_CTX *, ASN1_TYPE ); / Miscellaneous operations / int ( ctrl) (EVP_CIPHER_CTX *, int type, int arg, void ptr); / Application data */ void app_data; } / EVP_CIPHER */ ; typedef struct evp_cipher_st EVP_CIPHER; 这个结构定义了对称加密算法的抽象方法。主要字段含义: nid —— 加密算法的NID。 block_size —— 分组大小。 key_len —— 密钥长度。 iv_len —— 初使向量长度。 flags —— 内部标志。 init —— 初使化函数。 do_cipher —— 中间运算函数。 cleanup —— 最终运算函数。 ctx_size —— 上下文大小。 ctrl —— 控制函数。 app_data —— 应用程序数据。
支持的CIPHER抽象加解密算法包括: const EVP_CIPHER *EVP_des_ecb(void); const EVP_CIPHER *EVP_des_ede3(void); const EVP_CIPHER *EVP_aes_128_ecb(void); const EVP_CIPHER *EVP_aes_128_cbc(void);
下面这几个函数查询cipher的属性信息: int EVP_CIPHER_nid(const EVP_CIPHER *cipher); int EVP_CIPHER_type(const EVP_CIPHER *ctx); # define EVP_CIPHER_name(e) OBJ_nid2sn(EVP_CIPHER_nid(e)) int EVP_CIPHER_block_size(const EVP_CIPHER *cipher); int EVP_CIPHER_key_length(const EVP_CIPHER *cipher); int EVP_CIPHER_iv_length(const EVP_CIPHER *cipher); 有时我们对使用的加密算法不熟悉,这几个函数很有帮助。
EVP_CIPHER_CTX *EVP_CIPHER_CTX_new(void); void EVP_CIPHER_CTX_free(EVP_CIPHER_CTX *c); 这两个函数用于创建和释放对称加解密上下文对象。
int EVP_CIPHER_CTX_set_key_length(EVP_CIPHER_CTX *x, int keylen); 当对称算法密钥长度为可变长时,设置对称算法的密钥长度。 成功返回1,失败返回0。
int EVP_CIPHER_CTX_set_padding(EVP_CIPHER_CTX *c, int pad); 设置对称算法的填充,对称算法有时候会涉及填充。 pad取值0和1,当pad为1时表示使用填充。默认的填充策略采用PKCS5规范,即最后一个分组被填充n个字节时,其填充值均为n。 成功返回1,失败返回0。
int EVP_EncryptInit(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher, const unsigned char *key, const unsigned char *iv); 初使化对称加密上下文。 成功返加1,失败返回0。
int EVP_EncryptUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl, const unsigned char *in, int inl); 加密一段明文。 成功返加1,失败返回0。成功时,outl输出密文长度。
int EVP_EncryptFinal(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl); 加密余下的明文。 成功返加1,失败返回0。成功时,outl输出密文长度。
int EVP_DecryptInit(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher, const unsigned char *key, const unsigned char *iv); 初使化对称解密上下文。 成功返加1,失败返回0。
int EVP_DecryptUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl, const unsigned char *in, int inl); 解密一段密文。 成功返加1,失败返回0。成功时,outl输出明文长度。
int EVP_DecryptFinal(EVP_CIPHER_CTX *ctx, unsigned char *outm, int *outl); 解密余下的密文。 成功返加1,失败返回0。成功时,outl输出明文长度。
int EVP_BytesToKey(const EVP_CIPHER *type, const EVP_MD *md, const unsigned char *salt, const unsigned char *data, int datal, int count, unsigned char *key, unsigned char *iv); 计算密钥函数,它根据算法类型、摘要算法、salt以及输入数据计算出一个对称密钥和初始化向量iv。返加密钥的长度。 在PEM_do_header()函数中根据口令生成密钥时,有使用到这个函数。
这个结构定义了非对称密钥信息的存储容器。主要字段含义: type —— 非对称加密算法的NID。 save_type —— 保存的PKEY类型。 pkey —— 保存的PKEY指针,如RSA结构指针。
EVP_PKEY *EVP_PKEY_new(void); void EVP_PKEY_free(EVP_PKEY *pkey); 这两个函数用于创建和释放PKEY上下文对象。
int EVP_PKEY_assign(EVP_PKEY *pkey, int type, void *key); 为PKEY关联指定算法类型的上下文结构,如为RSA关联的宏定义如下:
# define EVP_SignInit(a,b) EVP_DigestInit(a,b) # define EVP_SignUpdate(a,b,c) EVP_DigestUpdate(a,b,c) int EVP_SignFinal(EVP_MD_CTX *ctx, unsigned char *md, unsigned int *s, EVP_PKEY *pkey); 签名计算。从宏定义可以看出实际上就是先计算摘要,再用RSA私钥加密。 成功返加1,失败返回0。
# define EVP_VerifyInit(a,b) EVP_DigestInit(a,b) # define EVP_VerifyUpdate(a,b,c) EVP_DigestUpdate(a,b,c) int EVP_VerifyFinal(EVP_MD_CTX *ctx, const unsigned char *sigbuf, unsigned int siglen, EVP_PKEY *pkey); 验签计算。从宏定义可以看出实际上就是先计算摘要,再用RSA公钥解密签名,再与摘要进行比对。 成功返加1,失败返回0。
下面这个例子演示了使用MD5的两种方法进行摘要计算的过程。
输出: EVP_DigestInit() ret:[1] EVP_DigestUpdate() ret:[1] EVP_DigestFinal() ret:[1] e380e88e8d09ebf8d8659a15b0ea70b5 EVP_Digest() ret:1 e380e88e8d09ebf8d8659a15b0ea70b5
下面这个例子演示了使用DES进行加解密的过程。为了方便程序实现,破例使用了std::string。
输出: EVP_EncryptInit() ret:[1] EVP_EncryptUpdate() ret:[1] nCipherLen:[24] EVP_EncryptFinal() ret:[1] nCipherLen:[8] cipher size:[32] EVP_DecryptInit() ret:[1] EVP_DecryptUpdate() ret:[1] nTextLen:[24] EVP_DecryptFinal() ret:[1] nTextLen:[2] text size:[26] body:[abcdefghijklmnopqrstuvwxyz]
下面这个例子演示了使用SHA1进行RSA签名和验签计算的过程。
输出: RSA_generate_key_ex() ret:[1] EVP_PKEY_assign_RSA() ret:[1] EVP_SignInit() ret:[1] EVP_SignUpdate() ret:[1] EVP_SignFinal() ret:[1] sha1 len:[64] EVP_VerifyInit() ret:[1] EVP_VerifyUpdate() ret:[1] EVP_VerifyFinal() ret:[1]