導航:首頁 > 編程語言 > openssl編程pdf

openssl編程pdf

發布時間:2023-02-04 22:03:49

① 求一個基於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;
}

② 如何在Ubuntu上針對OpenSSL 1.0.0安裝和構建

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

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

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

閱讀全文

與openssl編程pdf相關的資料

熱點內容
類似七界傳說的小說 瀏覽:580
李采潭2022年主演的電影 瀏覽:698
愛情大尺度外國電影 瀏覽:612
帶妹子小說 瀏覽:434
劍橋民國史pdf 瀏覽:980
女主叫林晚晚男主叫沈池 瀏覽:934
小電影資源 瀏覽:668
踢米app怎麼建自習室 瀏覽:230
穿越的父女文 瀏覽:35
適合程序員的年會節目 瀏覽:494
法國電影love西瓜 瀏覽:129
韓國電影男的通過樓上洞偷窺女的跳舞 瀏覽:487
護生畫集pdf 瀏覽:613
韓劇女主是美容院老闆娘,為了生計和客戶 瀏覽:364
吳於廑pdf 瀏覽:543
父子訓誡虐心 瀏覽:781
文件解壓大於100m怎麼辦 瀏覽:184
紅姐和麗姐是什麼電影 瀏覽:277
島國小電影站點 瀏覽:788
mes程序員創業 瀏覽:934