-
openssl使用
2010-01-15 14:54:00openssl使用 1. websiteSSL(secure Socket Layer)TLS(transport Layer Security) - SSL3.0基础之上提出的安全通信标准,目前版本是1.0openssl 主页 -> http://www.openssl.org/openssl 中文文档 -> ...openssl使用
1. website
SSL(secure Socket Layer)
TLS(transport Layer Security) - SSL3.0基础之上提出的安全通信标准,目前版本是1.0
openssl 主页 -> http://www.openssl.org/
openssl 中文文档 -> http://www.chinaunix.net/jh/13/478901.html2. 如何编译OpenSSL in Windows?
a) 下载openssl -> openssl-0.9.8i
b) 下载perl -> http://downloads.activestate.com/ActivePerl/Windows/5.8/ActivePerl-5.8.8.822-MSWin32-x86-280952.zip
c) 安装perl -> ActivePerl-5.8.8.822-MSWin32-x86-280952/Installer.bat (之前先运行vcvars32.bat,需要运行perf Configure VC-WIN32来设置环境变量)
d) 使windows支持nmake -> C:/Program Files/Microsoft Visual Studio 10.0/VC/bin/vcvars32.bat
e) 进入openssl路径 -> cd C:/devdiv/openssl-0.9.8i (工作路径)
f) 创建Makefile文件: ms/do_ms (出现%osversion% is not defined的错误忽略即可)
g) 编译动态库: nmake -f ms/ntdll.mak
编译静态库: nmake -f ms/nt.mak测试动态库: nmake -f ms/ntdll.mak test
测试静态库: nmake -f ms/nt.mak test安装动态库: nmake -f ms/ntdll.mak install
安装静态库: nmake -f ms/nt.mak install清除上次动态库的编译,以便重新编译: nmake -f ms/ntdll.mak clean
清除上次静态库的编译,以便重新编译: nmake -f ms/nt.mak clean
3. 如何使用openssl?
a) library path -> C:/devdiv/openssl-0.9.8i/out32
b) include path -> C:/devdiv/openssl-0.9.8i/include
c) 库文件 -> libeay32.lib, ssleay32.lib4. 配置文件在哪里?
C:/devdiv/openssl-0.9.8i/apps/openssl.cnf
5. 关于key:
key一般分为public key和private key,在openssl中,private key中包含了public key的信息,所以public key不需要单独创建. 如何创建一个RSA key?
openssl.exe genrsa -des3 -out privatekey.pem 2048 (需要添加密码保护)
openssl.exe genrsa -out privatekey.pem 2048
6. 关于certificates(证书文件), 如何创建一个证书呢?
一般流程是:
a. 创建一个private key
b. 创建一个certificate signing request(证书请求), 这个需要a#中创建的private key.因为证书中需要包含public key,
创建的priavate key中有这些信息.
(openssl.exe req -new -key privatekey.pem-out cacert.csr)
c. 把创建好的证书请求拿到CA(certificate authority)证书认证机构审批.
7. 如何做一个自签名的证书呢?
openssl.exe req -new -x509 -key privatekey.pem -out cacert.pem -days 1095
(Note: privatekey.pem需要自己创建)
8. Demo: 来自openssl自带的demo,略做修改.
Server:#include <stdio.h>
//#include <unistd.h>
#include <stdlib.h>
#include <memory.h>
#include <errno.h>
//#include <sys/types.h>
//#include <sys/socket.h>
//#include <netinet/in.h>
//#include <arpa/inet.h>
//#include <netdb.h>
#include "Winsock2.h"
#include <openssl/rsa.h> /* SSLeay stuff */
#include <openssl/crypto.h>
#include <openssl/x509.h>
#include <openssl/pem.h>
#include <openssl/ssl.h>
#include <openssl/err.h>
/* define HOME to be dir for key and cert files... */
#define HOME "./"
/* Make these what you want for cert & key files */
//#define CERTF HOME "foo-cert.pem"
#define CERTFPATH "D://Works//VCSample//ssl_srv//Debug//cacert.pem"
//#define KEYF HOME "foo-cert.pem"
#define KEYFPATH "D://Works//VCSample//ssl_srv//Debug//privatekey.pem"
#pragma comment( lib, "ws2_32.lib" )
#pragma comment( lib, "libeay32.lib" )
#pragma comment( lib, "ssleay32.lib" )
#define CHK_NULL(x) if ((x)==NULL) exit (1)
#define CHK_ERR(err,s) if ((err)==-1) { perror(s); exit(1); }
#define CHK_SSL(err) if ((err)==-1) { ERR_print_errors_fp(stderr); exit(2); }
void main ()
{
int err;
int listen_sd;
int sd;
struct sockaddr_in sa_serv;
struct sockaddr_in sa_cli;
size_t client_len;
SSL_CTX* ctx;
SSL* ssl;
X509* client_cert;
char* str;
char buf [4096];
SSL_METHOD *meth;
/* SSL preliminaries. We keep the certificate and key with the context. */
WSADATA WSAData;
if(WSAStartup(MAKEWORD(2,2), &WSAData))
return ;
SSL_load_error_strings();
SSLeay_add_ssl_algorithms();
meth = SSLv23_server_method();
ctx = SSL_CTX_new (meth);
if (!ctx) {
ERR_print_errors_fp(stderr);
exit(2);
}
if (SSL_CTX_use_certificate_file(ctx, CERTFPATH, SSL_FILETYPE_PEM) <= 0) {
ERR_print_errors_fp(stderr);
exit(3);
}
if (SSL_CTX_use_PrivateKey_file(ctx, KEYFPATH, SSL_FILETYPE_PEM) <= 0) {
ERR_print_errors_fp(stderr);
exit(4);
}
if (!SSL_CTX_check_private_key(ctx)) {
fprintf(stderr,"Private key does not match the certificate public key/n");
exit(5);
}
/* ----------------------------------------------- */
/* Prepare TCP socket for receiving connections */
listen_sd = socket (AF_INET, SOCK_STREAM, 0);
CHK_ERR(listen_sd, "socket");
memset (&sa_serv, '/0', sizeof(sa_serv));
sa_serv.sin_family = AF_INET;
sa_serv.sin_addr.s_addr = INADDR_ANY;
sa_serv.sin_port = htons (1111); /* Server Port number */
err = bind(listen_sd, (struct sockaddr*) &sa_serv,
sizeof (sa_serv)); CHK_ERR(err, "bind");
/* Receive a TCP connection. */
err = listen (listen_sd, 5); CHK_ERR(err, "listen");
client_len = sizeof(sa_cli);
sd = accept (listen_sd, (struct sockaddr*) &sa_cli, (int *)&client_len);
CHK_ERR(sd, "accept");
//close (listen_sd);
closesocket(listen_sd);
printf ("Connection from %lx, port %d/n",
sa_cli.sin_addr.s_addr, sa_cli.sin_port);
/* ----------------------------------------------- */
/* TCP connection is ready. Do server side SSL. */
ssl = SSL_new (ctx); CHK_NULL(ssl);
SSL_set_fd (ssl, sd);
err = SSL_accept (ssl); CHK_SSL(err);
/* Get the cipher - opt */
printf ("SSL connection using %s/n", SSL_get_cipher (ssl));
/* Get client's certificate (note: beware of dynamic allocation) - opt */
client_cert = SSL_get_peer_certificate (ssl);
if (client_cert != NULL) {
printf ("Client certificate:/n");
str = X509_NAME_oneline (X509_get_subject_name (client_cert), 0, 0);
CHK_NULL(str);
printf ("/t subject: %s/n", str);
OPENSSL_free (str);
str = X509_NAME_oneline (X509_get_issuer_name (client_cert), 0, 0);
CHK_NULL(str);
printf ("/t issuer: %s/n", str);
OPENSSL_free (str);
/* We could do all sorts of certificate verification stuff here before
deallocating the certificate. */
X509_free (client_cert);
} else
printf ("Client does not have certificate./n");
/* DATA EXCHANGE - Receive message and send reply. */
err = SSL_read (ssl, buf, sizeof(buf) - 1); CHK_SSL(err);
buf[err] = '/0';
printf ("Got %d chars:'%s'/n", err, buf);
err = SSL_write (ssl, "I hear you.", strlen("I hear you.")); CHK_SSL(err);
/* Clean up. */
//close (sd);
closesocket(sd);
SSL_free (ssl);
SSL_CTX_free (ctx);
getchar();
}
/* EOF - serv.cpp */Client:
#include <stdio.h>
#include <memory.h>
#include <errno.h>
#include <sys/types.h>
//#include <sys/socket.h>
#include "Winsock2.h"
//#include <netinet/in.h>
//#include <arpa/inet.h>
//#include <netdb.h>
#include <openssl/crypto.h>
#include <openssl/x509.h>
#include <openssl/pem.h>
#include <openssl/ssl.h>
#include <openssl/err.h>
#pragma comment( lib, "ws2_32.lib" )
#pragma comment( lib, "libeay32.lib" )
#pragma comment( lib, "ssleay32.lib" )
#define CHK_NULL(x) if ((x)==NULL) exit (1)
#define CHK_ERR(err,s) if ((err)==-1) { perror(s); exit(1); }
#define CHK_SSL(err) if ((err)==-1) { ERR_print_errors_fp(stderr); exit(2); }
void main ()
{
int err;
int sd;
struct sockaddr_in sa;
SSL_CTX* ctx;
SSL* ssl;
X509* server_cert;
char* str;
char buf [4096];
SSL_METHOD *meth;
WSADATA WSAData;
if(WSAStartup(MAKEWORD(2,2), &WSAData))
return ;
SSLeay_add_ssl_algorithms();
meth = SSLv2_client_method();
SSL_load_error_strings();
ctx = SSL_CTX_new (meth); CHK_NULL(ctx);
CHK_SSL(err);
/* ----------------------------------------------- */
/* Create a socket and connect to server using normal socket calls. */
sd = socket (AF_INET, SOCK_STREAM, 0); CHK_ERR(sd, "socket");
memset (&sa, '/0', sizeof(sa));
sa.sin_family = AF_INET;
sa.sin_addr.s_addr = inet_addr ("127.0.0.1"); /* Server IP */
sa.sin_port = htons (1111); /* Server Port number */
err = connect(sd, (struct sockaddr*) &sa,
sizeof(sa)); CHK_ERR(err, "connect");
/* ----------------------------------------------- */
/* Now we have TCP conncetion. Start SSL negotiation. */
ssl = SSL_new (ctx); CHK_NULL(ssl);
SSL_set_fd (ssl, sd);
err = SSL_connect (ssl); CHK_SSL(err);
/* Following two steps are optional and not required for
data exchange to be successful. */
/* Get the cipher - opt */
printf ("SSL connection using %s/n", SSL_get_cipher (ssl));
/* Get server's certificate (note: beware of dynamic allocation) - opt */
server_cert = SSL_get_peer_certificate (ssl); CHK_NULL(server_cert);
printf ("Server certificate:/n");
str = X509_NAME_oneline (X509_get_subject_name (server_cert),0,0);
CHK_NULL(str);
printf ("/t subject: %s/n", str);
OPENSSL_free (str);
str = X509_NAME_oneline (X509_get_issuer_name (server_cert),0,0);
CHK_NULL(str);
printf ("/t issuer: %s/n", str);
OPENSSL_free (str);
/* We could do all sorts of certificate verification stuff here before
deallocating the certificate. */
X509_free (server_cert);
/* --------------------------------------------------- */
/* DATA EXCHANGE - Send a message and receive a reply. */
err = SSL_write (ssl, "Hello Worldfff!", strlen("Hello Worldfff!")); CHK_SSL(err);
err = SSL_read (ssl, buf, sizeof(buf) - 1); CHK_SSL(err);
buf[err] = '/0';
printf ("Got %d chars:'%s'/n", err, buf);
SSL_shutdown (ssl); /* send SSL/TLS close_notify */
/* Clean up. */
// close (sd);
closesocket(sd);
SSL_free (ssl);
SSL_CTX_free (ctx);
}
/* EOF - cli.cpp */ -
Openssl使用
2011-11-05 16:38:34openssl enc -des3 -in 026h23f.txt -out out026h23f.des 即可对文件026h23f.txt(明文)进行加密。 2、对某个已加密的文件进行解密 openssl enc -des3 -d -in out026h23f.des -out new026h23f.txt 将会对...1、对某个文件进行DES3加密
openssl enc -des3 -in 026h23f.txt -out out026h23f.des
即可对文件026h23f.txt(明文)进行加密。
2、对某个已加密的文件进行解密
openssl enc -des3 -d -in out026h23f.des -out new026h23f.txt
将会对out026h23f.des密文进行解密,产生一个明文文件new026h23f.txt
3、对某个经过BASE64编码后的文件进行解码
openssl enc -base64 -d -in 026h23fbase64.txt -out 026h23fplain.txt
对Base64编码后的文件026h23fbase64.txt进行解码,解码后产生的新文件为026h23f plain.txt
4、产生一对RSA非对称密钥(公钥与私钥),并分别用它们来对某个文件进行加密和解密
openssl genrsa -des3 -out myrsaCA.key 1024
将会产生一个RSA私钥,私钥放在myrsaCA.key文件中
openssl rsa -in myrsaCA.key -text –noout
可在屏幕上显示私钥文件myrsaCA.key中的私钥内容。当然在显示前,该命令会自动对私钥文件myrsaCA.key中的内容进行des3解密,解密需要des3对称密钥,因此,在执行该命令的过程中,会要求输入保护口令。
openssl rsa -in myrsaCA.key -pubout -out myrsapubkey.pem
可导出RSA公钥,导出的公钥放在myrsapubkey.pem文件中,当然执行命令时这里也需要输入保护口令。
4.1、用公钥对文件加密,以后用私钥对文件解密(加密模式)
openssl rsautl -encrypt -in 026h23f.txt -pubin -inkey myrsapubkey.pem -out pub026h23f.enc
用公钥对文件026h23f.txt加密,产生的密文为pub026h23f.enc
openssl rsautl -decrypt -in pub026h23f.enc -inkey myrsaCA.key -out newpub026h23f.txt
用私钥对刚才加密的文件pub026h23f.enc进行解密,解密时也需输入口令
4.2、用私钥对文件加密,以后用共钥对文件解密(签名模式)
openssl rsautl -sign -in 026h23f.txt -inkey myrsaCA.key -out pri026h23f.enc
用私钥对文件026h23f.txt进行加密,产生的密文为pri026h23f.enc
openssl rsautl -verify -in pri026h23f.enc -pubin -inkey myrsapubkey.pem -out newpri026h23f.txt
用共钥对密文pri026h23f.enc进行解密,产生的明文为 newpri026h23f.txt
5、对某个文件产生数字摘要
openssl dgst -md5 -out 026h23f.md5 026h23f.txt
6、对某个文件产生的数字摘要进行签名,并验证签名
openssl dgst -md5 -out 026h23f.sign -sign 026h23f.key 026h23f.txt ,产生一个数字签名摘要,放置在026h23f.sign文件中
openssl dgst -md5 -signature 026h23f.sign -prverify 026h23f.key 026h23f.txt ,在屏幕上显示验证的结果
7、为用户颁发数字证书
7.1、为CA创建一个证书签名用的RSA私钥
openssl genrsa -des3 -out ca.key 1024
生成的私钥放在文件ca.key中。注意,执行时,需要输入保护口令
7.2、为CA创建一个自签名的CA根证书
openssl req -new -x509 -days 365 -key ca.key -out cacert.crt -config openssl.cnf7.3、为用户(服务器、个人)颁发证书
要为用户颁发证书,先要用genrsa子命令为用户生成一个私钥,再用req子命令为用户生成一个证书签署请求CSR,然后再用x509子命令来为用户生成一个由CA签名的证书,输入的三个命令分别为:openssl genrsa -des3 -out 026h23f.key 1024openssl req -new -key 026h23f.key -out 026h23f.csr -config openssl.cnfopenssl x509 -req -in 026h23f.csr -out 026h23f.crt -CA cacert.crt -CAkey ca.key -days 6008、上面生成的用户私钥和用户的X.509证书封装成一个个人信息交换证书,用于电子邮件的加密与签名
8.1
个人信息交换证书中封装有用户的X.509证书(内含用户的公共密钥)和用户的私有密钥,可以用在电子邮件系统中分别对邮件进行签名和加密。当用户的私钥026h23f.key和用户的X.509证书026h23f.crt产生后,接下来就可以用Openssl将它们封装成一个个人信息交换证书。具体命令为:
openssl pkcs12 -export -clcerts -in 026h23f.crt -inkey 026h23f.key -out 026h23f.p12执行完此命令后,将生成一个名为026h23f.p12的用户个人信息交换证书。有了这个个人信息交换证书,就可以将它导入到outlook express中,以便加密或签名电子邮件。具体步骤为:打开outlook express,选择菜单[工具]—>[选项],在出现的对话框窗口中单击“安全”项下的“数字标识”按钮,在出现的证书窗口中分别导入个人信息交换证书026h23f.p12和受信任的根证书cacert.crt,以后可以用此个人信息交换证书来对新建的电子邮件进行加密和签名了
8.2
对某个电子邮件进行加密与解密、签名与验证 。步骤如下:对某个邮件进行加密,形成数字信封$openssl smime -encrypt -in my.txt -out my.enc 026h23f.crt对某个加密的邮件进行解密(拆解数字信封)$openssl smime -decrypt -in my.enc -out my.txt1 -inkey 026h23f.key -recip 026h23f.crt对某个邮件进行数字签名$openssl smime -sign -in my.txt -out my.sign -inkey 026h23f.key -singer 026h23f.crt对某个签名的邮件进行验证$openssl smime -verify -in my.sign -out my.txt -ceritfile 026h23f.crt -CAfile cacert.crt对邮件签名后再加密$openssl smime -sign -in my.txt -out my.sign -inkey 026h23f.key -singer 026h23f.crt$openssl smime -encrypt -in my.txt -out my.enc 026h23f.crt -
OpenSSL使用指南
2013-10-10 11:46:33OpenSSL使用指南 1 介绍 OpenSSL是使用非常广泛的SSL的开源实现。由于其中实现了为SSL所用的各种加密算法,因此OpenSSL也是被广泛使用的加密函数库。 1.1 SSL SSL(Secure Socket Layer)安全协议是由Netscape...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源代码压缩包。
当前版本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 <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
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
SSLeay
http://www2.psy.uq.edu.au/~ftp/Crypto/
OpenSSL中文论坛
Perl
http://www.cpan.org/src/README.html
http://www.activestate.com/Products/ActivePerl/
NASM
-
OpenSSL 使用 base64 编码/解码
2016-10-27 18:35:13关于 OpenSSL 的介绍及安装请参见:[Windows 下编译 OpenSSL](http://blog.csdn.net/u011012932/article/details/51658574 "Windows 下编译 OpenSSL&...下面主要介绍有关 OpenSSL 使用 base64 编码/解码。简述
关于 OpenSSL 的介绍及安装请参见:Windows 下编译 OpenSSL
下面主要介绍有关 OpenSSL 使用 base64 编码/解码。
| 版权声明:一去、二三里,未经博主允许不得转载。
编码/解码
#include <openssl/evp.h> #include <openssl/bio.h> #include <openssl/buffer.h> #include <string> #include <iostream> using namespace std; char * base64Encode(const char *buffer, int length, bool newLine); char * base64Decode(char *input, int length, bool newLine); int main(int argc, char* argv[]) { bool newLine = false; string input = "Hello World!"; char * encode = base64Encode(input.c_str(), input.length(), newLine); char * decode = base64Decode(encode, strlen(encode), newLine); cout << "Base64 Encoded : " << encode << endl; cout << "Base64 Decoded : " << decode << endl; cin.get(); } // base64 编码 char * base64Encode(const char *buffer, int length, bool newLine) { BIO *bmem = NULL; BIO *b64 = NULL; BUF_MEM *bptr; b64 = BIO_new(BIO_f_base64()); if (!newLine) { BIO_set_flags(b64, BIO_FLAGS_BASE64_NO_NL); } bmem = BIO_new(BIO_s_mem()); b64 = BIO_push(b64, bmem); BIO_write(b64, buffer, length); BIO_flush(b64); BIO_get_mem_ptr(b64, &bptr); BIO_set_close(b64, BIO_NOCLOSE); char *buff = (char *)malloc(bptr->length + 1); memcpy(buff, bptr->data, bptr->length); buff[bptr->length] = 0; BIO_free_all(b64); return buff; } // base64 解码 char * base64Decode(char *input, int length, bool newLine) { BIO *b64 = NULL; BIO *bmem = NULL; char *buffer = (char *)malloc(length); memset(buffer, 0, length); b64 = BIO_new(BIO_f_base64()); if (!newLine) { BIO_set_flags(b64, BIO_FLAGS_BASE64_NO_NL); } bmem = BIO_new_mem_buf(input, length); bmem = BIO_push(b64, bmem); BIO_read(bmem, buffer, length); BIO_free_all(bmem); return buffer; }
输出如下所示:
Base64 Encoded : SGVsbG8gV29ybGQh
Base64 Decoded : Hello World!更多参考
-
Openssl使用讲解&&心脏滴血漏洞复现
2020-08-25 16:54:35Openssl使用讲解&&心脏滴血漏洞复现 文章目录Openssl使用讲解&&心脏滴血漏洞复现一、Openssl使用讲解二、心脏滴血漏洞复现三、我的公众号 一、Openssl使用讲解 openssl s_client -connect ... -
openssl 使用IMAP接收邮件
2014-08-22 14:44:47openssl 使用IMAP接收邮件 IMAP command openssl s_client -connect imap.gmail.com:993 -crlf A001 LOGIN name@mailserver.com your_password A002 LIST "" "*" A003 SELECT INBOX A004 FETCH 1 FULL A005 FETCH 1... -
OpenSSL 使用指南
2008-10-15 15:14:00OpenSSL 使用指南 http://www.fs2you.com/files/5b43b3b0-5e3d-11dd-9b38-0019d11a795f/ 目录 • 介绍 • 编译 • 运行 OpenSSL.exe • 算法编程 API 4.1 对称算法 4.1.1 DES 4.1.2 A ES 4.1.3 RC4 4.1.4 EVP_ -
openssl使用和问题、踏坑整理
2020-05-28 01:36:14openssl使用问题整理v1.1.1版本之后RSA结构的变化 v1.1.1版本之后RSA结构的变化 不能通过RSA *rsa; rsa->n去访问内部成员了。 在1.1.1之后,OpenSSL支持getter这样返回每个参数。 const BIGNUM *RSA_get0_n... -
openssl使用介绍
2018-04-18 12:37:20OpenSSL 是一个开源项目,其组成主要包括一下三个组件:openssl:多用途的命令行工具libcrypto:加密算法库libssl:加密模块应用库,实现了ssl及t... -
OpenSSL使用记录
2016-12-10 21:32:48OpenSSL 用于https通信时,在windows上编译的OpenSSL-1.1.1版本的库,以及使用demo,中间遇到一些问题,谨以此记录并与大家交流。 -
OpenSSL使用方法
2015-08-19 12:13:05网上看了好多,但是有问题没有说到 通过CMD进入到OpenSSL安装目录下(CMD打开时请选择以管理员...set OPENSSL_CONF=安装目录\bin\openssl.cfg step 3: 生成私钥 openssl genrsa -out rsa_private_key.pem 1024 生 -
openSSL使用手册
2015-02-06 14:07:34安装方式网上很多都是说的下载源码编译后再使用,其实下载编译过的二进制文件就可以了安装使用了(如果不关心源码的话),这样不用安装编译器之类的。 windows下可直接下载安装包进行安装即可,下载地址:... -
openssl使用手册
2013-02-26 16:41:48OpenSSL有两种运行模式:交互模式和批处理模式。 直接输入openssl回车进入交互模式,输入带命令选项的openssl...当前只有三个OpenSSL命令会使用这个配置文件:ca, req, x509。有望未来版本会有更多命令使用配置文件。 -
openssl使用实例
2016-11-12 22:32:201,消息摘要算法应用例子作用:校验文件的一致性UNIX下校验文件一致性的方法很多,比如sum、cksum、md5sum、sha1sum等。...考虑到跨平台性,建议用openssl # 用SHA1算法计算文件file.txt的哈西值,输出到s -
openssl使用教程(一)
2018-06-09 15:05:23openssl是一个强大的安全套接字密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及SSL协议,并提供丰富的应用程序供测试或其他目的使用。openssl整个软件可以分为三个主要的功能部分:密码算法库、SSL协议... -
OpenSSL 使用openssl工具搭建私有CA
2018-05-19 16:17:21openssl: 多用途的命令行工具,包openssl libcrypto: 加密算法库,包openssl-libs libssl:加密模块应用库,实现了ssl及tls,包nss openssl命令: 两种运行模式:交互模式和批处理模式 对称加密 :openssl ... -
OpenSSL使用指南之指南【转载内容】
2013-05-14 16:40:03OpenSSL使用指南 from:http://findingjob.blog.sohu.com/234214852.html。thx ~ “我的奋斗”! 1 介绍 OpenSSL是使用非常广泛的SSL的开源实现。由于其中实现了为SSL所用的各种加密算法,因此OpenSSL也是被广泛... -
openssl 使用证书
2013-02-28 20:19:28首先得安装OpenSSL软件包openssl,安装了这个软件包之后,我们可以做这些事情: o Creation of RSA, DH and DSA Key Parameters # 创建密钥 key o Creation of X.509 Certificates, CSRs and CRLs -
openssl使用手册
2009-08-04 10:28:35OpenSSL有两种运行模式:交互模式和批处理模式。 直接输入openssl回车进入交互模式,输入带命令选项的openssl...当前只有三个OpenSSL命令会使用这个配置文件:ca, req, x509。有望未来版本会有更多命令使用配置... -
OpenSSL使用指南之API【转载内容】
2013-05-14 16:44:31OpenSSL使用指南之API from:http://findingjob.blog.sohu.com/234655741.html。thx ~ “我的奋斗”! 4 算法编程API OpenSSL中支持众多的密码算法,并提供了很好的封装和接口。密码算法主要分为如下几...