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....