91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

OpenSSL編程環境搭建

發布時間:2020-10-15 10:02:17 來源:網絡 閱讀:1284 作者:zpjane21 欄目:編程語言

一、需要的軟件和環境

1)       OpenSSL(自行到官網下載最新版本openssl-1.0.2d.tar.gz!)

2)       PerlActivePerl-5.12.2

3)       Microsoft Visual Studio 2010(及以上版本)

二、安裝步驟

1、正確安裝和設置ActivePerl,Visual Studio 2010

常規方式安裝好ActivePerl-5.12.2Visual 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 2010VisualC++)設置臨時環境變量

 

在命令行切換到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下。

2、正式開始安裝OpenSSL

注意:因為為Visual Studio2010Visual 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.dlllibeay32.libssleay32.dllssleay32.libopenssl.exe

6)將編譯后的OpenSSL安裝到缺省目錄(如果上述的操作是在D:盤完成,則OpenSSL缺省按照到這個目錄:D:\usr\local\sslnmake -f ms\ntdll.mak install

    把安裝目錄下的bin子目錄和lib子目錄的目錄路徑(例如D:\usr\local\ssl\binD:\usr\local\ssl\lib)添加到PATH環境變量中。

三、代碼調試環境配置

VS-打開項目-項目-屬性-VC++目錄

OpenSSL編程環境搭建

更改包含目錄以及庫目錄路徑

OpenSSL編程環境搭建

注意包含目錄只需要到include文件夾下即可,因為代碼中openssl/evp.h已經包含了openssl文件夾。


OpenSSL編程環境搭建

然后在-連接器-輸入中,將

OpenSSL編程環境搭建

文件夾下的兩個庫文件添加到附加依賴項


OpenSSL編程環境搭建

調試成功:

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();
}








向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

浦东新区| 西峡县| 长兴县| 六枝特区| 秦安县| 玉门市| 拜城县| 天等县| 黎川县| 家居| 麻江县| 阿拉善左旗| 泗洪县| 旬阳县| 双城市| 榕江县| 密云县| 卢氏县| 凤翔县| 海晏县| 北宁市| 朝阳县| 榆社县| 长宁区| 进贤县| 南昌市| 永嘉县| 汤原县| 乌兰察布市| 宁武县| 马公市| 博客| 澄城县| 都匀市| 永德县| 剑河县| 贵南县| 石门县| 永泰县| 阜新市| 汝城县|