今天介绍的是如何利用openssl编程生成RSA密钥对。最简单的方法是使用系统调用:exec("openssl rsa -generate")……(无数只脚踏下来……)开个小小的玩笑而已,接下来进入正题。
首先要明确的一点是:openssl0.9.8和openssl0.9.7的文件结构有明显的区别,openssl0.9.8增加了若干个头文件,以及一些新的接口;剩下与openssl0.9.7同名的头文件,内容也有改动。就拿生成RSA密钥对来说,openssl0.9.8就提供了一个与openssl0.9.7完全不同的接口:
int RSA_generate_key_ex(RSA *rsa, int bits, BIGNUM *e, BN_GENCB *cb);
其中各个参数的含义是这样的:
RSA *rsa:存放生成的密钥对的数据结构指针,需要事先分配空间;
int bits:密钥对的字节数,一般用2的指数如512,1024;
BIGNUM *e:RSA密钥生成算法中要求的大数的指针,需要事先初始化;BN_GENCB *cb:暂时没搞明白……;
最关键的是RSA *rsa,生成的密钥对就存储在这里。
各个参数的初始化方法如下:
rsa = RSA_new();
out=BIO_new(BIO_s_file());
(还有一个版本是:BIO *tmpbio = BIO_new(BIO_f_linebuffer());out = BIO_push(tmpbio, out);不知道哪一个对,期待下一步实验)
BN_GENCB *cb;直接定义一个静态变量即可
参数bn的设置:
BN_set_word(bn, 0x10001);
可以设成65537或者3,前者用得比较多。
设置好上述参数之后,就可以生成RSA密钥对了。如果使用EVP_PKEY_assign_RSA()和PEM_write_bio_PrivateKey()这两个接口,还可以把私钥导出为用口令加密的PEM文件。这两个接口还在实验中……
再强调一点,openssl0.9.8源文件中的include目录和inc32目录区别很大,在windows下编译必须使用inc32目录,否则会报错。(俺就是吃了这个亏……5555)
顺路说一下,openssl0.9.8向下兼容了openssl0.9.7的密钥生成接口:
RSA * RSA_generate_key(int bits, unsigned long e,void (*callback)(int,int,void *),void *cb_arg);
显然新的密钥生成函数更加简洁。