OpenSSL使用指南
来源:百度文库 编辑:神马文学网 时间:2024/06/05 03:45:04
1 介绍
OpenSSL是使用非常广泛的SSL的开源实现。由于其中实现了为SSL所用的各种加密算法,因此OpenSSL也是被广泛使用的加密函数库。
1.1 SSL
SSL(Secure Socket Layer)安全协议是由Netscape公司首先提出,最初用在保护Navigator浏览器和Web服务器之间的HTTP通信(即HTTPS)。后来SSL协议成为传输层安全通信事实上的标准,并被IETF吸收改进为TLS(Transport Layer Security)协议。
SSL/TLS协议位于TCP协议和应用层协议之间,为传输双方提供认证、加密和完整性保护等安全服务。SSL作为一个协议框架,通信双方可以选用合适的对称算法、公钥算法、MAC算法等密码算法实现安全服务。
1.2 OpenSSL
OpenSSL是著名的SSL的开源实现,是用C语言实现的。
OpenSSL的前身是SSLeay,一个由Eric Young开发的SSL的开源实现,支持SSLv2/v3和TLSv1。
伴随着SSL协议的普及应用,OpenSSL被广泛应用在基于TCP/Socket的网络程序中,尤其是OpenSSL和Apache相结合,是很多电子商务网站服务器的典型配置。
2 编译和安装OpenSSL
OpenSSL开放源代码,这对学习、分析SSL和各种密码算法提供了机会,也便于在上面进一步开发。
2.1 获取OpenSSL
到OpenSSL的网站即可下载当前版本的OpenSSL源代码压缩包。
当前版本openssl-0.9.8.tar.gz,只有3M多,比较精简。解压缩后得到一个目录openssl-0.9.8,共有约1800个文件,15M。其中crypto子目录中是众多密码算法实现,ssl子目录中是SSL协议的实现。
在Linux中解压缩:
$tar zxf openssl-0.9.8.tar.gz
在Windows中可以使用winzip或winrar解压。
2.2 编译工具
编译OpenSSL需要Perl和C编译器。在Windows下如果要用加密算法的汇编代码实现,还需要masm或nasm汇编器。(汇编代码可以比C代码显著提高密码运算速度)
Perl在Windows下推荐使用Active Perl。
C编译器可以使用gcc。在Windows下可以使用visual C++编译
汇编器推荐使用nasm。
这些工具所在目录必须加入到PATH环境变量中去。
2.3 编译与安装步骤
查看readme是个好习惯。从readme了解到需要进一步查看INSTALL和INSTALL.W32文件。
在Windows中:
>perl Configure VC-WIN32
>ms\do_nasm(如果不使用汇编代码实现,则可>ms\do_ms)
>nmake -f ms\ntdll.mak
>cd out32dll
>..\ms\test
编译结果得到头文件、链接库、运行库和openssl.exe工具。头文件位于./inc32或者./inculde目录,有一个openssl子目录,内有几十个.h文件。链接库即./out32dll目录中的libeay32.lib 和ssleay32.lib,分别是密码算法相关的和ssl协议相关的。运行库是./out32dll目录中的libeay32.dll 和ssleay32.dll,和链接库相对应。在./out32dll中还有一个工具openssl.exe,可以直接用来测试性能、产生RSA密钥、加解密文件,甚至可以用来维护一个测试用的CA。
在Linux中的编译和安装步骤较简单:
$./config
$make
$make test
$make install
在Linux下,头文件、库文件、工具都已被安装防盗了合适的位置。库文件是.a或.so格式。
3 使用Openssl.exe
使用OpenSSL.exe(Linux中可执行文件名是openssl)可以做很多工作,是一个很好的测试或调试工具。
3.1 版本和编译参数
显示版本和编译参数: >openssl version –a
3.2 支持的子命令、密码算法
查看支持的子命令: >openssl ?
SSL密码组合列表: >openssl ciphers
3.3 测试密码算法速度
测试所有算法速度: >openssl speed
测试RSA速度: >openssl speed rsa
测试des速度: >openssl speed des
3.4 RSA密钥操作
产生RSA密钥对: >openssl genrsa –out 1.key 1024
取出RSA公钥: >openssl rsa –in 1.key –pubout –out 1.pubkey
3.5 加密文件
加密文件: >openssl enc –e –rc4 –in 1.key –out 1.key.enc
解密文件: >openssl enc –d –rc4 –in 1.key.enc –out 1.key.dec
3.6 计算Hash值
计算文件的MD5值: >openssl md5 < 1.key
计算文件的SHA1值: >openssl sha1 < 1.key
4 算法编程API
OpenSSL中支持众多的密码算法,并提供了很好的封装和接口。密码算法主要分为如下几类:对称算法、公钥算法、散列算法、随机数产生算法等。
OpenSSL的目标是实现安全协议。其中相关协议和标准包括:SSL/TLS、PKCS#1、PCKS#10、X.509、PEM、OCSP等。
4.1 对称算法接口
OpenSSL中实现的对称算法太多,举三个例子:DES、AES、RC4。
4.1.1 DES
DES加密算法是分组算法。DES的基本操作是把64比特明文在56比特密钥指引下加密成64比特密文。在实际使用中把密钥看作64比特可以更方便。
DES(IN,KEY)= OUT
4.1.1.1 DES 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.2 DES 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.3 DES CFB模式
DES算法CFB操作模式加解密函数是DES_cfb_encrypt()。参数length指示输入字节长度。参数numbits则指示了CFB每次循环加密多少明文比特,也即密文反馈的比特数目。ivec是初始向量,被看做第0个密文分组,是不用保密但应随机取值的8个字节。如果在一次会话中数次调用DES_cfb_encrypt(),则应该记忆ivec。由于CFB模式中每次DES基本操作只加密numbits比特明文,因此如果numbits太小则效率太低。
void DES_cfb_encrypt(const unsigned char *in, unsigned char *out, int numbits, long length, DES_key_schedule *schedule, DES_cblock *ivec, int enc);
另有一个numbit是64比特的版本,既高效又没有填充的麻烦,推荐使用。num中的返回值指示了ivec中的状态,是和下次调用衔接的。
void DES_cfb64_encrypt(const unsigned char *in, unsigned char *out, long length, DES_key_schedule *schedule, DES_cblock *ivec, int *num, int enc);
4.1.1.4 DES OFB模式
OFB和CFB类似,也有两个函数,用法一样。
void DES_ofb_encrypt(const unsigned char *in,unsigned char *out,int numbits,long length,DES_key_schedule *schedule,DES_cblock *ivec);
void DES_ofb64_encrypt(const unsigned char *in,unsigned char *out,long length,DES_key_schedule *schedule,DES_cblock *ivec,int *num);
4.1.1.5 DES函数实例程序
4.1.2 AES
AES加密算法是分组算法。典型参数的AES的基本操作是把128比特明文在128比特密钥指引下加密成128比特密文。
AES(IN,KEY)= OUT
OpenSSL中关于AES的函数名和参数接口和DES的雷同。相关函数名如下(参数略)。
int AES_set_encrypt_key();
int AES_set_decrypt_key();
void AES_ecb_encrypt();
void AES_cbc_encrypt();
void AES_cfb128_encrypt();
void AES_ofb128_encrypt();
AES实例程序
4.1.3 RC4
RC4密码算法是流算法,也叫序列算法。流算法是从密钥作为种子产生密钥流,明文比特流和密钥流异或即加密。RC4算法由于算法简洁,速度极快,密钥长度可变,而且也没有填充的麻烦,因此在很多场合值得大力推荐。
OpenSSL中RC4算法有两个函数: RC4_set_key()设置密钥,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);
RC4示例程序:
#include
#include
#include
#include "rc4.h"
char *version = "rc4enc v0.2+naive 1:47 2003-3-13 by Linden";
int enc(char* buff, int len, char* buff2, int* len2)
{
char passwd[16];
RC4_KEY key;
memset(passwd, 0, 16);
puts("Pleasw input passwd:");
gets(passwd);
RC4_set_key(&key, 16, passwd);
RC4(&key, len, buff, buff2);
*len2 = len;
return 0;
}
main(int argc, char* argv[])
{
char* fname1;
char fname2[100];
FILE *file1, *file2;
char buff1[10*1024];
char buff2[10*1024];
int len1, len2;
if (argc!=2)
{
puts("usage: enc");
return -1;
}
fname1 = argv[1];
strcpy(fname2, fname1);
strcat(fname2, ".enc");
file1 = fopen(fname1, "rb");
file2 = fopen(fname2, "wb");
while (1)
{
len1 = fread(buff1, 1, 10*1024, file1);
if (len1<=0)
break;
enc(buff1, len1, buff2, &len2);
fwrite(buff2, 1, len2, file2);
}
fclose(file1);
fclose(file2);
}
4.2 公钥算法
OpenSSL中实现了RSA、DSA、ECDSA等公钥算法。
4.2.1 RSA
RSA是分组算法,典型的密钥模长度1024比特时,分组即是1024比特,即128字节。
4.2.1.1 RSA密钥
RSA密钥产生函数RSA_generate_key(),需要指定模长比特数bits和公钥指数e。另外两个参数为NULL即可。
RSA * RSA_generate_key(int bits, unsigned long e, void (*callback) (int,int,void *),void *cb_arg);
如果从文件中读取密钥,可使用函数PEM_read_bio_PrivateKey()/ PEM_read_bio_PUBKEY();EVP_PKEY 中包含一个RSA结构,可以引用。
EVP_PKEY *PEM_read_bio_PrivateKey(BIO *bp, EVP_PKEY **x, pem_password_cb *cb, void *u);
4.2.1.2 RSA加密解密
RSA加密函数RSA_public_encrypt()使用公钥部分,解密函数RSA_private_decrypt()使用私钥。填充方式常用的有两种RSA_PKCS1_PADDING和RSA_PKCS1_OAEP_PADDING。出错时返回-1。输入必须比RSA钥模长短至少11个字节(在RSA_PKCS1_PADDING时?)。输出长度等于RSA钥的模长。
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);
4.2.1.3 签名和验证
签名使用私钥,验证使用公钥。RSA签名是把被签署消息的散列值编码后用私钥加密,因此函数中参数type用来指示散列函数的类型,一般是NID_md5或NID_sha1。正确情况下返回0。
int RSA_sign(int type, const unsigned char *m, unsigned int m_length, unsigned char *sigret, unsigned int *siglen, RSA *rsa);
int RSA_verify(int type, const unsigned char *m, unsigned int m_length, unsigned char *sigbuf, unsigned int siglen, RSA *rsa);
4.2.1.4 RSA函数实例程序
4.3 Hash算法
Hash算法举MD5和SHA1两个例子。Hash算法重复接收用户输入,直到最后一次结束时输出散列结果。
4.3.1MD5
MD5算法输出的散列值是16字节。
int MD5_Init(MD5_CTX *c);
int MD5_Update(MD5_CTX *c, const void *data, size_t len);
int MD5_Final(unsigned char *md, MD5_CTX *c);
4.3.2 SHA1
SHA1算法输出的散列值是20字节。
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);
4.3.3 MD5例子
4.4 随机数算法
随机性是密码安全的基石。为了产生安全的伪随机数,必须有好的随机因素作为种子。OpenSSL在内部做了努力,但是仍建议在实用随机数产生函数之前添加随机因素。
函数RAND_add()可以添加随机因素到内部状态中去。然后,即可以使用RAND_bytes()获得随机数。
void RAND_add(const void *buf,int num,double entropy);
int RAND_bytes(unsigned char *buf,int num);
5 SSL协议编程API
5.1 客户端
5.2服务器端
5.3 SSL实例程序
6 CA和证书
6.1 OpenSSL中CA的配置
6.2 配置实例
6.3 证书解析
6.4 解析实例程序
7 参考网址
SSL 3.0 Specification
http://www.netscape.com/eng/ssl3/
Transport Layer Security (tls) Charter
http://www.ietf.org/html.charters/tls-charter.html
OpenSSL: The Open Source toolkit for SSL/TLS
http://www.openssl.org/
SSLeay
http://www2.psy.uq.edu.au/~ftp/Crypto/
OpenSSL中文论坛
http://openssl.cn/
Perl
http://www.cpan.org/src/README.html
http://www.activestate.com/Products/ActivePerl/
NASM
http://www.perl.com/
OpenSSL是使用非常广泛的SSL的开源实现。由于其中实现了为SSL所用的各种加密算法,因此OpenSSL也是被广泛使用的加密函数库。
1.1 SSL
SSL(Secure Socket Layer)安全协议是由Netscape公司首先提出,最初用在保护Navigator浏览器和Web服务器之间的HTTP通信(即HTTPS)。后来SSL协议成为传输层安全通信事实上的标准,并被IETF吸收改进为TLS(Transport Layer Security)协议。
SSL/TLS协议位于TCP协议和应用层协议之间,为传输双方提供认证、加密和完整性保护等安全服务。SSL作为一个协议框架,通信双方可以选用合适的对称算法、公钥算法、MAC算法等密码算法实现安全服务。
1.2 OpenSSL
OpenSSL是著名的SSL的开源实现,是用C语言实现的。
OpenSSL的前身是SSLeay,一个由Eric Young开发的SSL的开源实现,支持SSLv2/v3和TLSv1。
伴随着SSL协议的普及应用,OpenSSL被广泛应用在基于TCP/Socket的网络程序中,尤其是OpenSSL和Apache相结合,是很多电子商务网站服务器的典型配置。
2 编译和安装OpenSSL
OpenSSL开放源代码,这对学习、分析SSL和各种密码算法提供了机会,也便于在上面进一步开发。
2.1 获取OpenSSL
到OpenSSL的网站即可下载当前版本的OpenSSL源代码压缩包。
当前版本openssl-0.9.8.tar.gz,只有3M多,比较精简。解压缩后得到一个目录openssl-0.9.8,共有约1800个文件,15M。其中crypto子目录中是众多密码算法实现,ssl子目录中是SSL协议的实现。
在Linux中解压缩:
$tar zxf openssl-0.9.8.tar.gz
在Windows中可以使用winzip或winrar解压。
2.2 编译工具
编译OpenSSL需要Perl和C编译器。在Windows下如果要用加密算法的汇编代码实现,还需要masm或nasm汇编器。(汇编代码可以比C代码显著提高密码运算速度)
Perl在Windows下推荐使用Active Perl。
C编译器可以使用gcc。在Windows下可以使用visual C++编译
汇编器推荐使用nasm。
这些工具所在目录必须加入到PATH环境变量中去。
2.3 编译与安装步骤
查看readme是个好习惯。从readme了解到需要进一步查看INSTALL和INSTALL.W32文件。
在Windows中:
>perl Configure VC-WIN32
>ms\do_nasm(如果不使用汇编代码实现,则可>ms\do_ms)
>nmake -f ms\ntdll.mak
>cd out32dll
>..\ms\test
编译结果得到头文件、链接库、运行库和openssl.exe工具。头文件位于./inc32或者./inculde目录,有一个openssl子目录,内有几十个.h文件。链接库即./out32dll目录中的libeay32.lib 和ssleay32.lib,分别是密码算法相关的和ssl协议相关的。运行库是./out32dll目录中的libeay32.dll 和ssleay32.dll,和链接库相对应。在./out32dll中还有一个工具openssl.exe,可以直接用来测试性能、产生RSA密钥、加解密文件,甚至可以用来维护一个测试用的CA。
在Linux中的编译和安装步骤较简单:
$./config
$make
$make test
$make install
在Linux下,头文件、库文件、工具都已被安装防盗了合适的位置。库文件是.a或.so格式。
3 使用Openssl.exe
使用OpenSSL.exe(Linux中可执行文件名是openssl)可以做很多工作,是一个很好的测试或调试工具。
3.1 版本和编译参数
显示版本和编译参数: >openssl version –a
3.2 支持的子命令、密码算法
查看支持的子命令: >openssl ?
SSL密码组合列表: >openssl ciphers
3.3 测试密码算法速度
测试所有算法速度: >openssl speed
测试RSA速度: >openssl speed rsa
测试des速度: >openssl speed des
3.4 RSA密钥操作
产生RSA密钥对: >openssl genrsa –out 1.key 1024
取出RSA公钥: >openssl rsa –in 1.key –pubout –out 1.pubkey
3.5 加密文件
加密文件: >openssl enc –e –rc4 –in 1.key –out 1.key.enc
解密文件: >openssl enc –d –rc4 –in 1.key.enc –out 1.key.dec
3.6 计算Hash值
计算文件的MD5值: >openssl md5 < 1.key
计算文件的SHA1值: >openssl sha1 < 1.key
4 算法编程API
OpenSSL中支持众多的密码算法,并提供了很好的封装和接口。密码算法主要分为如下几类:对称算法、公钥算法、散列算法、随机数产生算法等。
OpenSSL的目标是实现安全协议。其中相关协议和标准包括:SSL/TLS、PKCS#1、PCKS#10、X.509、PEM、OCSP等。
4.1 对称算法接口
OpenSSL中实现的对称算法太多,举三个例子:DES、AES、RC4。
4.1.1 DES
DES加密算法是分组算法。DES的基本操作是把64比特明文在56比特密钥指引下加密成64比特密文。在实际使用中把密钥看作64比特可以更方便。
DES(IN,KEY)= OUT
4.1.1.1 DES 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.2 DES 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.3 DES CFB模式
DES算法CFB操作模式加解密函数是DES_cfb_encrypt()。参数length指示输入字节长度。参数numbits则指示了CFB每次循环加密多少明文比特,也即密文反馈的比特数目。ivec是初始向量,被看做第0个密文分组,是不用保密但应随机取值的8个字节。如果在一次会话中数次调用DES_cfb_encrypt(),则应该记忆ivec。由于CFB模式中每次DES基本操作只加密numbits比特明文,因此如果numbits太小则效率太低。
void DES_cfb_encrypt(const unsigned char *in, unsigned char *out, int numbits, long length, DES_key_schedule *schedule, DES_cblock *ivec, int enc);
另有一个numbit是64比特的版本,既高效又没有填充的麻烦,推荐使用。num中的返回值指示了ivec中的状态,是和下次调用衔接的。
void DES_cfb64_encrypt(const unsigned char *in, unsigned char *out, long length, DES_key_schedule *schedule, DES_cblock *ivec, int *num, int enc);
4.1.1.4 DES OFB模式
OFB和CFB类似,也有两个函数,用法一样。
void DES_ofb_encrypt(const unsigned char *in,unsigned char *out,int numbits,long length,DES_key_schedule *schedule,DES_cblock *ivec);
void DES_ofb64_encrypt(const unsigned char *in,unsigned char *out,long length,DES_key_schedule *schedule,DES_cblock *ivec,int *num);
4.1.1.5 DES函数实例程序
4.1.2 AES
AES加密算法是分组算法。典型参数的AES的基本操作是把128比特明文在128比特密钥指引下加密成128比特密文。
AES(IN,KEY)= OUT
OpenSSL中关于AES的函数名和参数接口和DES的雷同。相关函数名如下(参数略)。
int AES_set_encrypt_key();
int AES_set_decrypt_key();
void AES_ecb_encrypt();
void AES_cbc_encrypt();
void AES_cfb128_encrypt();
void AES_ofb128_encrypt();
AES实例程序
4.1.3 RC4
RC4密码算法是流算法,也叫序列算法。流算法是从密钥作为种子产生密钥流,明文比特流和密钥流异或即加密。RC4算法由于算法简洁,速度极快,密钥长度可变,而且也没有填充的麻烦,因此在很多场合值得大力推荐。
OpenSSL中RC4算法有两个函数: RC4_set_key()设置密钥,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);
RC4示例程序:
#include
#include
#include
#include "rc4.h"
char *version = "rc4enc v0.2+naive 1:47 2003-3-13 by Linden";
int enc(char* buff, int len, char* buff2, int* len2)
{
char passwd[16];
RC4_KEY key;
memset(passwd, 0, 16);
puts("Pleasw input passwd:");
gets(passwd);
RC4_set_key(&key, 16, passwd);
RC4(&key, len, buff, buff2);
*len2 = len;
return 0;
}
main(int argc, char* argv[])
{
char* fname1;
char fname2[100];
FILE *file1, *file2;
char buff1[10*1024];
char buff2[10*1024];
int len1, len2;
if (argc!=2)
{
puts("usage: enc
return -1;
}
fname1 = argv[1];
strcpy(fname2, fname1);
strcat(fname2, ".enc");
file1 = fopen(fname1, "rb");
file2 = fopen(fname2, "wb");
while (1)
{
len1 = fread(buff1, 1, 10*1024, file1);
if (len1<=0)
break;
enc(buff1, len1, buff2, &len2);
fwrite(buff2, 1, len2, file2);
}
fclose(file1);
fclose(file2);
}
4.2 公钥算法
OpenSSL中实现了RSA、DSA、ECDSA等公钥算法。
4.2.1 RSA
RSA是分组算法,典型的密钥模长度1024比特时,分组即是1024比特,即128字节。
4.2.1.1 RSA密钥
RSA密钥产生函数RSA_generate_key(),需要指定模长比特数bits和公钥指数e。另外两个参数为NULL即可。
RSA * RSA_generate_key(int bits, unsigned long e, void (*callback) (int,int,void *),void *cb_arg);
如果从文件中读取密钥,可使用函数PEM_read_bio_PrivateKey()/ PEM_read_bio_PUBKEY();EVP_PKEY 中包含一个RSA结构,可以引用。
EVP_PKEY *PEM_read_bio_PrivateKey(BIO *bp, EVP_PKEY **x, pem_password_cb *cb, void *u);
4.2.1.2 RSA加密解密
RSA加密函数RSA_public_encrypt()使用公钥部分,解密函数RSA_private_decrypt()使用私钥。填充方式常用的有两种RSA_PKCS1_PADDING和RSA_PKCS1_OAEP_PADDING。出错时返回-1。输入必须比RSA钥模长短至少11个字节(在RSA_PKCS1_PADDING时?)。输出长度等于RSA钥的模长。
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);
4.2.1.3 签名和验证
签名使用私钥,验证使用公钥。RSA签名是把被签署消息的散列值编码后用私钥加密,因此函数中参数type用来指示散列函数的类型,一般是NID_md5或NID_sha1。正确情况下返回0。
int RSA_sign(int type, const unsigned char *m, unsigned int m_length, unsigned char *sigret, unsigned int *siglen, RSA *rsa);
int RSA_verify(int type, const unsigned char *m, unsigned int m_length, unsigned char *sigbuf, unsigned int siglen, RSA *rsa);
4.2.1.4 RSA函数实例程序
4.3 Hash算法
Hash算法举MD5和SHA1两个例子。Hash算法重复接收用户输入,直到最后一次结束时输出散列结果。
4.3.1MD5
MD5算法输出的散列值是16字节。
int MD5_Init(MD5_CTX *c);
int MD5_Update(MD5_CTX *c, const void *data, size_t len);
int MD5_Final(unsigned char *md, MD5_CTX *c);
4.3.2 SHA1
SHA1算法输出的散列值是20字节。
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);
4.3.3 MD5例子
4.4 随机数算法
随机性是密码安全的基石。为了产生安全的伪随机数,必须有好的随机因素作为种子。OpenSSL在内部做了努力,但是仍建议在实用随机数产生函数之前添加随机因素。
函数RAND_add()可以添加随机因素到内部状态中去。然后,即可以使用RAND_bytes()获得随机数。
void RAND_add(const void *buf,int num,double entropy);
int RAND_bytes(unsigned char *buf,int num);
5 SSL协议编程API
5.1 客户端
5.2服务器端
5.3 SSL实例程序
6 CA和证书
6.1 OpenSSL中CA的配置
6.2 配置实例
6.3 证书解析
6.4 解析实例程序
7 参考网址
SSL 3.0 Specification
http://www.netscape.com/eng/ssl3/
Transport Layer Security (tls) Charter
http://www.ietf.org/html.charters/tls-charter.html
OpenSSL: The Open Source toolkit for SSL/TLS
http://www.openssl.org/
SSLeay
http://www2.psy.uq.edu.au/~ftp/Crypto/
OpenSSL中文论坛
http://openssl.cn/
Perl
http://www.cpan.org/src/README.html
http://www.activestate.com/Products/ActivePerl/
NASM
http://www.perl.com/
OpenSSL使用指南
Preparation of using OpenSSL
openssl - 获得public key
OpenSSL to Keytool Conversion tips
OpenSSL to Keytool Conversion tips
GCC使用指南
信用卡使用指南
Cygwin使用指南
wget 使用指南
textarea使用指南
VNC使用指南
VNC使用指南
mybase使用指南
WinRAR使用指南
笔记本电脑使用指南
表格使用指南
Cygwin使用指南
SecureCRT 使用指南
SecureCRT 使用指南
数码相机使用指南
Accessdiver使用指南
wordpress使用指南
grubinst_gui使用指南
jpeglib使用指南