openssl源碼
① 基於openssl寫的ecc代碼
你是想自己寫還是調用openssl的系統庫函數啊?如果是自己寫可以在任何一個操作系統平台上下載一個openssl的包,然後進入crypto文件夾,裡面有很多與密碼相關的文件夾,進入ec,可以看到所有ecc的文件,打開看過程就好。如果是調用的話,建議參考openssl官方文檔或其他學習書籍。
② 如何選擇OpenSSL源碼的版本
nginx一般我們使用的是openssl靜態載入的。也就是你系統安裝openssl的rpm包。所以你要查看openssl版本,只要看你系統安裝的openssl版本就可以了,操作如下: rpm -aq | grep openssl
③ php的openssl_sign($data,$sign,$private_key)這個函數的源碼是什麼
這個是打開https的訪問所用的到的函數
④ 如何將openssl aes源碼移植到嵌入式
移植步驟如下:
1、首先將openssl 源碼download下來;
2、在你的嵌入式開發環境中,交叉編譯openssl源碼,生成庫文件;
3、在你的嵌入式程序中,添加對交叉編譯後的openssl庫文件的支持,並在socket通信中調用ssl相關的函數。
⑤ 如何從openssl源碼中提取出rsa加密源碼
#include <openssl/rsa.h>
#include <openssl/sha.h>
int main()
{
RSA *r;
int bits=1024,ret,len,flen,padding,i;
unsigned long e=RSA_3;
BIGNUM *bne;
unsigned char*key,*p;
BIO *b;
unsigned charfrom[500],to[500],out[500];
bne=BN_new();
ret=BN_set_word(bne,e);
r=RSA_new();
ret=RSA_generate_key_ex(r,bits,bne,NULL);
if(ret!=1)
{
printf("RSA_generate_key_ex err!\n");
return -1;
}
/* 私鑰i2d */
b=BIO_new(BIO_s_mem());
ret=i2d_RSAPrivateKey_bio(b,r);
key=malloc(1024);
len=BIO_read(b,key,1024);
BIO_free(b);
b=BIO_new_file("rsa.key","w");
ret=i2d_RSAPrivateKey_bio(b,r);
BIO_free(b);
/* 私鑰d2i */
/* 公鑰i2d */
/* 公鑰d2i */
/* 私鑰加密 */
flen=RSA_size(r);
printf("please select private enc padding : \n");
printf("1.RSA_PKCS1_PADDING\n");
printf("3.RSA_NO_PADDING\n");
printf("5.RSA_X931_PADDING\n");
scanf("%d",&padding);
if(padding==RSA_PKCS1_PADDING)
flen-=11;
else if(padding==RSA_X931_PADDING)
flen-=2;
else if(padding==RSA_NO_PADDING)
flen=flen;
else
{
printf("rsa not surport !\n");
return -1;
}
for(i=0;i<flen;i++)
memset(&from[i],i,1);
len=RSA_private_encrypt(flen,from,to,r,padding);
if(len<=0)
{
printf("RSA_private_encrypt err!\n");
return -1;
}
len=RSA_public_decrypt(len,to,out,r,padding);
if(len<=0)
{
printf("RSA_public_decrypt err!\n");
return -1;
}
if(memcmp(from,out,flen))
{
printf("err!\n");
return -1;
}
/* */
printf("please select public enc padding : \n");
printf("1.RSA_PKCS1_PADDING\n");
printf("2.RSA_SSLV23_PADDING\n");
printf("3.RSA_NO_PADDING\n");
printf("4.RSA_PKCS1_OAEP_PADDING\n");
scanf("%d",&padding);
flen=RSA_size(r);
if(padding==RSA_PKCS1_PADDING)
flen-=11;
else if(padding==RSA_SSLV23_PADDING)
flen-=11;
else if(padding==RSA_X931_PADDING)
flen-=2;
else if(padding==RSA_NO_PADDING)
flen=flen;
else if(padding==RSA_PKCS1_OAEP_PADDING)
flen=flen-2 * SHA_DIGEST_LENGTH-2 ;
else
{
printf("rsa not surport !\n");
return -1;
}
for(i=0;i<flen;i++)
memset(&from[i],i+1,1);
len=RSA_public_encrypt(flen,from,to,r,padding);
if(len<=0)
{
printf("RSA_public_encrypt err!\n");
return -1;
}
len=RSA_private_decrypt(len,to,out,r,padding);
if(len<=0)
{
printf("RSA_private_decrypt err!\n");
return -1;
}
if(memcmp(from,out,flen))
{
printf("err!\n");
return -1;
}
printf("test ok!\n");
RSA_free(r);
return 0;
}
上述程序中當採用公鑰RSA_SSLV23_PADDING加密,用私鑰RSA_SSLV23_PADDING解密時會報錯,原因是openssl源代碼錯誤:
rsa_ssl.c函數RSA_padding_check_SSLv23有:
if (k == -1) /* err */
{
RSAerr(RSA_F_RSA_PADDING_CHECK_SSLV23,RSA_R_SSLV3_ROLLBACK_ATTACK);
return (-1);
}
修改為k!=-1即可。
各種padding對輸入數據長度的要求:
私鑰加密:
RSA_PKCS1_PADDING RSA_size-11
RSA_NO_PADDING RSA_size-0
RSA_X931_PADDING RSA_size-2
公鑰加密
RSA_PKCS1_PADDING RSA_size-11
RSA_SSLV23_PADDING RSA_size-11
RSA_X931_PADDING RSA_size-2
RSA_NO_PADDING RSA_size-0
RSA_PKCS1_OAEP_PADDING RSA_size-2 * SHA_DIGEST_LENGTH-2
⑥ 如何在不卸載現有OpenSSL的情況下源碼安裝配置新版OpenSSL+Apache
首先是把新版本OpenSSL的安裝路徑加入$PATH
sudo gvim ~/.bashrc在文件末尾加上:
PATH="$PATH:/usr/local/openssl/bin:"export PATH然後保存
將/usr/bin/openssl改名
/usr/bin$ sudo mv openssl openssl0.9.8這樣的就可以在命令行中直接使用新版的OpenSSL了
$ openssl version -aOpenSSL 1.0.1c 10 May 2012built on: Sun Jul 22 20:43:26 CST 2012platform: linux-elfoptions: bn(64,32) rc4(8x,mmx) des(ptr,risc1,16,long) idea(int) blowfish(idx) compiler: gcc -DOPENSSL_THREADS -D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -Wa,--noexecstack -DL_ENDIAN -DTERMIO -O3 -fomit-frame-pointer -Wall -DOPENSSL_BN_ASM_PART_WORDS -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DMD5_ASM -DRMD160_ASM -DAES_ASM -DVPAES_ASM -DWHIRLPOOL_ASM -DGHASH_ASMOPENSSLDIR: "/usr/local/openssl/ssl"變更include頭文件:
/usr/include$ sudo mv openssl openssl0.9.8/usr/include$ sudo cp -r /usr/local/openssl/include ./還需要重新編譯Apache才能使用新版的OpenSSL
$ ./configure --prefix=/usr/local/apache2.4 --with-layout=Apache --enable-molues=most --enable-mods-shared=all --with-mpm=prefork --with-ssl=/usr/local/openssl注意最後一句是啟用新版OpenSSL的關鍵
然後就是套路了,make && make install
配置……
然後測試一下,證明已經可以用的一個證據是:
./ab -t 5 -c 100 -n 20000 https://127.0.0.1/index.htmlThis is ApacheBench, Version 2.4 (OpenSSL 1.0.1c 10 May 2012)看來以後要多用源碼安裝,少用系統預編譯的包,不然可更新軟體可真是麻煩呀
⑦ 想讓libeay32.dll靜態鏈接VC runtime,自己編譯openSSL源碼,然而總是報錯
系統文件LIBEAY32.dll是存放在Windows系統文件夾中的重要文件,通常情況下是在安裝操作系統過程中自動創建的,對於系統正常運行來說至關重要。在正常情況下不建議用戶對該類文件進行隨意的修改,它的存在對維護計算機系統的穩定具有重要作用。
"提示無法找到libeay32.dll文件"這是因為被病毒感染相關文件導致,一旦殺毒軟體刪除被感染的文件,就會導致相關文件缺失,導致運行游戲時提示缺少libeay32.dll等.libeay32.dll丟失游戲常用軟體運行不起來運行不起來,或者報錯修復方法:
方法一:也是最簡單的一種方法,手工替換相關文件可以解決問題。在正常工作的相關軟體安裝目錄中,找到這個libeay32.dll文件,復制到出現問題的軟體目錄下,即可解決問題。
方法二:重新安裝系統(不推薦)
方法三:從朋友電腦上拷貝或者到網上下載文件,放到C:\WINDOWS\SYSTEM32文件夾下。另外復制到X盤:\游戲文件夾\,如果還不行可能是文件版本與游戲所支持的版本不一致。
⑧ 求一個基於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;
}
⑨ openssl-devel和openssl 是什麼具體關系
Redhat在封裝openssl的時候,把openssl分成了幾個部分,執行碼部分就是 openssl-1.0.0-27.el6.x86_64 這種包。 openssl-devel-1.0.0-27.el6.x86_64 這個就是包含了頭文件,頭文件參考,某些庫文件等跟開發相關的東西。 mod_ssl-2.2.15-26.el6.x86_64 這個不是open ssl 本身的東西,是apache的模塊。 你在http://www.openssl.org/source/上下載的源碼編譯安裝後得到的東西就是openssl-1.0.0-27.el6.x86_64和openssl-devel-1.0.0-27.el6.x86_64這兩個包加在一起的內容。 另外,OpenSSL是分系列的,每個系列下再分版本 a b c d e。。。。 目前常用的是 0.9.8 1.0.0 1.0.1 三個系列。 RHEL 6.4 是openssl 1.0.0 系列的版本。 RHEL 6.5 是 openssl 1.0.1 系列的版本。 Redhat 提供的openssl升級包的版本一般是 openssl-1.0.0-27.el6.X.x86_64.rpm 這種。 Redhat 會把OpenSSL發布的補丁整合到現有版本中去,叫做backport。 例如,RHEL 6.4 目前的最新的OpenSSL就是2014-06-05發布的 openssl-1.0.0-27.el6_4.4.x86_64.rpm 和 openssl-devel-1.0.0-27.el6_4.4.x86_64.rpm RHEL 6.5 則是2014-08-13發布的 openssl-1.0.1e-16.el6_5.15.x86_64....