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 配置
- 在
解決方案資源管理器
中右鍵點擊當前項目-屬性
-配置屬性
-C/C++
-附加包含目錄
,填上openssl的include目錄的路徑。 鏈接器
-常規
-附加庫目錄
值:openssl的lib目錄路徑鏈接器
-輸入
-附加依賴項
值: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);