免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3783 | 回复: 4
打印 上一主题 下一主题

大家好,有对OPENSSL熟悉的朋友么? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-02-17 14:34 |只看该作者 |倒序浏览
是这样,我有一个COM组件,作用是使用OPENSSL的RSA算法加密一串字符串,保存密钥到MYSQL数据库,然后用PHP解密出原文。

在C++中,密钥是这样生成出来的

m_pRsa = RSA_new();
m_pRsa = RSA_generate_key(m_rsa_bits,RSA_F4,NULL,NULL); /
用下面2个函数得到公钥和私钥
len = i2d_RSAPublicKey(m_pRsa, &t); //得到公钥,然后我会把公钥保存到MYSQL数据库中,私钥也是这么保存的。。
len = i2d_RSAPrivateKey(m_pRsa, &t); //得到私钥

可由于在PHP中,我要使用PHP内置的OPENSSL扩展,我必须提供PEM格式的密钥。

而我无法将C++用i2d得到的密钥在PHP中使用。

所以,我想直接用OPENSSL的API得到PEM格式的公钥和私钥。(最好是得到在内存缓存里,而不是写入文件的API,如果只有写入文件的API也可。我再读到内存 - -!)
但是由于我对OPENSSL并不熟悉,所以没找到这样的API

大家能提供一些帮助么?

论坛徽章:
0
2 [报告]
发表于 2009-02-18 15:47 |只看该作者
懂你的意思,不过我也没做了,但openssl中提供的流转换操作肯定可以转成pem格式
网上这类资料也很多,搜搜就有了

论坛徽章:
0
3 [报告]
发表于 2009-02-18 15:53 |只看该作者
i2d_RSAPrivateKey_bio()
i2d_RSAPublicKey_bio()
--------------

改正,这两个函数没用

[ 本帖最后由 fly6 于 2009-2-18 16:23 编辑 ]

论坛徽章:
0
4 [报告]
发表于 2009-02-18 16:17 |只看该作者
rsa = RSA_generate_key(1024, RSA_F4, NULL, NULL);
        if(rsa==NULL)
        {
                printf("gen rsa error\n");
                return false;
        }

        BIO *bp = BIO_new(BIO_s_file());
        if(BIO_write_filename(bp, "c:\\test.pem")<=0)
        {
                printf("write error\n");
                return false;
        }

        if(PEM_write_bio_RSAPublicKey(bp, rsa)!=1)
        {
                printf("write public key error\n");
                return false;
        }

        BIO_free_all(bp);

论坛徽章:
0
5 [报告]
发表于 2009-02-18 16:36 |只看该作者
RSA *rsa=NULL;
        printf("正在产生RSA密钥...");
        rsa = RSA_generate_key(1024, RSA_F4, NULL, NULL);
        if(rsa==NULL)
        {
                printf("gen rsa error\n");
                return false;
        }
        // 公钥
        BIO *bp = BIO_new(BIO_s_file());
        if(BIO_write_filename(bp, "c:\\public.pem")<=0)
        {
                printf("write error\n");
                return false;
        }
        if(PEM_write_bio_RSAPublicKey(bp, rsa)!=1)
        {
                printf("write public key error\n");
                return false;
        }       
        BIO_free_all(bp);
       
        char passwd[]="1234";
        // 私钥
        bp = BIO_new_file("c:\\private.pem", "w+");
        if(PEM_write_bio_RSAPrivateKey(bp, rsa, EVP_des_ede3(), (unsigned char*)passwd, 4, NULL, NULL)!=1)
        {
                printf("write public key error\n");
                return false;
        }
        BIO_free_all(bp);

--------------------
经过测试应该是可以的
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP