您好,登錄后才能下訂單哦!
1) OpenSSL(自行到官網下載最新版本openssl-1.0.2d.tar.gz!)
2) Perl(ActivePerl-5.12.2)
3) Microsoft Visual Studio 2010(及以上版本)
常規方式安裝好ActivePerl-5.12.2和Visual Studio 2010。
檢驗Perl是否安裝成功的方法:
在windows命令行下運行如下命令:
1) cd C:\Perl\eg (假定Perl的安裝目錄是C:\Perl);
2) 在該目錄下執行:perl example.pl;
3) 若結果顯示“Hello from ActivePerl!”,則說明Perl安裝成功,可以開始使用Perl的相關命令來進行OpenSSL的安裝了。
為Visual Studio 2010(VisualC++)設置臨時環境變量
在命令行切換到VisualStudio 2010的安裝目錄下的VC子目錄
1) cd C:\Program Files\MicrosoftVisual Studio\VC (假定VisualStudio的安裝目錄為C:\ProgramFiles\Microsoft Visual Studio\);
2) 在命令行運行vcvarsall.BAT
注意:用這個命令來設置環境變量,其環境變量僅對當前的命令行窗口有效。
3)保留如圖1窗口,切記不要關閉。
4)下載nasm-2.11.08-win32,解包后將兩個可執行文件拷貝到VC的安裝目錄的子目錄bin下。
注意:因為為Visual Studio2010(Visual C++)設置的是臨時環境變量,所以以下步驟所要執行的命令行命令必須是在步驟1的如圖1的同一個命令行窗口下面執行。
(1)先將openssl軟件包解壓,并在命令行窗口中,切換到openssl解壓后所在的主目錄。
(2)執行Configure命令(該步驟的目的是配置編譯參數,對編譯環境進行基本的配置):
perl Configure VC-WIN32(注意該命令是大小寫敏感的)
(3)執行如下命令(ms目錄下的批處理命令do_ nasm生成makefile配置文件“ntdll.mak”):
ms\do_nasm
(4)執行如下命令(根據步驟(1)和(2)所生成的makefile文件“ntdll.mak”編譯所有源代碼):nmake -f ms\ntdll.mak
其中可能出現各種錯誤,可以在百度或者www.aol.com上輸入返回錯誤信息,以尋找到相應的處理措施。
(5) 對所有密碼算法、SSL協議和相關功能進行測試:
nmake -f ms\ntdll.mak test
如果出現以上提示("passedall tests")則說明成功。如果編譯成功,最后的輸出結果都在out32dll目錄下:包括可執行文件、兩個dll和兩個lib文件: libeay32.dll,libeay32.lib,ssleay32.dll,ssleay32.lib,openssl.exe;
(6)將編譯后的OpenSSL安裝到缺省目錄(如果上述的操作是在D:盤完成,則OpenSSL缺省按照到這個目錄:D:\usr\local\ssl)nmake -f ms\ntdll.mak install
把安裝目錄下的bin子目錄和lib子目錄的目錄路徑(例如D:\usr\local\ssl\bin和D:\usr\local\ssl\lib)添加到PATH環境變量中。
VS-打開項目-項目-屬性-VC++目錄
更改包含目錄以及庫目錄路徑
注意包含目錄只需要到include文件夾下即可,因為代碼中openssl/evp.h已經包含了openssl文件夾。
然后在-連接器-輸入中,將
文件夾下的兩個庫文件添加到附加依賴項
調試成功:
附調試代碼:
/* ------------------------------------------------------------------------- * Copyright (c) 2007 JianShen. * All rights reserved. * This source code and any compilation or derivative thereof is the * proprietary information of Author(s). and is confidential in nature. * * Under no circumstances is this software to be combined with any Open * Source Software in any way or placed under an Open Source License of * any type without the express written permission of Author(s). * ------------------------------------------------------------------------- */ /* ------------------------------------------------------------------------- * Description: * 一個測試例子用于對消息進使用指定的算法進行加解密以及BASE64編碼。 * Author: Jian Shen * Created:2007/05/19 * Change History: * ------------------------------------------------------------------------- */ #include <stdio.h> #include <string.h> #include <openssl/evp.h> //base64中每行的長度,最后一位是換行符號 #define CHARS_PER_LINE_BASE64 65 //64+1(\r) void print(const char *promptStr,unsigned char *data,int len) { int i; printf("======%s[長度=%d]======\n",promptStr,len); for(i = 0; i < len; i++) printf("%02x", data[i]); printf("\n===============\n"); } //base64編碼 void encode(unsigned char* outData, int * outlen, const unsigned char* data, int datalen) { int tmp=0; EVP_ENCODE_CTX base64; EVP_EncodeInit(&base64);//base64編碼初始化 //編碼數據,由于數據不多,所以沒有使用循環 EVP_EncodeUpdate(&base64,//base64編碼上下文對象 outData,//編碼后的數據 outlen, //編碼后的數據長度 data, //要編碼的數據 datalen //要編碼的數據長度 ); tmp=*outlen; //結束base64編碼,事實上此時數據已經編碼完全 EVP_EncodeFinal(&base64,outData+*outlen,outlen); *outlen+=tmp; outData[*outlen]=0; print("base64編碼后:",outData,*outlen); } //base64解碼 bool decode(unsigned char* outData, int * outlen, const unsigned char* data, int datalen) { int tmp=0,i=0,lines=0,currpos=0; EVP_ENCODE_CTX base64; EVP_DecodeInit(&base64);//base64解碼初始化 //假定outData緩沖區能夠容納所有的結果 for (;;) { currpos+=CHARS_PER_LINE_BASE64*lines++; //下面函數的返回值中:i=1 表示還有更多行需要解碼 //i=0 表示沒有進一步的數據需要解碼 i=EVP_DecodeUpdate(&base64,//base64解碼上下文對象 outData+tmp, //解碼后的數據 outlen, //解碼后的數據長度 data+currpos, //要解碼的數據 datalen-currpos);//要解碼的數據長度 if (i < 0) { printf("解碼錯誤!\n"); return false; } tmp+=*outlen; if (i == 0) break;//數據結束 } //結束base64解碼 EVP_DecodeFinal(&base64,outData+tmp,outlen); *outlen=tmp; outData[*outlen]=0; print("base64解碼后:",outData,*outlen); return true; } void main(int argc, char *argv[]) { const int ITERATIVE_ROUND_FOR_KEY=3; unsigned char key[EVP_MAX_KEY_LENGTH];//密鑰 unsigned char iv[EVP_MAX_IV_LENGTH];//初始向量 EVP_CIPHER_CTX ctx;//加密上下文對象 unsigned char out[512+8]; int outl; unsigned char txtAfterDecrypt[512]; int txtLenAfterDecrypt; char simpleText[]="Let's pray for peace of our lovely world"; unsigned char txtAfterBase64[sizeof(simpleText)*3]; //密碼 const char *passwd="a78b5C";//用于產生密鑰的口令字符串 const EVP_CIPHER *type;//加密類型對象 OpenSSL_add_all_ciphers();//加載加密算法 OpenSSL_add_all_digests();//加載摘要計算算法 printf("密碼是:%s\n",passwd); type=EVP_des_ede3_cbc(); printf("密鑰長度=%d,向量長度=%d\n",type->key_len,type->iv_len); //從文本密碼中產生 密鑰/向量 //這個例程使用MD5并且采用來自RSA的PCKS#5的標準 EVP_BytesToKey(type,//密鑰類型 EVP_md5(),//摘要計算類型 NULL, (const unsigned char *)passwd,//口令串 (int)strlen(passwd),//口令串長度 ITERATIVE_ROUND_FOR_KEY,//迭代輪數 key,//輸出的密鑰 iv //輸出的初始向量 ); //加密初始化,ctx是加密上下文對象 EVP_EncryptInit(&ctx,type,key,iv); int tmp=(int)strlen(simpleText); //由于數據量少,不用循環加入數據 EVP_EncryptUpdate(&ctx,//加密上下文對象 out,//加密后的內容 &outl, //加密后的內容長度 (const unsigned char*)simpleText, //要加密的內容 (int)strlen(simpleText) //要加密的內容長度 ); tmp=outl; //結束加密 EVP_EncryptFinal(&ctx,out+outl,&outl); outl+=tmp; //清除加密上下文,因為下文還要重用 EVP_CIPHER_CTX_cleanup(&ctx); print("加密之后的結果:",out,outl); //進行base64編碼 encode(txtAfterBase64,&tmp,out,outl); memset(out,0,sizeof(out)); //進行base64解碼 decode(out,&outl,txtAfterBase64,tmp); //解密初始化,解密類型,密鑰,初始向量必需和加密時相同,否則解密不能成功 EVP_DecryptInit(&ctx,type,key,iv); EVP_DecryptUpdate(&ctx,//解密上下文對象 txtAfterDecrypt, //解密后的內容 &txtLenAfterDecrypt,//解密后的內容長度 out, //要解密的內容 outl //要解密的內容長度 ); tmp=txtLenAfterDecrypt; //結束解密 EVP_DecryptFinal(&ctx,txtAfterDecrypt+txtLenAfterDecrypt,&txtLenAfterDecrypt); txtLenAfterDecrypt+=tmp; EVP_CIPHER_CTX_cleanup(&ctx); txtAfterDecrypt[txtLenAfterDecrypt]=0; printf("解密之后(長度=%d):\n[%s]\n\n",txtLenAfterDecrypt,txtAfterDecrypt); printf("click any key to continue."); //相當于暫停,觀察運行結果 getchar(); }
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。