網絡安全課程實驗一-openssl庫的使用


openssl windows 編譯安裝與使用

參考鏈接:https://github.com/openssl/openssl/blob/master/NOTES.WIN

1. 編譯安裝

我采用的是VC編譯安裝,其他方式請參考上面鏈接。

1.1 安裝編譯環境

下載並安裝 visual studio 2019 community
下載並安裝 Perl
安裝完好后命令行執行【perl -v】就可以查看版本信息
下載並安裝 nasm
下載 openssl源碼

1.2 編譯

這里需要根據自己的環境進行配置,64位操作系統,所以選擇 VC-WIN64A
從開始菜單打開 x64 Native Tools Command Prompt,並輸入一下命令。

$ perl Configure VC-WIN64A
$ nmake
$ nmake test

結果報錯提示說缺少Win32::Console模塊。
然后我就卸載了perl,然后在官網fork的項目中添加上這個包,重新安裝。

2. 使用

0. visual studio 配置

  1. 解決方案資源管理器中右鍵點擊當前項目-屬性-配置屬性-C/C++-附加包含目錄,填上openssl的include目錄的路徑。
  2. 鏈接器-常規-附加庫目錄 值:openssl的lib目錄路徑
  3. 鏈接器-輸入-附加依賴項 值:libeay32.lib
    編譯時提示找不到某個dll:
    方法1:將dll文件拷貝到生成的.exe所在的文件夾中
    方法2:配置屬性->調試->工作目錄:包含dll文件的文件夾路徑

1. 用MD5生成一個消息(字符串)的消息摘要

    EVP_MD_CTX* mdctx;
    const EVP_MD* md;
    char mess[] = "Test Message\n";
    unsigned char md_value[EVP_MAX_MD_SIZE];
    unsigned int md_len, i;


    md = EVP_get_digestbyname("md5");

    mdctx = EVP_MD_CTX_new();
    EVP_DigestInit_ex(mdctx, md, NULL);
    EVP_DigestUpdate(mdctx, mess, strlen(mess));
    EVP_DigestFinal_ex(mdctx, md_value, &md_len);
    EVP_MD_CTX_free(mdctx);

    printf("Digest is: ");
    for (i = 0; i < md_len; i++)
        printf("%02x", md_value[i]);
    printf("\n");

2. 生成RSA密鑰對,並用私鑰對消息摘要進行簽名

    /*Generate 2048 bit RSA key */
    EVP_PKEY_CTX* pctx;
    EVP_PKEY* pkey = NULL;
    ENGINE *e = ENGINE_by_id("ACME");
    pctx = EVP_PKEY_CTX_new_id(EVP_PKEY_RSA, e);
    if (!pctx)
        /* Error occurred */
        exit(-1);
    if (EVP_PKEY_keygen_init(pctx) <= 0)
        /* Error */
        exit(-1);
    if (EVP_PKEY_CTX_set_rsa_keygen_bits(pctx, 2048) <= 0)
        /* Error */
        exit(-1);
        /* Generate key */
    if (EVP_PKEY_keygen(pctx, &pkey) <= 0)
        /* Error */
        exit(-1);

    /* Sign */
    unsigned char sigret[SIG_ATOMIC_MAX];
    size_t sig_len;
    EVP_MD_CTX_set_pkey_ctx(mdctx, pctx);
    EVP_DigestSignInit(mdctx, &pctx, md, e, pkey);
    EVP_DigestSignUpdate(mdctx, md_value, md_len);
    EVP_DigestSignFinal(mdctx,sigret,&sig_len);

3. 把生成的簽名轉換成BASE64編碼

    /* BASE64 */
    BIO* bio, * b64;

    b64 = BIO_new(BIO_f_base64());
    bio = BIO_new_fp(stdout, BIO_NOCLOSE);
    BIO_push(b64, bio);
    BIO_write(b64, sigret, sig_len);
    BIO_flush(b64);

    BIO_free_all(b64);


免責聲明!

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



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