openssl实验总结

OPENSSL简介

OpenSSL项目是一个协作开发一个健壮的,商业级的,全功能的,并且开放源代码工具包,它实现了安全套接字层(SSL v2/v3)和传输层安全(TLS v1)协议以及全强大的通用加密库。

OPENSSL由3部分组成:

  1. The SSL library(SSL、TLS开发代码库)
  2. the Crypto library(密码学相关开发代码库)
  3. command line tool(命令行工具,提供CA、证书等功能)

关于安装

一般的linux会自带openssl,但是想要编程的话需要安装一个libssl-dev的软件包,原因是,虽然系统一般会自带openssl但是在bin文件夹下还有usr/include文件夹下一般都没有openssl的各种.h头文件,所以需要安装软件包来进行头文件的补全。

接下来会讲解命令行下的openssl的使用

1、消息摘要算法应用例子 (sha1 md5 base64等算法均可 在下方替换即可)

​ 用SHA1算法计算文件file.txt的哈西值,输出到stdout:

openssl dgst -sha1 file.txt

​ 用SHA1算法计算文件file.txt的哈西值,输出到文件digest.txt:

openssl sha1 -out digest.txt file.txt

​ 用DSS1(SHA1)算法为文件file.txt签名,输出到文件dsasign.bin。签名的private key必须为DSA算法产生的,保存在文件dsakey.pem中。

openssl dgst -dss1 -sign dsakey.pem -out dsasign.bin file.txt

​ 用dss1算法验证file.txt的数字签名dsasign.bin,验证的private key为DSA算法产生的文件dsakey.pem。

openssl dgst -dss1 -prverify dsakey.pem -signature dsasign.bin file.txt

​ 用sha1算法为文件file.txt签名,输出到文件rsasign.bin,签名的private key为RSA算法产生的文件rsaprivate.pem。

openssl sha1 -sign rsaprivate.pem -out rsasign.bin file.txt

​ # 用sha1算法验证file.txt的数字签名rsasign.bin,验证的public key为RSA算法生成的rsapublic.pem。

openssl sha1 -verify rsapublic.pem -signature rsasign.bin file.txt

2、对称加密应用例子

​ 对称加密应用例子,用DES3算法的CBC模式加密文件plaintext.doc,加密结果输出到文件ciphertext.bin。

openssl enc -des3 -salt -in plaintext.doc -out ciphertext.bin

​ 用DES3算法的OFB模式解密文件ciphertext.bin,提供的口令为trousers,输出到文件plaintext.doc。注意:因为模式不同,该命令不能对以上的文件进行解密。

openssl enc -des-ede3-ofb -d -in ciphertext.bin -out plaintext.doc -pass pass:trousers

​ 用Blowfish的CFB模式加密plaintext.doc,口令从环境变量PASSWORD中取,输出到文件ciphertext.bin。

openssl bf-cfb -salt -in plaintext.doc -out ciphertext.bin -pass env:PASSWORD

​ 给文件ciphertext.bin用base64编码,输出到文件base64.txt。

openssl base64 -in ciphertext.bin -out base64.txt

​ 用RC5算法的CBC模式加密文件plaintext.doc,输出到文件ciphertext.bin,salt、key和初始化向量(iv)在命令行指定。

openssl rc5 -in plaintext.doc -out ciphertext.bin -S C62CB1D49F158ADC -iv E9EDACA1BD7090C6 -K 89D4B1678D604FAA3DBFFD030A314B29

3、Diffie-Hellman应用例子

​ 使用生成因子2和随机的1024-bit的素数产生D0ffie-Hellman参数,输出保存到文件dhparam.pem

openssl dhparam -out dhparam.pem -2 1024

​ 从dhparam.pem中读取Diffie-Hell参数,以C代码的形式,输出到stdout。

openssl dhparam -in dhparam.pem -noout -C

4、DSA应用例子应用例子

​ 生成1024位DSA参数集,并输出到文件dsaparam.pem。

openssl dsaparam -out dsaparam.pem 1024

​ 使用参数文件dsaparam.pem生成DSA私钥匙,采用3DES加密后输出到文件dsaprivatekey.pem

openssl gendsa -out dsaprivatekey.pem -des3 dsaparam.pem

​ 使用私钥匙dsaprivatekey.pem生成公钥匙,输出到dsapublickey.pem

openssl dsa -in dsaprivatekey.pem -pubout -out dsapublickey.pem

​ 从dsaprivatekey.pem中读取私钥匙,解密并输入新口令进行加密,然后写回文件dsaprivatekey.pem

openssl dsa -in dsaprivatekey.pem -out dsaprivatekey.pem -des3 -passin

5、RSA应用例子

​ 产生1024位RSA私匙,用3DES加密它,口令为trousers,输出到文件rsaprivatekey.pem

openssl genrsa -out rsaprivatekey.pem -passout pass:trousers -des3 1024

​ 从文件rsaprivatekey.pem读取私匙,用口令trousers解密,生成的公钥匙输出到文件rsapublickey.pem

openssl rsa -in rsaprivatekey.pem -passin pass:trousers -pubout -out rsapubckey.pem

​ 用公钥匙rsapublickey.pem加密文件plain.txt,输出到文件cipher.txt

openssl rsautl -encrypt -pubin -inkey rsapublickey.pem -in plain.txt -out cipher.txt

​ 使用私钥匙rsaprivatekey.pem解密密文cipher.txt,输出到文件plain.txt

openssl rsautl -decrypt -inkey rsaprivatekey.pem -in cipher.txt -out plain.txt

​ 用私钥匙rsaprivatekey.pem给文件plain.txt签名,输出到文件signature.bin

openssl rsautl -sign -inkey rsaprivatekey.pem -in plain.txt -out signature.bin

​ 用公钥匙rsapublickey.pem验证签名signature.bin,输出到文件plain.txt

openssl rsautl -verify -pubin -inkey rsapublickey.pem -in signature.bin -out plain

​ 从X.509证书文件cert.pem中获取公钥匙,用3DES加密mail.txt,输出到文件mail.enc

openssl smime -encrypt -in mail.txt -des3 -out mail.enc cert.pem

​ 从X.509证书文件cert.pem中获取接收人的公钥匙,用私钥匙key.pem解密S/MIME消息mail.enc,结果输出到文件mail.txt

openssl smime -decrypt -in mail.enc -recip cert.pem -inkey key.pem -out mail.txt

​ cert.pem为X.509证书文件,用私匙key,pem为mail.txt签名,证书被包含在S/MIME消息中,输出到文件mail.sgn

openssl smime -sign -in mail.txt -signer cert.pem -inkey key.pem -out mail.sgn

​ 验证S/MIME消息mail.sgn,输出到文件mail.txt,签名者的证书应该作为S/MIME消息的一部分包含在mail.sgn中

openssl smime -verify -in mail.sgn -out mail.txt

接下来说明编程实例,这里举两个例子,分别是md5算法和rsa密码加密算法

md5:

引用库

​ openssl/md5.h

主要函数

​ int MD5Init(MD5CTX *c);

​ 初始化md5上下文结构

​ int MD5Update(MD5CTX c, const void data, size_t len);

​ 刷新MD5,将文件连续数据分片放入进行MD5刷新

​ int MD5Final(unsigned char md, MD5CTX c);int MD5Init(MD5CTX *c);

​ 产生最终的md5数据

​ unsigned char MD5(const unsigned char d, size_t n, unsigned char *md);

​ 直接产生字符串的MD5

实验代码:

include

include

include

include <openssl/md5.h>

int main(int argc, char** argv)

{

​ MD5_CTX hash_ctx;

​ char input_string[128];

​ unsigned char hash_ret[16];

​ int i;

​ if (argc != 2)

​ {

​ fprintf(stderr, "%s \n", argv[0]);

​ exit(-1);

​ }

​ snprintf(input_string, sizeof(input_string), "%s\n", argv[1]);

t

​ MD5_Init(&hash_ctx);

)

