如何使用Openssl,已经有Key文件,如何使用这个文件进行加密和解密?

bingyu_2008 2010-12-10 11:42:32
现在和第三方公司合作给客户开发一个东西,我这边需要将一个字符串加密以后传递给第三方公司提供的jsp页面。加密方式是第三方提供一个Key文件,就像银行网银用的文件证书一样,使用RSA方式加密的。现在第三方公司给我了两个文件:server.cer和test.pfx。
他们给的ReadME文件内容如下:
pfx证书密码:123456
pfx里包含一对公钥和私钥,可以用于解密和加密两个功能。
cer里只包含公钥,只能用于加密。
给到pfx的目的是方便你们自行测试解密后的数据是否正确,如果用cer加密的密文,用pfx可以正确解密的话,代码就没有问题了,之后我在给你具体的URL地址和正式的只包含公钥的cer key即可。

从来没接触过这东西,第三方公司全是Java工程师,也不能提供一个C++的Demo,我上网查了一些资料,说是可以使用Openssl库来做,也找了一些demo,但是都是直接加密文件的,而且运行过程中报异常。请教各位了,怎么解决!
...全文
837 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
lijia6745 2013-05-24
  • 打赏
  • 举报
回复
遇到一样的问题呢 WIN7 VS2010
KSAMNE 2011-11-08
  • 打赏
  • 举报
回复
楼主,您好,我也遇到同样的问题,能不能教教我怎么解决的啊!
bingyu_2008 2010-12-12
  • 打赏
  • 举报
回复
周末都没有多少人逛论坛的吗?
bingyu_2008 2010-12-11
  • 打赏
  • 举报
回复

#include <openssl/rsa.h>
#include <openssl/evp.h>
#include <openssl/objects.h>
#include <openssl/x509.h>
#include <openssl/err.h>
#include <openssl/pem.h>
#include <openssl/ssl.h>
#include <openssl/applink.c>

#define PUBFILE "server.cer"
#define PRIVFILE "test.pfx"

EVP_PKEY* ReadPublicKey(const char *certfile);
EVP_PKEY* ReadPrivateKey(const char *keyfile);

int main()
{
SSLeay_add_all_algorithms();
ERR_load_crypto_strings();

ReadPublicKey(PUBFILE);

return 0;
}

EVP_PKEY* ReadPublicKey(const char *certfile)
{
FILE *fp = fopen (certfile, "r");
X509 *x509;
EVP_PKEY *pkey;

if (NULL == fp)
{
return NULL;
}

x509 = PEM_read_X509(fp, NULL, 0, NULL);
fclose (fp);
if (NULL == x509)
{
return NULL;
}

pkey = X509_extract_key(x509);
X509_free(x509);

return pkey;
}

EVP_PKEY* ReadPrivateKey(const char *keyfile)
{
FILE *fp = fopen(keyfile, "r");
EVP_PKEY *pkey;

if (NULL == fp)
{
return NULL;
}

pkey = PEM_read_PrivateKey(fp, NULL, 0, NULL);
fclose (fp);

return pkey;
}

上面这段程序我是从Openssl的demos中提取的读密钥的代码,运行到PEM_read_X509和PEM_read_PrivateKey就崩溃了。
求大哥大姐们帮忙看看究竟怎么回事儿,我都快崩溃了,明天还搞不定我就完了。。。
bingyu_2008 2010-12-11
  • 打赏
  • 举报
回复
为什么我写的程序,只要运行到读取密钥的函数时程序就直接崩溃了,象PEM_read_RSAPublicKey,PEM_read_X509,程序走到这个地方的时候都会出问题,究竟是什么原因呢?有没有谁有一个能运行的例子?
jixingzhong 2010-12-10
  • 打赏
  • 举报
回复
看这些吧:
http://www.openssl.org/docs/crypto/rsa.html#
jixingzhong 2010-12-10
  • 打赏
  • 举报
回复
http://www.openssl.org/
modyaj 2010-12-10
  • 打赏
  • 举报
回复
飘 人气
makeppy 2010-12-10
  • 打赏
  • 举报
回复
openssl的库最好是使用Linux运行,我做过解析证书的,有段时间了,好像是p12格式的,利用的是X509的结构解析的,公钥和私钥一个方法就搞定~~openssl可以搞定的,我有openssl的资料~~300页的文档~~~不过在公司,需要的话,周一给你吧~~站内PM啊~~~pfx没了解过~最好的做法就是Linux下的C++开发,代码在win下打包整dll或是so,使用java的JNI来调用~~~最好是C++编程,不要使用C~~C和JNI的衔接貌似不是很好~~
openssl版本问题要建议,不要使用最新的版本~~openssl-0.9.8k.tar.gz还不错的~~

有一段demo,解压后openssl-0.9.8k\openssl-0.9.8k\demos,很多例子的,你先看看~~推荐Linux啊~ 地址:http://openssl.org/source/ 自己编译下~~不想编译直接下载人家编译好的也行~就是lib win32(so Linux)和include文件~
 
int main(int argc, char **argv)
{
FILE *fp;
EVP_PKEY *pkey;
X509 *cert;
STACK_OF(X509) *ca = NULL;
PKCS12 *p12;
int i;
if (argc != 4) {
fprintf(stderr, "Usage: pkread p12file password opfile\n");
exit (1);
}
SSLeay_add_all_algorithms();
ERR_load_crypto_strings();
if (!(fp = fopen(argv[1], "rb"))) {
fprintf(stderr, "Error opening file %s\n", argv[1]);
exit(1);
}
p12 = d2i_PKCS12_fp(fp, NULL);
fclose (fp);
if (!p12) {
fprintf(stderr, "Error reading PKCS#12 file\n");
ERR_print_errors_fp(stderr);
exit (1);
}
if (!PKCS12_parse(p12, argv[2], &pkey, &cert, &ca)) {
fprintf(stderr, "Error parsing PKCS#12 file\n");
ERR_print_errors_fp(stderr);
exit (1);
}
PKCS12_free(p12);
if (!(fp = fopen(argv[3], "w"))) {
fprintf(stderr, "Error opening file %s\n", argv[1]);
exit(1);
}
if (pkey) {
fprintf(fp, "***Private Key***\n");
PEM_write_PrivateKey(fp, pkey, NULL, NULL, 0, NULL, NULL);
}
if (cert) {
fprintf(fp, "***User Certificate***\n");
PEM_write_X509_AUX(fp, cert);
}
if (ca && sk_num(ca)) {
fprintf(fp, "***Other Certificates***\n");
for (i = 0; i < sk_X509_num(ca); i++)
PEM_write_X509_AUX(fp, sk_X509_value(ca, i));
}
fclose(fp);
return 0;
}



看看合适不?
bingyu_2008 2010-12-10
  • 打赏
  • 举报
回复
我自己写了一个,运行到PEM_read_RSAPublicKey的时候出错,各位帮忙把把脉,还有我的私钥是有密码的:123456,这个怎么加进去呢?

#include <string.h>
#include <memory.h>
#include <openssl/rsa.h>
#include <openssl/applink.c>
#include <openssl/pem.h>

#define PUBLICKEY "server.cer"
#define PRIVATEKEY "test.pfx"

int main()
{
CRYPTO_malloc_init();
OpenSSL_add_all_algorithms();

char* txt = "hello world!";
char outbuf[1024] = {0};
char what[1024] = {0};

FILE* public_file = fopen(PUBLICKEY, "r");
FILE* private_file = fopen(PRIVATEKEY, "r");

//加密
RSA* pubkey = PEM_read_RSAPublicKey(public_file, NULL, NULL, NULL);
int flen = RSA_size(pubkey);
int len = RSA_public_encrypt(flen, (unsigned char*)txt, (unsigned char*)outbuf, pubkey, RSA_NO_PADDING);
printf("Encrypt:%s\r\n", outbuf);

//解密
RSA* prikey = PEM_read_RSAPrivateKey(private_file, NULL, NULL, NULL);
flen = RSA_size(prikey);
len = RSA_private_decrypt(flen, (unsigned char*)outbuf, (unsigned char*)what, prikey, RSA_NO_PADDING);
printf("Decrypt:%s\r\n", what);

RSA_free(pubkey);
RSA_free(prikey);

return 0;
}

3,881

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