當前位置:首頁 » 編程軟體 » openssl編程

openssl編程

發布時間: 2022-12-30 11:49:47

㈠ windows怎麼安裝openssl

Perl和OpenSSL的安裝:
安裝Perl
(我的安裝目錄為C:\perl\eg)

運行「CMD」命令,使用cd命令指向perl安裝目錄的eg文件,執行「perl example.pl」若顯示「Hello from ActivePerl!」,則說明Perl安裝成功,可以開始使用Perl的相關命令來進行OpenSSL的安裝了,如下圖:

Note:如果你想看看原始的INSTALL文件,那麼請打開OpenSSL的解壓縮目錄,下面有兩個文件INSTALL.W32和INSTALL.W64,用記事本方式打開,你可以看到詳細的關於安裝的解釋~~~~

開始安裝OpenSSL
初始化VC++ 6.0 環境變數(找到vc++ 6.0的安裝目錄下的\VC98\Bin\執行如下的命令):

執行Configure命令(配置編譯參數):

運行ms\do_ms命令(在使用Configure腳本配置好參數):
另外兩種方式 如果使用也必須保證本機安裝有相應的編譯器才能使用。
:ms\do_masm (默認vc自帶的;也可以自己下載masm並安裝)
:ms\do_nasm (需要下載nasm)

運行「nmake -f ms\ntdll.mak」命令進行代碼編譯(需將目錄跳到OpenSSL目錄下)
如果編譯成功,最後的輸出都在out32dll目錄下:包括可執行文件、兩個dll和兩個lib文件: libeay32.dll, libeay32.lib, ssleay32.dll, ssleay32.lib ;把他們放到PATH環境變數對應的一個目錄里就可以了。

測試使用命令「nmake -f ms\ntdll.mak test」
若安裝成功的話,顯示的最後幾行如下圖:

配置VC++6.0下的相關參數
在VC++ 6.0的工具—》選項—》目錄下的Include files下添加OpenSSL安裝目錄下的include目錄;在Library files下添加out32dll目錄,現在你就可以使用OpenSSL編程