​ MD5_Update(&hash_ctx, input_string, strlen(input_string));

​ MD5_Final(hash_ret, &hash_ctx);

​ printf("Input string: %s", input_string);

​ printf("Output string: ");

​ for (i=0; i<32; ++i)

​ {

​ if (i % 2 == 0)

​ {

​ printf("%x", (hash_ret[i/2] >> 4) &0xf);

​ }

​ else

​ {

​ printf("%x", (hash_ret[i/2]) &0xf);

​ }

​ }

​ printf("\n");

​ return 0;

}

运行指令为

​ gcc -Wall md5.c -o md5 -lssl

结果测试

接下来说明rsa编程:

​ RSA是一个非对称加密算法。简单说来,非对称加密算法就是说加密解密一个文件需要有两个密钥,一个用来加密,为公钥,一个用来解密,为私钥。证书可以用来授权公钥的使用。

首先来说明一下命令行下的相关指令:

在openssl中密钥一般采用.pem格式

1.openssl genrsa -des3 -out prikey.pem 1024 #生成rsa密钥

Enter pass phrase for prikey.pem: xxx

Verifying - Enter pass phrase for prikey.pem: xxx

2.openssl rsa -in prikey.pem -out prikey.pem #去除掉密钥文件保护密码

输入提取密码(和刚才输入的一致):Enter pass phrase for prikey.pem: xxx

writing RSA key.

3.openssl rsa -in prikey.pem -pubout -out pubkey.pem #分离出公钥

writing RSA key.

4.openssl asn1parse -out temp.ans -i -inform PEM < prikey.pem #提取十六进制密钥

所需头文件:

include<openssl/rsa.h>

include<openssl/pem.h>

include<openssl/err.h>

编译所需指令:gcc -Wall -O2 -o rsa rsa.c -lcrypto -lssl

编程思想:

首先引用三个openssl中关于rsa以及.pem密钥的头文件,之后定义主函数,src字符串为hello openssl_rsa,加密解密的字符串暂时为空。之后引用两个函数my-encrypt与my_decrypt,之后进行输出,如果为空则释放字符串return 0即可。接下来将解两种之前定义过的方法,之前先用命令行创建公钥和私钥.pem文件,之后在开始对它们分别define为prikey和pubkey。之后在方法中引用原始字符串以及密钥(注意是长度为1024)。之后对其进行引用RSA_public_encrypt(rsa_len,(unsigned char )str,(unsigned char )en,rsa,RSA_NO_PADDING)函数为真即输出。

编程结果:

