openssl学习

OpenSSL是一个基于密码学的安全开发包,OpenSSL提供的功能相当强大和全面,囊括了主要的密码算法、常用的密钥和证书封装管理功能以及SSL协议,并提供了丰富的应用程序供测试或其它目的使用。 
  1.对称加密算法 
  OpenSSL一共提供了8种对称加密算法,其中7种是分组加密算法,仅有的一种流加密算法是RC4。这7种分组加密算法分别是AES、DES、Blowfish、CAST、IDEA、RC2、RC5,都支持电子密码本模式(ECB)、加密分组链接模式(CBC)、加密反馈模式(CFB)和输出反馈模式(OFB)四种常用的分组密码加密模式。其中,AES使用的加密反馈模式(CFB)和输出反馈模式(OFB)分组长度是128位,其它算法使用的则是64位。事实上,DES算法里面不仅仅是常用的DES算法,还支持三个密钥和两个密钥3DES算法。 
  2.非对称加密算法 
  OpenSSL一共实现了4种非对称加密算法,包括DH算法、RSA算法、DSA算法和椭圆曲线算法(EC)。DH算法一般用户密钥交换。RSA算法既可以用于密钥交换,也可以用于数字签名,当然,如果你能够忍受其缓慢的速度,那么也可以用于数据加密。DSA算法则一般只用于数字签名。 
  3.信息摘要算法 
  OpenSSL实现了5种信息摘要算法,分别是MD2、MD5、MDC2、SHA(SHA1)和RIPEMD。SHA算法事实上包括了SHA和SHA1两种信息摘要算法,此外,OpenSSL还实现了DSS标准中规定的两种信息摘要算法DSS和DSS1。 
  4.密钥和证书管理 
  密钥和证书管理是PKI的一个重要组成部分,OpenSSL为之提供了丰富的功能,支持多种标准。 
  首先,OpenSSL实现了ASN.1的证书和密钥相关标准,提供了对证书、公钥、私钥、证书请求以及CRL等数据对象的DER、PEM和BASE64的编解码功能。OpenSSL提供了产生各种公开密钥对和对称密钥的方法、函数和应用程序,同时提供了对公钥和私钥的DER编解码功能。并实现了私钥的PKCS#12和PKCS#8的编解码功能。OpenSSL在标准中提供了对私钥的加密保护功能,使得密钥可以安全地进行存储和分发。 
  在此基础上,OpenSSL实现了对证书的X.509标准编解码、PKCS#12格式的编解码以及PKCS#7的编解码功能。并提供了一种文本数据库,支持证书的管理功能,包括证书密钥产生、请求产生、证书签发、吊销和验证等功能。 
  事实上,OpenSSL提供的CA应用程序就是一个小型的证书管理中心(CA),实现了证书签发的整个流程和证书管理的大部分机制。 
  5.SSL和TLS协议 
  OpenSSL实现了SSL协议的SSLv2和SSLv3,支持了其中绝大部分算法协议。OpenSSL也实现了TLSv1.0,TLS是SSLv3的标准化版,虽然区别不大,但毕竟有很多细节不尽相同。 
  虽然已经有众多的软件实现了OpenSSL的功能,但是OpenSSL里面实现的SSL协议能够让我们对SSL协议有一个更加清楚的认识,因为至少存在两点:一是OpenSSL实现的SSL协议是开放源代码的,我们可以追究SSL协议实现的每一个细节;二是OpenSSL实现的SSL协议是纯粹的SSL协议,没有跟其它协议(如HTTP)协议结合在一起,澄清了SSL协议的本来面目。 
  6.应用程序 
  OpenSSL的应用程序已经成为了OpenSSL重要的一个组成部分,其重要性恐怕是OpenSSL的开发者开始没有想到的。现在OpenSSL的应用中,很多都是基于OpenSSL的应用程序而不是其API的,如OpenCA,就是完全使用OpenSSL的应用程序实现的。OpenSSL的应用程序是基于OpenSSL的密码算法库和SSL协议库写成的,所以也是一些非常好的OpenSSL的API使用范例,读懂所有这些范例,你对OpenSSL的API使用了解就比较全面了,当然,这也是一项锻炼你的意志力的工作。 
  OpenSSL的应用程序提供了相对全面的功能,在相当多的人看来,OpenSSL已经为自己做好了一切,不需要再做更多的开发工作了,所以,他们也把这些应用程序成为OpenSSL的指令。OpenSSL的应用程序主要包括密钥生成、证书管理、格式转换、数据加密和签名、SSL测试以及其它辅助配置功能。 
  7.Engine机制 Engine机制的出现是在OpenSSL的0.9.6版的事情,开始的时候是将普通版本跟支持Engine的版本分开的,到了OpenSSL的0.9.7版,Engine机制集成到了OpenSSL的内核中,成为了OpenSSL不可缺少的一部分。 Engine机制目的是为了使OpenSSL能够透明地使用第三方提供的软件加密库或者硬件加密设备进行加密。OpenSSL的Engine机制成功地达到了这个目的,这使得OpenSSL已经不仅仅使一个加密库,而是提供了一个通用地加密接口,能够与绝大部分加密库或者加密设备协调工作。当然,要使特定加密库或加密设备更OpenSSL协调工作,需要写少量的接口代码,但是这样的工作量并不大,虽然还是需要一点密码学的知识。Engine机制的功能跟Windows提供的CSP功能目标是基本相同的。目前,OpenSSL的0.9.7版本支持的内嵌第三方加密设备有8种,包括:CryptoSwift、nCipher、Atalla、Nuron、UBSEC、Aep、SureWare以及IBM 4758 CCA的硬件加密设备。现在还出现了支持PKCS#11接口的Engine接口,支持微软CryptoAPI的接口也有人进行开发。当然,所有上述Engine接口支持不一定很全面,比如,可能支持其中一两种公开密钥算法。 
  8.辅助功能 
  BIO机制是OpenSSL提供的一种高层IO接口,该接口封装了几乎所有类型的IO接口,如内存访问、文件访问以及Socket等。这使得代码的重用性大幅度提高,OpenSSL提供API的复杂性也降低了很多。 
  OpenSSL对于随机数的生成和管理也提供了一整套的解决方法和支持API函数。随机数的好坏是决定一个密钥是否安全的重要前提。 
  OpenSSL还提供了其它的一些辅助功能,如从口令生成密钥的API,证书签发和管理中的配置文件机制等等。如果你有足够的耐心,将会在深入使用OpenSSL的过程慢慢发现很多这样的小功能,让你不断有新的惊喜。
openssl学习方法 
通过学习 openssl,用户能够学到 PKI 方面的各种知识,其重要性不言而喻。以下为学习 openssl 的方法,供参考。 
1) 建立学习环境 
建立一个供调试的 openssl 环境,可以是 windows平台,也可以是 linux 或者其他平台。用户需有在这些平台下调试源代码的能力。 
2)学习 openssl 的命令 
通过 openssl命令的学习,对 openssl有基本的了解。 
3) 学习 openssl源代码并调试主要的源代码有: 
apps 目录下的各个程序,对应于 openssl 的各项命令; 
demos 下的各种源代码; 
engines 下的各种 engine实现; 
test 目录下的各种源代码。 
对于 openssl函数的学习,主要查看 openssl 自身是如何调用的,或者查看函数的实现。对于 openssl 中只有实现而没有调用的函数,读者需要自己写源码或研究源代码去学习。 
4) 学会使用 openssl 的asn.1编解码 
openssl 中很多函数和源码都涉及到 asn1 编解码,比如数字证书申请、数字证书、crl、ocsp、pkcs7、pkcs8、pkcs12 等。 
5) 查找资料 
Linux 下主要用 man 就能查看 openssl 命令和函数的帮助。Windows 用户可用到 www.openss.org 去查看在线帮助文档, 或者用 linux 下的命令 man2html 将帮助文档装换为 html 格式。用户也可以访问 openssl.cn 论坛来学习 openssl。 
6) 学习 openssl相关书籍 
读者可以参考《OpenSSL与网络信息安全--基础、结构和指令》 、 《NetworkSecurity with OpenSSL》(OReilly出版)和《OpenSSL for windows Developer’s Guide》
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
OpenSSL中的EVP(Enveloped Data Processing)是一个高级API,提供了一种简单易用的方式来实现各种密码学算法。EVP API支持对称加密、非对称加密、哈希、消息认证码(MAC)和数字签名等功能。 以下是一些使用EVP API的示例: 1. 对称加密 对称加密使用相同的密钥对数据进行加密和解密。以下代码展示了如何使用EVP API进行对称加密: ```c EVP_CIPHER_CTX *ctx; ctx = EVP_CIPHER_CTX_new(); EVP_EncryptInit_ex(ctx, EVP_aes_256_cbc(), NULL, key, iv); EVP_EncryptUpdate(ctx, out, &outl, in, inl); EVP_EncryptFinal_ex(ctx, out + outl, &tmpl); EVP_CIPHER_CTX_free(ctx); ``` 其中,key是加密密钥,iv是初始化向量,in是输入数据,inl是输入数据长度,out是输出数据,outl是输出数据长度,tmpl是临时变量。 2. 非对称加密 非对称加密使用公钥加密数据,私钥解密数据。以下代码展示了如何使用EVP API进行非对称加密: ```c EVP_PKEY *pkey; pkey = EVP_PKEY_new(); EVP_PKEY_set1_RSA(pkey, rsa); EVP_PKEY_CTX *ctx; ctx = EVP_PKEY_CTX_new(pkey, NULL); EVP_PKEY_encrypt_init(ctx); EVP_PKEY_CTX_set_rsa_padding(ctx, RSA_PKCS1_OAEP_PADDING); EVP_PKEY_encrypt(ctx, out, &outl, in, inl); EVP_PKEY_CTX_free(ctx); EVP_PKEY_free(pkey); ``` 其中,rsa是RSA密钥对,in是输入数据,inl是输入数据长度,out是输出数据,outl是输出数据长度。 3. 哈希 哈希函数将任意长度的数据映射为固定长度的摘要值。以下代码展示了如何使用EVP API进行哈希: ```c EVP_MD_CTX *ctx; ctx = EVP_MD_CTX_new(); EVP_DigestInit_ex(ctx, EVP_sha256(), NULL); EVP_DigestUpdate(ctx, in, inl); EVP_DigestFinal_ex(ctx, out, &outl); EVP_MD_CTX_free(ctx); ``` 其中,in是输入数据,inl是输入数据长度,out是输出数据,outl是输出数据长度。 4. MAC MAC是一种用于验证消息完整性和真实性的技术。以下代码展示了如何使用EVP API进行MAC: ```c EVP_MD_CTX *ctx; ctx = EVP_MD_CTX_new(); EVP_DigestSignInit(ctx, NULL, EVP_sha256(), NULL, pkey); EVP_DigestSignUpdate(ctx, in, inl); EVP_DigestSignFinal(ctx, out, &outl); EVP_MD_CTX_free(ctx); ``` 其中,pkey是私钥,in是输入数据,inl是输入数据长度,out是输出数据,outl是输出数据长度。 5. 数字签名 数字签名是一种用于验证消息来源和完整性的技术。以下代码展示了如何使用EVP API进行数字签名: ```c EVP_MD_CTX *ctx; ctx = EVP_MD_CTX_new(); EVP_DigestSignInit(ctx, NULL, EVP_sha256(), NULL, pkey); EVP_DigestSignUpdate(ctx, in, inl); EVP_DigestSignFinal(ctx, NULL, &slen); EVP_SignFinal(ctx, out, &outl, pkey); EVP_MD_CTX_free(ctx); ``` 其中,pkey是私钥,in是输入数据,inl是输入数据长度,out是输出数据,outl是输出数据长度,slen是临时变量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值