1. 程式人生 > 其它 >基於openeuler的openssl程式設計

基於openeuler的openssl程式設計

------------恢復內容開始------------

一、編譯環境

我下載好之後預設安裝了openssl,若未安裝的可輸入以下命令:

wget https://www.openssl.org/source/openssl-1.1.1a.tar.gz

tar xvf openssl-1.1.1a.tar.gz

cd openssl-1.1.1a

./config

make

echo ~

sudo make install

cd curl-7.71.1/

./configure --prefix=$PWD/_install --with-ssl

make

make install

二、OpenSSL命令的使用

使用openssl help檢視幫助文件

openssl dgst 常用選項(options)有:

[-md5|-md4|-md2|-sha1|-sha|-mdc2|-ripemd160|-dss1] :指定一種摘要演算法

-out filename:將摘要值儲存到指定檔案中

測試:

openssl程式設計

編寫一個測試程式碼:

出現報錯

分析錯誤資訊,下載openssl開發包

繼續進行編譯,執行可執行檔案:

成功執行!

BASE64演算法

OpenSS1在 Evp.h中提供了Base64 編碼和解碼的函式。Base64 編碼就是把二進位制資料轉換為可見的 ASCIⅡ字元。Base64 解碼是相反的過程。

寫一個BASE64的測試程式碼

#include <string.h>
#include <openssl/evp.h>
#include <openssl/x509.h>

//Base64編碼
void tEVP_Encode()
{
	EVP_ENCODE_CTX *ctx;
        ctx = EVP_ENCODE_CTX_new();	//EVP編碼結構體
	unsigned char in[1024];			//輸入資料緩衝區
	int inl;						//輸入資料長度
	char out[2048]={0};				//輸出資料緩衝區
	int outl;						//輸出資料長度
	FILE *infp;						//輸入檔案控制代碼
	FILE *outfp;					//輸出檔案控制代碼

	infp = fopen("test.dat","rb");//開啟待編碼的檔案
	if(infp == NULL)
	{
		printf("Open File \"Test.dat\"  for Read Err.\n");
		return;
	}
	
	outfp = fopen("test.txt","w");//開啟編碼後儲存的檔案
	if(outfp == NULL)
	{
		printf("Open File \"test.txt\" For Write Err.\n");
		return;
	}
	EVP_EncodeInit(ctx);//Base64編碼初始化
	printf("檔案\"Test.dat\" Base64編碼後為:\n");
	//迴圈讀取原文,並呼叫EVP_EncodeUpdate計算Base64編碼
	while(1)
	{
		inl = fread(in,1,1024,infp);
		if(inl <= 0)
			break;
		EVP_EncodeUpdate(ctx,out,&outl,in,inl);//編碼
		fwrite(out,1,outl,outfp);//輸出編碼結果到檔案
		printf("%s",out);
	} 
	EVP_EncodeFinal(ctx,out,&outl);//完成編碼,輸出最後的資料。
	fwrite(out,1,outl,outfp);
	printf("%s",out);
	fclose(infp);
	fclose(outfp);	
	printf("對檔案\"Test.dat\" Base64編碼完成,儲存到\"test.txt\"檔案.\n\n\n");
}

//Base64解碼
void tEVP_Decode()
{
	EVP_ENCODE_CTX *ctx;
        ctx = EVP_ENCODE_CTX_new();			//EVP編碼結構體
	char in[1024];					//輸入資料緩衝區
	int inl;						//輸入資料長度
	unsigned char out[1024];		//輸出資料緩衝區
	int outl;						//輸出資料長度
	FILE *infp;						//輸入檔案控制代碼
	FILE *outfp;					//輸出檔案控制代碼
	
	infp = fopen("test.txt","r");//開啟待解碼的檔案
	if(infp == NULL)
	{
		printf("Open File \"Test.txt\"  for Read Err.\n");
		return;
	}
	outfp = fopen("test-1.dat","wb");//開啟解碼後儲存的檔案
	if(outfp == NULL)
	{
		printf("Open File \"test-1.txt\" For Write Err.\n");
		return;
	}
	EVP_DecodeInit(ctx);//Base64解碼初始化
	printf("開始對檔案\"Test.txt\" Base64解碼...\n\n");
	//迴圈讀取原文,並呼叫EVP_DecodeUpdate進行Base64解碼
	while(1)
	{
		inl = fread(in,1,1024,infp);
		if(inl <= 0)
			break;
		EVP_DecodeUpdate(ctx,out,&outl,in,inl);//Base64解碼
		fwrite(out,1,outl,outfp);//輸出到檔案
	} 
	EVP_DecodeFinal(ctx,out,&outl);//完成解碼,輸出最後的資料。
	fwrite(out,1,outl,outfp);
	fclose(infp);
	fclose(outfp);	
	printf("對檔案\"Test.txt\" Base64解碼完成,儲存為\"test-1.dat\"\n\n\n");
	
}
 
int main()
{
 
	tEVP_Encode();
	tEVP_Decode();
	
	return 0;
}

使用命令gcc -o base64 base64.c -I /root/rocopenssl/include -L /root/rocopenssl/lib -lcrypto -lpthread對其進行編譯

此時,待編碼的檔案是test.dat,編碼後的檔案是test.txt,解碼後的檔名是test-1.dat。

我們檢視解碼後的結果檔案: