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

    编程结果:

  • 相关阅读:
    Java for LeetCode 229 Majority Element II
    Java for LeetCode 228 Summary Ranges
    Java for LeetCode 227 Basic Calculator II
    Java for LintCode 颜色分类
    Java for LintCode 链表插入排序
    Java for LintCode 颠倒整数
    Java for LintCode 验证二叉查找树
    Java for LeetCode 226 Invert Binary Tree
    Java for LeetCode 225 Implement Stack using Queues
    Java for LeetCode 224 Basic Calculator
  • 原文地址:https://www.cnblogs.com/Jclemo/p/6091201.html
Copyright © 2011-2022 走看看