openssl实践总结的更多相关文章

  1. openssl_final学习总结

    openssl学习总结 openssl知识点总结 openssl实践总结 简介 openssl是一个功能丰富且自包含的开源安全工具箱.它提供的主要功能有: SSL协议实现(包括SSLv2.SSLv3和 ...

  2. OpenSSl 加密解密 示例(终于有编程实践了)

    OPenSSl的加密主要有三个重要的函数.看懂下面的代码就基本上知道该如何使用openssL来加密了. 不过注意,要先将libssl.so.1.0和libcrypto.so.1.0文件复制到执行的文件 ...

  3. 非对称加密openssl协议在php7实践

    据网上资料,RSA加密算法是一种非对称加密算法.在公开密钥加密和电子商务中RSA被广泛使用.RSA是1977年由罗纳德·李维斯特(RON RIVEST).阿迪·萨莫尔(ADI SHAMIR)和伦纳德· ...

  4. Linux服务器,PHP的10大安全配置实践

    PHP被广泛用于各种Web开发.而当服务器端脚本配置错误时会出现各种问题.现今,大部分Web服务器是基于Linux环境下运行(比如:Ubuntu,Debian等).本文例举了十大PHP最佳安全实践方式 ...

  5. 《开源安全运维平台OSSIM最佳实践》

    <开源安全运维平台OSSIM最佳实践> 经多年潜心研究开源技术,历时三年创作的<开源安全运维平台OSSIM最佳实践>一书即将出版.该书用80多万字记录了,作者10多年的IT行业 ...

  6. 关于openssl几个API的一点小收获

    今天心血来潮突然想搞搞openssl了,趁着端午小假,刚好有空可以鼓捣孤岛自己喜欢的东西,出去东奔西跑的实在太造孽了,还是宅起来给自己充充电吧.下载openssl最新代码1.0.1g,修复了" ...

  7. [原]在win上编译 subversion 源码实践Tonyfield的专栏

    (百度和网页的作者无关,不对其内容负责。百度快照谨为网络故障时之索引,不代表被搜索网站的即时页面。) [原]在win上编译 subversion 源码实践 2013-6-9阅读400 评论0 (参考 ...

  8. 《深入理解Nginx》阅读与实践(一):Nginx安装配置与HelloWorld

    最近在读陶辉的<深入理解Nginx:模块开发与架构解析>,一是想跟着大牛练练阅读和编写开源代码的能力,二是想学学Nginx优秀的架构设计,三是想找一个点深入下Linux下网络编程的细节.侯 ...

  9. apache服务器配置Net的实践

    前置: 在xp系统中,打补丁之类或啥子操作引起或多或少的问题,最终导致iis不能使用: 不想装系统...忍着... 最近突发事件导致,需要摸一下apache服务器处理,好吧,那就搜索下吧..... 目 ...

随机推荐

  1. linux下修改系统时间

    一.查看时间: [root@localhost ~]# date2016年 11月 19日 星期六 12:46:37 CST 二.修改时间,修改系统时间 [root@localhost ~]# dat ...

  2. [Eclipse配置] Eclipse代码中显示空白字符(空格,TAB和回车)的方法

    在代码页面点击右键进入 Preferences --> General --> Editors --> Text Editors. 在 Show whitespace charact ...

  3. Effective Java 40 Design method signatures carefully

    Principle Choose method names carefully. Don't go overboard in providing convenience methods. Avoid ...

  4. javascript简介和基本语法

    javascript简介 1.javascript是个脚本语言,需要有宿主文件,他的宿主文件是html文件. 用法:为了保险起见一般写在</html>之后<javascript   ...

  5. PS网页设计教程XXVI——如何在PS中创建一个专业的网页布局

    作为编码者,美工基础是偏弱的.我们可以参考一些成熟的网页PS教程,提高自身的设计能力.套用一句话,“熟读唐诗三百首,不会作诗也会吟”. 本系列的教程来源于网上的PS教程,都是国外的,全英文的.本人尝试 ...

  6. Redis系列(三)—— 订阅/发布

    Redis 订阅/发布 参考:http://www.cnblogs.com/mushroom/p/4470006.html,http://www.tuicool.com/articles/ABry2a ...

  7. history介绍及bash命令快速调用

    在日常工作中,能够快速并准确的使用命令是必不可少的,下面为大家介绍一下其中的小技巧. 一.查找命令历史——history 使用history能够快速的找到之前输入过的命令. # history 大家可 ...

  8. 手机号码js正则验证

    手机号码js正则验证 var myreg = /^(((13[0-9]{1})|(15[0-9]{1})|(18[0-9]{1}))+\d{8})$/; if (!myreg.test($(" ...

  9. 修改镜像文件EI.CFG

    一.EI.cfg说明 Windows 7 安装光盘中存在着 SOURCES\EI.CFG 这样一个配置文件.EI.cfg 是特定于 Windows 安装程序的配置文件,用于确定在安装过程中应该使用哪种 ...

  10. 边工作边刷题:70天一遍leetcode: day 71-2

    One Edit Distance 要点:有两种解法要考虑:已知长度和未知长度(比如只给个iterator) 已知长度:最好不要用if/else在最外面分情况,而是loop在外,用err记录misma ...