基於openeuler的openssl程式設計
阿新 • • 發佈:2021-10-29
------------恢復內容開始------------
一、編譯環境
我下載好之後預設安裝了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。
我們檢視解碼後的結果檔案: