先用前人总结的RSA相关的资料介绍下:
一. RSA PEM文件格式
1. PEM私钥格式文件
1 2 |
-----BEGIN RSA PRIVATE KEY-----
-----END RSA PRIVATE KEY----- |
2. PEM公钥格式文件
1 2 |
-----BEGIN PUBLIC KEY-----
-----END PUBLIC KEY----- |
3. PEM RSAPublicKey公钥格式文件
1 2 |
-----BEGIN RSA PUBLIC KEY-----
-----END RSA PUBLIC KEY----- |
二. OpenSSL密钥相关命令
1. 生成密钥
1 2 3 |
openssl genrsa -out key.pem 1024
-out 指定生成文件,此文件包含公钥和私钥两部分,所以即可以加密,也可以解密
1024 生成密钥的长度 |
2. 提取PEM格式公钥
1 2 3 |
openssl rsa -in key.pem -pubout -out pubkey.pem
-in 指定输入的密钥文件
-out 指定提取生成公钥的文件(PEM公钥格式) |
3. 提取PEM RSAPublicKey格式公钥
1 2 3 |
openssl rsa -in key.pem -RSAPublicKey_out -out pubkey.pem
-in 指定输入的密钥文件
-out 指定提取生成公钥的文件(PEM RSAPublicKey格式) |
4. 公钥加密文件
1 2 3 4 5 |
openssl rsautl -encrypt -in input.file -inkey pubkey.pem -pubin -out output.file
-in 指定被加密的文件
-inkey 指定加密公钥文件
-pubin 表面是用纯公钥文件加密
-out 指定加密后的文件 |
5. 私钥解密文件
1 2 3 4 |
openssl rsautl -decrypt -in input.file -inkey key.pem -out output.file
-in 指定需要解密的文件
-inkey 指定私钥文件
-out 指定解密后的文件 |
那么问题来了:
问题一:PEM_read_RSA_PUBKEY和PEM_read_RSAPublicKey,大多数人都分不清区别,看上面分别是不同的功能,读
不同格式的公钥。所以不能混用,否则会运行失败。
PEM_read_RSA_PUBKEY 读PEM公钥
PEM_read_RSAPublicKey读 RSAPublicKey
问题二:上面对应的读取函数对了为什么,还是运行就出错了呢
int
PEM_write_RSAPublicKey(
FILE
*fp,
RSA *x);文件指针使用fopen打开。国外网站说是fopen
的C库版本
和openssl编译c库不一样运行就导致兼容性
出错了。请确保在同一台机器编译好openssl,同一台
机器使用。
问题三:既然以上两点都注意了还错,那就是版本问题了,32位环境编译的在32位工程里面用,64位的在64位里面用
,Debug版本用Debug的项目,Release版本用Release的项目。混用了要不然编译不过,要不然会运行闪退。