如何使用Openssl,已经有Key文件,如何使用这个文件进行加密和解密?
现在和第三方公司合作给客户开发一个东西,我这边需要将一个字符串加密以后传递给第三方公司提供的jsp页面。加密方式是第三方提供一个Key文件,就像银行网银用的文件证书一样,使用RSA方式加密的。现在第三方公司给我了两个文件:server.cer和test.pfx。
他们给的ReadME文件内容如下:
pfx证书密码:123456
pfx里包含一对公钥和私钥,可以用于解密和加密两个功能。
cer里只包含公钥,只能用于加密。
给到pfx的目的是方便你们自行测试解密后的数据是否正确,如果用cer加密的密文,用pfx可以正确解密的话,代码就没有问题了,之后我在给你具体的URL地址和正式的只包含公钥的cer key即可。
从来没接触过这东西,第三方公司全是Java工程师,也不能提供一个C++的Demo,我上网查了一些资料,说是可以使用Openssl库来做,也找了一些demo,但是都是直接加密文件的,而且运行过程中报异常。请教各位了,怎么解决!
[解决办法]
飘 人气
[解决办法]
http://www.openssl.org/
[解决办法]
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;}