OpenSSL使用指南

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源代码压缩包。

个文件,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(IN,KEY)= OUT

4.1.1.1              DES ECB模式

个随机比特。参数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模式

字节的倍数。

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_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);

比特的版本,既高效又没有填充的麻烦,推荐使用。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(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 <stdio.h>
#include <string.h>
#include <stdlib.h>
#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 <filename>");
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

字节。

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_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 签名和验证

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

字节。

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

字节。

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使用指南的更多相关文章

  1. mysql 5.7/percona server/mariadb 10.2安装与服务器参数优化

    建议使用percona server linux generic版,从https://www.percona.com/downloads/Percona-Server-LATEST/下载,现在不在推荐 ...

  2. openssl 再爆惊天漏洞及紧急修复指南

    openssl 又摊上大事了,2014年6月5日,SSL/TLS Man-in-the-Middle Vulnerability 该漏洞使得攻击者能够拦截恶意中间节点加密和解密数据.同一时候强迫使用弱 ...

  3. Http压测工具wrk使用指南

    用过了很多压测工具,却一直没找到中意的那款.最近试了wrk感觉不错,写下这份使用指南给自己备忘用,如果能帮到你,那也很好. 安装 wrk支持大多数类UNIX系统,不支持windows.需要操作系统支持 ...

  4. 《Ansible权威指南》笔记(3)——Ad-Hoc命令集,常用模块

    五.Ad-Hoc命令集1.Ad-Hoc命令集通过/usr/bin/ansible命令实现:ansible <host-pattern> [options]    -v,--verbose  ...

  5. SSL证书请求文件(CSR)生成指南 - Tomcat

    SSL证书请求文件(CSR)生成指南 - Tomcat http://www.zhenssl.com/support/CSRgen/tomcat_CSR.htm   重要注意事项 An Importa ...

  6. curl网站开发指南

    我一向以为,curl只是一个编程用的函数库. 最近才发现,这个命令本身,就是一个无比有用的网站开发工具,请看我整理的它的用法. =================================== ...

  7. JBoss7配置指南

    JBoss7配置指南   1.    jboss各主要版本特性... 3 1.1.     jboss4特性... 3 1.2.     jboss5特性... 5 1.3.     jboss6特性 ...

  8. 大数据应用日志采集之Scribe 安装配置指南

    大数据应用日志采集之Scribe 安装配置指南 大数据应用日志采集之Scribe 安装配置指南 1.概述 Scribe是Facebook开源的日志收集系统,在Facebook内部已经得到大量的应用.它 ...

  9. Http压测工具wrk使用指南【转】

    用过了很多压测工具,却一直没找到中意的那款.最近试了wrk感觉不错,写下这份使用指南给自己备忘用,如果能帮到你,那也很好. 安装 wrk支持大多数类UNIX系统,不支持windows.需要操作系统支持 ...

随机推荐

  1. TCP/IP笔记 应用层(2)——FTP

    1. FTP(File Transfer Protocol) 文件传送协议 FTP 只提供文件传送的一些基本的服务,它使用 TCP 可靠的运输服务.FTP 的主要功能是减少或消除在不同操作系统下处理文 ...

  2. linux内核源码结构

    一.概述 Linux内核庞大,但是这些文件的结构还是有章可循的,分别位于不同的目录下,各个目录功能相对独立. 二.源码结构表 目录名 描述 arch 体系结构相关的代码,对于每个架构的CPU,arch ...

  3. Collection View 自定义布局(custom flow layout)

    Collection view自定义布局 一般我们自定义布局都会新建一个类,继承自UICollectionViewFlowLayout,然后重写几个方法: prepareLayout():当准备开始布 ...

  4. 学习Swift -- 泛型

    泛型 泛型代码可以让你写出根据自我需求定义.适用于任何类型的,灵活且可重用的函数和类型.它的可以让你避免重复的代码,用一种清晰和抽象的方式来表达代码的意图. 泛型所解决的问题 先来看一个交换两个int ...

  5. UIActionViewController 详解 iOS8

    iOS8推出了几个新的“controller”,主要是把类似之前的UIAlertView变成了UIAlertController,这不经意的改变,貌似把我之前理解的“controller”一下子推翻了 ...

  6. theano中对图像进行convolution 运算

    (1) 定义计算过程中需要的symbolic expression """ 定义相关的symbolic experssion """ # c ...

  7. Ubuntu下安装nvidia显卡驱动

    layout: post title: Ubuntu下安装nvidia显卡驱动 date: 2015-10-02 17:19:06 categories: 常用命令 tags: 显卡 驱动 最近一直在 ...

  8. JENKINS的远程API调用,然后用PYTHON解析出最新的版本及稳定成功的版本

    这个功能,我觉得在作自动作部署时,是可以派上用处的. 记录一下. import urllib f = urllib.urlopen('http://jenkinsurl/job/job_name/ap ...

  9. 解决VS2005 VS2008 vs2010断点无效-源代码与原始版本不同

    网上说的方法:(额~但是我就是不能用.但是也贴出来) 方法1.直接把整个文件格式化了一次,断点就可以用了Ctrl + A全选菜单:编辑-〉高级-〉设置选定内容的格式 (Ctrl+K, Ctrl+F)通 ...

  10. EditText的 焦点事件 setOnFocusChangeListener

    实现代码: //光标处在EditText时其内容消失 mInfo = (EditText)findViewById(R.id.old_password); //setOnFocusChangeList ...