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 \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)函數為真即輸出。

編程結果:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM