zoukankan      html  css  js  c++  java
  • openssl实践总结

    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 <stdio.h>

    include <string.h>

    include <stdlib.h>

    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 ", argv[0]);
    ​ exit(-1);
    ​ }

    ​ snprintf(input_string, sizeof(input_string), "%s ", 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(" ");

    ​ 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)函数为真即输出。

    编程结果:

  • 相关阅读:
    eclipse安装WTP部署WEB项目
    BZOJ3302: [Shoi2005]树的双中心
    BZOJ2059: [Usaco2010 Nov]Buying Feed 购买饲料
    BZOJ1986: [USACO2004 Dec] Dividing the Path 划区灌溉
    BZOJ3126: [Usaco2013 Open]Photo
    51nod1486 大大走格子
    BZOJ1698: [Usaco2007 Feb]Lilypad Pond 荷叶池塘
    BZOJ2590: [Usaco2012 Feb]Cow Coupons
    BZOJ1739: [Usaco2005 mar]Space Elevator 太空电梯
    BZOJ2501: [usaco2010 Oct]Soda Machine
  • 原文地址:https://www.cnblogs.com/Jclemo/p/6091201.html
Copyright © 2011-2022 走看看