㈡ 在unbuntu下使用openssl 寫一個加密的C程序,編譯提示找不到頭文件openssl/*.h

哥門 <openssl/aes.h> 里 的openssl只是文件夾名字而已,
linux下面 /usr/local/include/ /usr/include/ 這兩個路徑是默認引用的。
所以你沒加 -I 也是可以編譯的 。
當交叉編譯時,那就完全不一樣了,必須配置好所有路徑。

㈢ 如何在ubuntu下進行OpenSSL的API編程

那麼,是什麼使得 OpenSSL 比 GNU TLS、Mozilla NSS 或其他所有的庫都優越呢?許可是一方面因素 (請參閱 參考資料)。此外,GNS TLS(迄今為止)只支持 TLS v1.0 和 SSL v3.0 協議,僅此而已。
Mozilla NSS 的發行既遵循 Mozilla Public License 又遵循 GNU GPL,它允許開發人員進行選擇。 不過,Mozilla NSS 比 OpenSSL 大,並且需要其他外部庫來對庫進行編譯,而 OpenSSL 是完全 自包含的。與 OpenSSL 相同,大部分 NSS API 也沒有文檔資料。Mozilla NSS 獲得了 PKCS #11 支持,該支持可以用於諸如智能卡這樣的加密標志。OpenSSL 就不具備這一支持。
先決條件
要充分理解並利用本文,您應該:
精通 C 編程。
熟悉 Internet 通信和支持 Internet 的應用程序的編寫。
並不絕對要求您熟悉 SSL ,因為稍後將給出對 SLL 的簡短說明;不過,如果您希望得到詳細論述 SSL 的文章的鏈接,請參閱 參考資料部分。擁有密碼學方面的知識固然好,但這 並不是必需的。

c語言socket加密,用Openssl中的AES+RSA還是SSL

1. 利用RSA安全傳輸aes生成密鑰所需的Seed(32位元組)
2. 利用aes_encrypt/aes_decrypt對Socket上面的業務數據進行aes加密/解密 理論上只需要aes就能保證全部流程,但由於aes加密所需要的aes-KEY是一個結構。
這個一個結構,如果通過網路進行傳輸,就需要對它進行網路編碼,openssl裡面沒有現成的API 所以就引入RSA來完成首次安全的傳輸,保證Seed不會被竊聽。

㈤ ubuntu 自帶了openssl怎麼配置zimg

虛擬機上的Ubuntu已經安裝過openssl但是仍然不能進行openssl編程
上網查找資料得到是由於未安裝openssl-devel包,執行以下兩條命令更新後就可以了
sudo apt-get install openssl
sudo apt-get install libssl-dev

㈥ openssl 多線程問題

openssl的文檔上也明文規定不能將一個SSL指針用於多個線程,所有調用CreateThread函數創建線程,參數設置為SSL指針必然在線程中是互斥的,考慮運用windows開源庫pthread改造多線程

㈦ OpenSSL 入門:密碼學基礎知識


本文是使用 OpenSSL 的密碼學基礎知識的兩篇文章中的第一篇,OpenSSL 是在 Linux 和其他系統上流行的生產級庫和工具包。(要安裝 OpenSSL 的最新版本,請參閱 這里 。)OpenSSL 實用程序可在命令行使用,程序也可以調用 OpenSSL 庫中的函數。本文的示常式序使用的是 C 語言,即 OpenSSL 庫的源語言。

本系列的兩篇文章涵蓋了加密哈希、數字簽名、加密和解密以及數字證書。你可以從 我的網站 的 ZIP 文件中找到這些代碼和命令行示例。

讓我們首先回顧一下 OpenSSL 名稱中的 SSL。

安全套接字層 (Secure Socket Layer)(SSL)是 Netscape 在 1995 年發布的一種加密協議。該協議層可以位於 HTTP 之上,從而為 HTTPS 提供了 S: 安全(secure)。SSL 協議提供了各種安全服務,其中包括兩項在 HTTPS 中至關重要的服務:

SSL 有多個版本(例如 SSLv2 和 SSLv3),並且在 1999 年出現了一個基於 SSLv3 的類似協議 傳輸層安全性(Transport Layer Security)(TLS)。TLSv1 和 SSLv3 相似,但不足以相互配合工作。不過,通常將 SSL/TLS 稱為同一協議。例如,即使正在使用的是 TLS(而非 SSL),OpenSSL 函數也經常在名稱中包含 SSL。此外,調用 OpenSSL 命令行實用程序以 openssl 開始。

除了 man 頁面之外,OpenSSL 的文檔是零零散散的,鑒於 OpenSSL 工具包很大,這些頁面很難以查找使用。命令行和代碼示例可以將主要主題集中起來。讓我們從一個熟悉的示例開始(使用 HTTPS 訪問網站),然後使用該示例來選出我們感興趣的加密部分進行講述。

此處顯示的 client 程序通過 HTTPS 連接到 Google:

可以從命令行編譯和執行該程序(請注意 -lssl 和 -lcrypto 中的小寫字母 L):

該程序嘗試打開與網站 www.google.com 的安全連接。在與 Google Web 伺服器的 TLS 握手過程中,client 程序會收到一個或多個數字證書,該程序會嘗試對其進行驗證(但在我的系統上失敗了)。盡管如此,client 程序仍繼續通過安全通道獲取 Google 主頁。該程序取決於前面提到的安全工件,盡管在上述代碼中只著重突出了數字證書。但其它工件仍在幕後發揮作用,稍後將對它們進行詳細說明。

通常,打開 HTTP(非安全)通道的 C 或 C++ 的客戶端程序將使用諸如文件描述符或網路套接字之類的結構,它們是兩個進程(例如,這個 client 程序和 Google Web 伺服器)之間連接的端點。另一方面,文件描述符是一個非負整數值,用於在程序中標識該程序打開的任何文件類的結構。這樣的程序還將使用一種結構來指定有關 Web 伺服器地址的詳細信息。

這些相對較低級別的結構不會出現在客戶端程序中,因為 OpenSSL 庫會將套接字基礎設施和地址規范等封裝在更高層面的安全結構中。其結果是一個簡單的 API。下面首先看一下 client 程序示例中的安全性詳細信息。

在與 Web 伺服器握手期間,client 程序會接收一個或多個數字證書,以認證伺服器的身份。但是,client 程序不會發送自己的證書,這意味著這個身份驗證是單向的。(Web 伺服器通常配置為 需要客戶端證書)盡管對 Web 伺服器證書的驗證失敗,但 client 程序仍通過了連接到 Web 伺服器的安全通道繼續獲取 Google 主頁。

為什麼驗證 Google 證書的嘗試會失敗?典型的 OpenSSL 安裝目錄為 /etc/ssl/certs,其中包含 ca-certificates.crt 文件。該目錄和文件包含著 OpenSSL 自帶的數字證書,以此構成 信任庫(truststore)。可以根據需要更新信任庫,尤其是可以包括新信任的證書,並刪除不再受信任的證書。

client 程序從 Google Web 伺服器收到了三個證書,但是我的計算機上的 OpenSSL 信任庫並不包含完全匹配的證書。如目前所寫,client 程序不會通過例如驗證 Google 證書上的數字簽名(一個用來證明該證書的簽名)來解決此問題。如果該簽名是受信任的,則包含該簽名的證書也應受信任。盡管如此,client 程序仍繼續獲取頁面,然後列印出 Google 的主頁。下一節將更詳細地介紹這些。

讓我們從客戶端示例中可見的安全工件(數字證書)開始,然後考慮其他安全工件如何與之相關。數字證書的主要格式標準是 X509,生產級的證書由諸如 Verisign 的 證書頒發機構(Certificate Authority)(CA)頒發。

數字證書中包含各種信息(例如,激活日期和失效日期以及所有者的域名),也包括發行者的身份和數字簽名(這是加密過的加密哈希值)。證書還具有未加密的哈希值,用作其標識指紋。

哈希值來自將任意數量的二進制位映射到固定長度的摘要。這些位代表什麼(會計報告、小說或數字電影)無關緊要。例如, 消息摘要版本 5(Message Digest version 5)(MD5)哈希演算法將任意長度的輸入位映射到 128 位哈希值,而 SHA1( 安全哈希演算法版本 1(Secure Hash Algorithm version 1))演算法將輸入位映射到 160 位哈希值。不同的輸入位會導致不同的(實際上在統計學上是唯一的)哈希值。下一篇文章將會進行更詳細的介紹,並著重介紹什麼使哈希函數具有加密功能。

數字證書的類型有所不同(例如根證書、中間證書和最終實體證書),並形成了反映這些證書類型的層次結構。顧名思義,根證書位於層次結構的頂部,其下的證書繼承了根證書所具有的信任。OpenSSL 庫和大多數現代編程語言都具有 X509 數據類型以及處理此類證書的函數。來自 Google 的證書具有 X509 格式,client 程序會檢查該證書是否為 X509_V_OK。

X509 證書基於 公共密鑰基礎結構(public-key infrastructure)(PKI),其中包括的演算法(RSA 是佔主導地位的演算法)用於生成密鑰對:公共密鑰及其配對的私有密鑰。公鑰是一種身份: Amazon 的公鑰對其進行標識,而我的公鑰對我進行標識。私鑰應由其所有者負責保密。

成對出現的密鑰具有標准用途。可以使用公鑰對消息進行加密,然後可以使用同一個密鑰對中的私鑰對消息進行解密。私鑰也可以用於對文檔或其他電子工件(例如程序或電子郵件)進行簽名,然後可以使用該對密鑰中的公鑰來驗證簽名。以下兩個示例補充了一些細節。

在第一個示例中,Alice 將她的公鑰分發給全世界,包括 Bob。然後,Bob 用 Alice 的公鑰加密郵件,然後將加密的郵件發送給 Alice。用 Alice 的公鑰加密的郵件將可以用她的私鑰解密(假設是她自己的私鑰),如下所示:

理論上可以在沒有 Alice 的私鑰的情況下解密消息,但在實際情況中,如果使用像 RSA 這樣的加密密鑰對系統,則在計算上做不到。

現在,第二個示例,請對文檔簽名以證明其真實性。簽名演算法使用密鑰對中的私鑰來處理要簽名的文檔的加密哈希:

假設 Alice 以數字方式簽署了發送給 Bob 的合同。然後,Bob 可以使用 Alice 密鑰對中的公鑰來驗證簽名:

假若沒有 Alice 的私鑰,就無法輕松偽造 Alice 的簽名:因此,Alice 有必要保密她的私鑰。

在 client 程序中,除了數字證書以外,這些安全性都沒有明確展示。下一篇文章使用使用 OpenSSL 實用程序和庫函數的示例填充更多詳細的信息。

同時,讓我們看一下 OpenSSL 命令行實用程序:特別是在 TLS 握手期間檢查來自 Web 伺服器的證書的實用程序。調用 OpenSSL 實用程序可以使用 openssl 命令,然後添加參數和標志的組合以指定所需的操作。

看看以下命令:

該輸出是組成 加密演算法套件(cipher suite)()的相關演算法的列表。下面是列表的開頭,加了澄清首字母縮寫詞的注釋:

下一條命令使用參數 s_client 將打開到 www.google.com 的安全連接,並在屏幕上顯示有關此連接的所有信息:

諸如 Google 之類的主要網站通常會發送多個證書進行身份驗證。

輸出以有關 TLS 會話的摘要信息結尾,包括加密演算法套件的詳細信息:

client 程序中使用了協議 TLS 1.2,Session-ID 唯一地標識了 openssl 實用程序和 Google Web 伺服器之間的連接。Cipher 條目可以按以下方式進行解析:

加密演算法套件正在不斷發展中。例如,不久前,Google 使用 RC4 流加密演算法(RSA 的 Ron Rivest 後來開發的 Ron』s Cipher 版本 4)。 RC4 現在有已知的漏洞,這大概部分導致了 Google 轉換為 AES128。

我們通過安全的 C Web 客戶端和各種命令行示例對 OpenSSL 做了首次了解,使一些需要進一步闡明的主題脫穎而出。 下一篇文章會詳細介紹 ,從加密散列開始,到對數字證書如何應對密鑰分發挑戰為結束的更全面討論。

via: https://opensource.com/article/19/6/cryptography-basics-openssl-part-1

作者: Marty Kalin 選題: lujun9972 譯者: wxy 校對: wxy

㈧ 求一個基於openssl寫的ecc曲線的源代碼

下面的例子生成兩對ECC密鑰,並用它做簽名和驗簽,並生成共享密鑰。
#include <string.h>
#include <stdio.h>
#include <openssl/ec.h>
#include <openssl/ecdsa.h>
#include <openssl/objects.h>
#include <openssl/err.h>

int main()
{
EC_KEY *key1,*key2;
EC_POINT *pubkey1,*pubkey2;
EC_GROUP *group1,*group2;
int ret,nid,size,i,sig_len;
unsigned char*signature,digest[20];
BIO *berr;
EC_builtin_curve *curves;
int crv_len;
char shareKey1[128],shareKey2[128];
int len1,len2;

/* 構造EC_KEY數據結構 */
key1=EC_KEY_new();
if(key1==NULL)
{
printf("EC_KEY_new err!\n");
return -1;
}
key2=EC_KEY_new();
if(key2==NULL)
{
printf("EC_KEY_new err!\n");
return -1;
}
/* 獲取實現的橢圓曲線個數 */
crv_len = EC_get_builtin_curves(NULL, 0);
curves = (EC_builtin_curve *)malloc(sizeof(EC_builtin_curve) * crv_len);
/* 獲取橢圓曲線列表 */
EC_get_builtin_curves(curves, crv_len);
/*
nid=curves[0].nid;會有錯誤,原因是密鑰太短
*/
/* 選取一種橢圓曲線 */
nid=curves[25].nid;
/* 根據選擇的橢圓曲線生成密鑰參數group */
group1=EC_GROUP_new_by_curve_name(nid);
if(group1==NULL)
{
printf("EC_GROUP_new_by_curve_name err!\n");
return -1;
}
group2=EC_GROUP_new_by_curve_name(nid);
if(group1==NULL)
{
printf("EC_GROUP_new_by_curve_name err!\n");
return -1;
}
/* 設置密鑰參數 */
ret=EC_KEY_set_group(key1,group1);
if(ret!=1)
{
printf("EC_KEY_set_group err.\n");
return -1;
}
ret=EC_KEY_set_group(key2,group2);
if(ret!=1)
{
printf("EC_KEY_set_group err.\n");
return -1;
}
/* 生成密鑰 */
ret=EC_KEY_generate_key(key1);
if(ret!=1)
{
printf("EC_KEY_generate_key err.\n");
return -1;
}
ret=EC_KEY_generate_key(key2);
if(ret!=1)
{
printf("EC_KEY_generate_key err.\n");
return -1;
}
/* 檢查密鑰 */
ret=EC_KEY_check_key(key1);
if(ret!=1)
{
printf("check key err.\n");
return -1;
}
/* 獲取密鑰大小 */
size=ECDSA_size(key1);
printf("size %d \n",size);
for(i=0;i<20;i++)
memset(&digest[i],i+1,1);
signature=malloc(size);
ERR_load_crypto_strings();
berr=BIO_new(BIO_s_file());
BIO_set_fp(berr,stdout,BIO_NOCLOSE);
/* 簽名數據,本例未做摘要,可將digest中的數據看作是sha1摘要結果 */
ret=ECDSA_sign(0,digest,20,signature,&sig_len,key1);
if(ret!=1)
{
ERR_print_errors(berr);
printf("sign err!\n");
return -1;
}
/* 驗證簽名 */
ret=ECDSA_verify(0,digest,20,signature,sig_len,key1);
if(ret!=1)
{
ERR_print_errors(berr);
printf("ECDSA_verify err!\n");
return -1;
}
/* 獲取對方公鑰,不能直接引用 */
pubkey2 = EC_KEY_get0_public_key(key2);
/* 生成一方的共享密鑰 */
len1=ECDH_compute_key(shareKey1, 128, pubkey2, key1, NULL);
pubkey1 = EC_KEY_get0_public_key(key1);
/* 生成另一方共享密鑰 */
len2=ECDH_compute_key(shareKey2, 128, pubkey1, key2, NULL);
if(len1!=len2)
{
printf("err\n");
}
else
{
ret=memcmp(shareKey1,shareKey2,len1);
if(ret==0)
printf("生成共享密鑰成功\n");
else
printf("生成共享密鑰失敗\n");
}
printf("test ok!\n");
BIO_free(berr);
EC_KEY_free(key1);
EC_KEY_free(key2);
free(signature);
free(curves);
return 0;
}

熱點內容
數據結構編譯器哪個好 發布:2025-09-18 04:33:52 瀏覽:435
ad轉換c語言 發布:2025-09-18 04:21:21 瀏覽:752
sqlserver2008設置外鍵 發布:2025-09-18 04:21:12 瀏覽:114
伺服器電腦電源管理 發布:2025-09-18 03:52:33 瀏覽:324
叉叉助手刪除腳本 發布:2025-09-18 03:21:24 瀏覽:851
深圳ug五軸編程培訓 發布:2025-09-18 03:13:35 瀏覽:197
安卓軟體殘留怎麼清理 發布:2025-09-18 03:02:02 瀏覽:345
centos7apachephp7 發布:2025-09-18 03:01:47 瀏覽:657
安卓如何實現點擊彈出列表 發布:2025-09-18 02:47:25 瀏覽:58
python文件函數 發布:2025-09-18 02:47:23 瀏覽:574