c语言 socketsocket加密,用Openssl中的AES+RSA还是SSL

7395人阅读
&& 运行 OpenSSL.exe
&& 算法编程 API
OpenSSL 是使用非常广泛的 SSL 的开源实现。由于其中实现了为 SSL 所用的各种加密算法,因此 OpenSSL 也是被广泛使用的加密函数库。
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 相结合,是很多电子商务网站服务器的典型配置。
&& 编译和安装 OpenSSL
OpenSSL 开放源代码,这对学习、分析 SSL 和各种密码算法提供了机会,也便于在上面进一步开发。
2.1 获得 OpenSSL
到 OpenSSL 的网站 &即可下载当前版本的 OpenSSL 源代码压缩包。 当前版本 openssl-&1.0.0&beta3&。其中 crypto 子目录中是众多密码算法实现, ssl 子目录中是 SSL 协议的实现。
在 Linux 中解压缩:
$tar zxf openssl-1.0.0-beta3.tar.gz,&在 Windows 中可以使用 winzip 或 winrar 。
2.2 编译工具
编译 OpenSSL 需要 Perl 和 C 编译器。在 Windows 下如果要用加密算法的汇编代码实现,还需要 masm 或 nasm 汇编器。 ( 汇编代码可以比 C 代码显著提高密码运算速度 )
Perl 在 Windows 下推荐使用 Active Perl 。
C 编译器可以使用 gcc 。在 W indows 下可以使用 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 中的编译和安装步骤较简单 :
$make test
$make install
在 Linux 下,头文件、库文件、工具都已被安装放到了合适的位置。库文件是 .a 或 .so 格式。
&& 使用 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
&& 算法编程 API
OpenSSL 中支持众多的密码算法,并提供了很好的封装和接口。密码算法主要分为如下几类:对称算法、公钥算法、散列算法、随机数产生算法等。
OpenSSL 的目标是实现安全协议。其中相关协议和标准包括: SSL/TLS 、 PKCS#1 、 PCKS#10 、 X.509 、 PEM 、 OCSP 等。
4.1 对称算法接口
OpenSSL 中实现的对称算法太多,举三个例子: DES 、 AES 、 RC4 。
DES 加密算法是分组算法。 DES 的基本操作是把 64 比特明文在 56 比特密钥指引下加密成 64 比特密文。在实际使用中把密钥看作 64 比特可以更方便。
DES ( IN , KEY ) = OUT
(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);
(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);
(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) 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);
(5) DES 函数示例程序
见附件 A.1 。
4.1.2 A ES
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 示例程序见附件 A.2 。
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 示例程序见附件 A.3 。
例子 A.3.(1) 是利用 OpenSSL 动态库函数。例子 A.3.(2) 是把 RC4 的实现代码从 OpenSSL 中分离出来的。例子 A.3.(3) 是另一个演示实现。
4.2 公钥算法
OpenSSL 中实现了 RSA 、 DSA 、 ECDSA 等公钥算法。
RSA 是分组算法,典型的密钥模长度 1024 比特时,分组即是 1024 比特,即 128 字节。
(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);
(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);
(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) RSA 函数示例程序
RSA 示例程序见附件 A.4 。
例子 A.4.(1) 是加密解密例子。例子 A.4.(2) 是签名验证例子。
( TOBE )
4.2.2 ECDSA
( or NOT TOBE )
4.3 Hash 算法
Hash 算法举 MD5 和 SHA1 两个例子。 Hash 算法重复接收用户输入,直到最后一次结束时输出散列结果。
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 例子
MD5 示例程序见附件 A.5 。
md5sum 这是一个实用小工具,可以计算一个文件的 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);
&& 参考网址
SSL 3.0 Specification
Transp ort Layer Security (tls) Charter
OpenSSL: The Open Source toolkit for SSL/TLS
OpenSSL 中文论坛
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:250051次
积分:3102
积分:3102
排名:第4145名
原创:43篇
转载:138篇
评论:48条
(1)(1)(2)(1)(1)(1)(5)(2)(1)(1)(3)(2)(2)(1)(4)(5)(5)(2)(3)(3)(1)(8)(4)(3)(3)(3)(2)(3)(4)(3)(16)(9)(35)(36)(9)VC_ssl_socket 这个程序是根据OPENSSL实现了SSL的一个 的类了。 Multimedia Develop 多媒体编程 182万源代码下载-
&文件名称: VC_ssl_socket& & [
& & & & &&]
&&所属分类:
&&开发工具: Visual C++
&&文件大小: 85 KB
&&上传时间:
&&下载次数: 179
&&提 供 者:
&详细说明:这个程序是根据OPENSSL实现了SSL的一个SOCKET的类了。-the procedure is under OPENSSL SSL achieved a kind of a socket.
文件列表(点击判断是否您需要的文件,如果是垃圾请在下面评价投诉):
&&CSslSocket&&..........\chatsrvr&&..........\........\AutoBuildCount.h&&..........\........\&&..........\........\chatsrvr.dsp&&..........\........\chatsrvr.dsw&&..........\........\&&..........\........\&&..........\........\&&..........\........\&&..........\........\&&..........\........\&&..........\........\&&..........\........\&&..........\........\&&..........\........\&&..........\........\&&..........\........\&&..........\........\Release&&..........\........\.......\chatsrvr.exe&&..........\........\res&&&&..........\........\...\chatsrvr.rc2&&..........\........\...\toolbar.bmp&&..........\........\resource.h&&..........\........\&&..........\........\&&..........\........\&&..........\........\&&..........\........\stdafx.cpp&&..........\........\stdafx.h&&..........\chatter&&..........\.......\&&..........\.......\&&..........\.......\&&..........\.......\&&..........\.......\&&..........\.......\chatter.dsp&&..........\.......\chatter.dsw&&..........\.......\&&..........\.......\&&..........\.......\&&..........\.......\&&..........\.......\&&..........\.......\&&..........\.......\&&..........\.......\&&..........\.......\Release&&..........\.......\.......\chatter.exe&&..........\.......\res&&&&..........\.......\...\chatter.rc2&&..........\.......\...\toolbar.bmp&&..........\.......\resource.h&&..........\.......\&&..........\.......\&&..........\.......\&&..........\.......\&&..........\.......\stdafx.cpp&&..........\.......\stdafx.h&&..........\Shared&&..........\......\&&..........\......\&&..........\......\&&..........\......\&&..........\SSL.dsw
&[]:纯粹是垃圾&[]:纯粹是垃圾&[]:纯粹是垃圾
&近期下载过的用户:
&&&&&&&&&&&[]
&相关搜索:
&&&&&&&&&&
&输入关键字,在本站182万海量源码库中尽情搜索:
&[] - 这是一个封装了socket的CWSocket类,包括了服务端,客户端,超时控制等,方便使用。
&[] - 使用openssl的SSL下的SOCKET客户端
&[] - 用VC6编译openssl源码的工程文件,openssl源码好找,这个东东可不好找。
&[] - ssl协议的C语言实现
&[] - ssl加密通信的客户端和服务端程序,包括安全证书的认证(linux)
&[] - OPENssl安全连接原理介绍
&[] - Openssl-0.9.6h完整安装包,里面有很多密码算法的源代码,RSA,DSA,MD4,MD5,应有尽有
&[] - 用VC++6.0的Sockets API实现一个聊天室程序
&[] - 介绍ssl得基本结构,框架,实现的流程
&[] - openssl 0.9.8a 的VC6工程。调试SSL很方便
相关函数/类:
CWinApp CSingleDocTemplate CDialog CDataExchange CSocketFile CWnd CFrameWnd LoadBitmap CObject CDocument CString LoadString SetWindowText CEditView CFileException CCmdUI wsprintf CDC GetWindowTextLength CView CCreateContext CRect GetClientRect CSize GetWindowText DestroyWindow KillTimer SetTimer FormatMessage LocalFree MultiByteToWideChar SetLastError CSocket ZeroMemory FreeLibrary GetLastError LoadLibrary GetProcAddress WideCharToMultiBytePython传输数据使用SSL加密
Python传输数据使用SSL加密
先生成证书和私钥
[root@cc ssl]# openssl req -new -x509 -days 365 -nodes -out cc.pem -keyout cc.pem
Generating a 2048 bit RSA private key
............................................................................+++
writing new private key to 'cc.pem'
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:GuangDong
Locality Name (eg, city) [Default City]:GuangZhou
Organization Name (eg, company) [Default Company Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:phey.cc
Email Address []:
[root@cc ssl]# ▊
服务端代码
[root@cc ssl]# cat server.py
#!/usr/bin/python
import ssl
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind(('', 8888))
s.listen(5)
print 'Listen on port: 8888'
while True:
client, addr = s.accept()
print 'Connection from', addr
client_ssl = ssl.wrap_socket(client, server_side=True, certfile='cc.pem')
client_ssl.write(&Hello CC !&)
client_ssl.close()
client.close()
[root@cc ssl]# ▊
客户端代码,客户端这里我是选择了每次收取一个字节的方式,也可以不选择收取多少个字节,会默认收取1024个字节
[root@cc ssl]# cat client.py
#!/usr/bin/python
import ssl
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s = ssl.wrap_socket(s)
s.connect(('localhost', 8888))
print(s.cipher())
while True:
data = s.read(1)
if not data:
print &Receive data: &, data
[root@cc ssl]# ▊
运行服务端
[root@cc ssl]# ./server.py
Listen on port: 8888
再运行客户端
[root@cc ssl]# ./client.py
('AES256-SHA', 'TLSv1/SSLv3', 256)
Receive data:
Receive data:
Receive data:
Receive data:
Receive data:
Receive data:
Receive data:
Receive data:
Receive data:
Receive data:
[root@cc ssl]# ▊
服务端会有显示
[root@cc ssl]# ./server.py
Listen on port: 8888
Connection from ('127.0.0.1', 40257)
抓包也只能看到一些奇怪的东西了
本文链接: http://phey.cc/ssl_in_python.html首先,大家知道SSL这一目前“事实上的Internet加密标准”吧?一般的网站是没有用到SSL的,所以如果你用TCPDUMP就可以很容易地看到别人上网的帐号、密码之类的,当然,现在有些已经改用安全通讯方式进行验证了,比如google的邮件服务gmail,而象银行、证券等行业,从一开始就要求用加密通讯,你在哪个银行网站上输入帐号和密码后点击提交不是通过加密方式提交的呢?事实上,SSL也正是在银行这些行业的需求下才产生的。现在大家经常上网会上到一些https://开头的网站,那就是把SSL标准应用到HTTP上从而变成了HTTPS。另外大家可能都不用telnet这个明文传输工具来进行远程登录了,都改用ssh了,ssh正是SSL的一个实现,用来进行远程加密通讯的。其次,要在我们现有的TCP程序上加上SSL,你得安装开发包libssl-dev,这个包的描述是这样的:Package: libssl-devPriority: optionalSection: libdevelInstalled-Size: 5552Maintainer: Debian OpenSSL Team Architecture: i386Source: opensslVersion: 0.9.8a-7ubuntu0.3Depends: libssl0.9.8 (= 0.9.8a-7ubuntu0.3), zlib1g-devConflicts: ssleay (&& 0.9.2b), libssl08-dev, libssl09-dev, libssl095a-dev, libssl096-devFilename: pool/main/o/openssl/libssl-dev_0.9.8a-7ubuntu0.3_i386.debSize: 2023440MD5sum: 3c4052d07abe7d5ba4cfSHA1: 13e78c37d9ce0de6a7d1cfc7bac0SHA256: 9e86aaf61e5afcb56d485ea60f90e31b0ecaf2bf31f426f7eb8c6ebDescription: SSL development libraries, header files and documentation libssl and libcrypt development libraries, header files and manpages . It is part of the OpenSSL implementation of SSL.Bugs: mailto:ubuntu-users@Origin: UbuntuPackage: libssl-devPriority: optionalSection: libdevelInstalled-Size: 5548Maintainer: Debian OpenSSL Team Architecture: i386Source: opensslVersion: 0.9.8a-7build1Depends: libssl0.9.8 (= 0.9.8a-7build1), zlib1g-devConflicts: ssleay (&& 0.9.2b), libssl08-dev, libssl09-dev, libssl095a-dev, libssl096-devFilename: pool/main/o/openssl/libssl-dev_0.9.8a-7build1_i386.debSize: 2022142MD5sum: c9b989aebbae4f6f5dbdeDescription: SSL development libraries, header files and documentation libssl and libcrypt development libraries, header files and manpages . It is part of the OpenSSL implementation of SSL.Bugs: mailto:ubuntu-users@Origin: Ubuntu也就是说这个libssl-dev包是库函数、头文件以及相关编程说明文档的集合。安装完成之后在/usr/share/doc/libssl-dev/demos目录下有一些编程示例。你可以参照里面的文档自己来写加密通讯程序。/************关于本文档*********************************************filename: Linux网络编程一步一步学-利用OpenSSL提供的SSL操作函数进行加密通讯原始例子*purpose: 说明了如果在Linux下利用OpenSSL库函数进行SSL加密通讯程序开发*tidied by: zhoulifa() 周立发()Linux爱好者 Linux知识传播者 SOHO族 开发者 最擅长C语言*date time: 19:00*Note: 任何人可以任意复制代码并运用这些文档,当然包括你的商业用途* 但请遵循GPL*Thanks to: *Hope:希望越来越多的人贡献自己的力量,为科学技术发展出力* 科技站在巨人的肩膀上进步更快!感谢有开源前辈的贡献!*********************************************************************/比如/usr/share/doc/libssl-dev/demos/bio目录下提供的一个服务器端例子,代码如下:/* NOCW *//* demos/bio/saccept.c *//* A minimal program to server an SSL connection. * It uses blocking. * saccept host:port * host is the interface IP to use.  If any interface, use *:port * The default it *:4433 * * cc -I../../include saccept.c -L../.. -lssl -lcrypto */#include &stdio.h&#include &signal.h&#include &openssl/err.h&#include &openssl/ssl.h&#define CERT_FILE    &server.pem&BIO *in=NULL;void close_up()    {    if (in != NULL)        BIO_free(in);    }int main(argc,argv)char *argv[];    {    char *port=NULL;    BIO *ssl_bio,*    SSL_CTX *    SSL *    char buf[512];    int ret=1,i;        if (argc &= 1)        port=&*:4433&;    else        port=argv[1];    signal(SIGINT,close_up);    SSL_load_error_strings();#ifdef WATT32    dbug_init();    sock_init();#endif    /* Add ciphers and message digests */    OpenSSL_add_ssl_algorithms();    ctx=SSL_CTX_new(SSLv23_server_method());    if (!SSL_CTX_use_certificate_file(ctx,CERT_FILE,SSL_FILETYPE_PEM))           if (!SSL_CTX_use_PrivateKey_file(ctx,CERT_FILE,SSL_FILETYPE_PEM))           if (!SSL_CTX_check_private_key(ctx))           /* Setup server side SSL bio */    ssl=SSL_new(ctx);    ssl_bio=BIO_new_ssl(ctx,0);    if ((in=BIO_new_accept(port)) == NULL)    /* This means that when a new connection is acceptede on 'in',     * The ssl_bio will be 'dupilcated' and have the new socket     * BIO push into it.  Basically it means the SSL BIO will be     * automatically setup */    BIO_set_accept_bios(in,ssl_bio);again:    /* The first call will setup the accept socket, and the second     * will get a socket.  In this loop, the first actual accept     * will occur in the BIO_read() function. */    if (BIO_do_accept(in) &= 0)    for (;;)        {        i=BIO_read(in,buf,512);        if (i == 0)            {            /* If we have finished, remove the underlying             * BIO stack so the next time we call any function             * for this BIO, it will attempt to do an             * accept */            printf(&Done\n&);            tmp=BIO_pop(in);            BIO_free_all(tmp);                       }        if (i & 0)        fwrite(buf,1,i,stdout);        fflush(stdout);        }    ret=0;err:    if (ret)        {        ERR_print_errors_fp(stderr);        }    if (in != NULL) BIO_free(in);    exit(ret);    return(!ret);    }对应的一个客户端例子代码如下:/* NOCW *//* demos/bio/sconnect.c *//* A minimal program to do SSL to a passed host and port. * It is actually using non-blocking IO but in a very simple manner * sconnect host:port - it does a 'GET / HTTP/1.0' * * cc -I../../include sconnect.c -L../.. -lssl -lcrypto */#include &stdio.h&#include &stdlib.h&#include &unistd.h&#include &openssl/err.h&#include &openssl/ssl.h&int main(argc,argv)char *argv[];    {    char *    BIO *    char buf[1024*10],*p;    SSL_CTX *ssl_ctx=NULL;    SSL *    BIO *ssl_    int i,len,off,ret=1;    if (argc &= 1)        host=&localhost:4433&;    else        host=argv[1];#ifdef WATT32    dbug_init();    sock_init();#endif    /* Lets get nice error messages */    SSL_load_error_strings();    /* Setup all the global SSL stuff */    OpenSSL_add_ssl_algorithms();    ssl_ctx=SSL_CTX_new(SSLv23_client_method());    /* Lets make a SSL structure */    ssl=SSL_new(ssl_ctx);    SSL_set_connect_state(ssl);    /* Use it inside an SSL BIO */    ssl_bio=BIO_new(BIO_f_ssl());    BIO_set_ssl(ssl_bio,ssl,BIO_CLOSE);    /* Lets use a connect BIO under the SSL BIO */    out=BIO_new(BIO_s_connect());    BIO_set_conn_hostname(out,host);    BIO_set_nbio(out,1);    out=BIO_push(ssl_bio,out);    p=&GET / HTTP/1.0\r\n\r\n&;    len=strlen(p);    off=0;    for (;;)        {        i=BIO_write(out,&(p[off]),len);        if (i &= 0)            {            if (BIO_should_retry(out))                {                fprintf(stderr,&write DELAY\n&);                sleep(1);                                }            else                {                                }            }        off+=i;        len-=i;        if (len &= 0)        }    for (;;)        {        i=BIO_read(out,buf,sizeof(buf));        if (i == 0)        if (i & 0)            {            if (BIO_should_retry(out))                {                fprintf(stderr,&read DELAY\n&);                sleep(1);                                }                        }        fwrite(buf,1,i,stdout);        }    ret=1;    if (0)        {err:        if (ERR_peek_error() == 0) /* system call error */            {            fprintf(stderr,&errno=%d &,errno);            perror(&error&);            }        else            ERR_print_errors_fp(stderr);        }    BIO_free_all(out);    if (ssl_ctx != NULL) SSL_CTX_free(ssl_ctx);    exit(!ret);    return(ret);    }编译程序里象一般的gcc命令一样,但需要链接ssl库,比如gcc -Wall saccept.c -o sslserver -lsslgcc -Wall sconnect.c -o sslclient -l ssl
有美一人,清扬婉兮。邂逅相遇,适我愿兮。这是《诗经》里的吟唱邂逅爱情的感觉。千百年过去了,人们依然在等待这种邂逅
赵咏华的一首老歌《早餐》里唱到:“心情特别好的早上,提前半个小时起床,为心爱的人做顿早餐,要他把我的爱一口一口吃完。”—...
请注意使用文明用语
文章总数:0
画报总数:0
画报点击数:0
文章点击数:0}

我要回帖

更多关于 openssl rsa 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信