免费注册 查看新帖 |

Chinaunix

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

[C++] c++ openssl rsa 加密,JAVA 解密大问题。 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-05-15 16:25 |只看该作者 |倒序浏览
这几天一直在找c++ 中openssl rsa 加密的方法,但是弄了好多,都无法对应上java 端的解密。
如下有java的加密流程:
public static String encrypt(String source, String publicKey, String input_charset)
            throws Exception {
        Key key = getPublicKey(publicKey);
        /** 获取Cipher对象 */
        Cipher cipher = Cipher.getInstance(" RSA/ECB/PKCS1Padding");
        cipher.init(Cipher.ENCRYPT_MODE, key);
        if (CommonUtil.isNull(input_charset)) {
            input_charset = "utf-8";
        }
        byte[] b = source.getBytes(input_charset);
        /** 加密 */
        byte[] b1 = cipher.doFinal(b);
        String encoded = Base64.encode(b1);
        return encoded;
    }

自己使用c++模拟java的加密方法:
const std::string tools::EncodeRSAKey(const std::string& strPublicKey, const std::string& strData)
{
    if (strPublicKey.empty() || strData.empty())
    {
        assert(false);
        return "";
    }

    std::string strRet;
    RSA* pRSAPublicKey;

    int p_len = strPublicKey.size();
    std::string strPublicKeyTemp = strPublicKey;
    for(int i = 64; i < p_len; i+=64)
    {
        if(strPublicKeyTemp[i] != '\n')
        {
            strPublicKeyTemp.insert(i, "\n");
        }
        i++;
    }
    strPublicKeyTemp.insert(0, "-----BEGIN PUBLIC KEY-----\n");
    strPublicKeyTemp.append("\n-----END PUBLIC KEY-----\n");

    BIO* p_bio = BIO_new_mem_buf((void*)strPublicKeyTemp.c_str(), -1);

    pRSAPublicKey = PEM_read_bio_RSA_PUBKEY(p_bio, NULL, 0, NULL);
    if ( pRSAPublicKey == NULL )
    {
        return "";
    }

    int nLen = RSA_size(pRSAPublicKey);
    char* pEncode = new char[nLen + 1];
    int ret = RSA_public_encrypt(nLen - 11, (const unsigned char*)strData.c_str(), (unsigned char*)pEncode, pRSAPublicKey, RSA_PKCS1_PADDING);
    if (ret >= 0)
    {
        strRet = std::string(pEncode, ret);
    }
    delete[] pEncode;
    CRYPTO_cleanup_all_ex_data();

    // 进行base 64加密
    string strEncodeOut;
    if (!tools::b64Encode((unsigned char *)strRet.c_str(), strRet.size(), strEncodeOut))
    {
        RSA_free(pRSAPublicKey);
        return "";
    }
    RSA_free(pRSAPublicKey);
    return strEncodeOut;
}

自己在c++中进行解密成功,但是在java中还是无法解密,哪位大神有此类的经验,请赐教赐教!多谢了!

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
2 [报告]
发表于 2015-05-17 10:12 来自手机 |只看该作者
我是自己写一套RSA,Java一份,C一份。

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
3 [报告]
发表于 2015-05-17 10:12 来自手机 |只看该作者
本帖最后由 yulihua49 于 2015-05-17 10:14 编辑

我是自己写一套RSA,Java一份,C一份。
可以互操作。

论坛徽章:
59
2015年亚洲杯之约旦
日期:2015-01-27 21:27:392015年亚洲杯之日本
日期:2015-02-06 22:09:41拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015元宵节徽章
日期:2015-03-06 15:50:392015年亚洲杯之阿联酋
日期:2015-03-19 17:39:302015年亚洲杯之中国
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03双子座
日期:2014-12-10 21:39:16处女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
4 [报告]
发表于 2015-05-17 15:25 |只看该作者
回复 3# yulihua49


    这是唯一可行方案。。。

论坛徽章:
14
巨蟹座
日期:2013-11-19 14:09:4615-16赛季CBA联赛之青岛
日期:2016-07-05 12:36:0515-16赛季CBA联赛之广东
日期:2016-06-29 11:45:542015亚冠之全北现代
日期:2015-07-22 08:09:472015年辞旧岁徽章
日期:2015-03-03 16:54:15巨蟹座
日期:2014-12-29 08:22:29射手座
日期:2014-12-05 08:20:39狮子座
日期:2014-11-05 12:33:52寅虎
日期:2014-08-13 09:01:31巳蛇
日期:2014-06-16 16:29:52技术图书徽章
日期:2014-04-15 08:44:01天蝎座
日期:2014-03-11 13:06:45
5 [报告]
发表于 2015-05-18 09:24 |只看该作者
Java的String 和 C++的std::string 编码就不一样呀

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
6 [报告]
发表于 2015-05-18 09:27 |只看该作者
yulihua49 发表于 2015-05-17 10:12
我是自己写一套RSA,Java一份,C一份。
可以互操作。


当年自己写rc4, 也能互操作, 最后发现也就是只能互操作而已;
找了半天, 才发现初始化时候写错了

论坛徽章:
1
双子座
日期:2013-11-14 17:43:24
7 [报告]
发表于 2015-05-18 10:36 |只看该作者
我几年前作过类似的事情,用Microsoft的加密库和Java的加密库互相操作,也碰到搂主一样的问题。如果没有记错的话,应该是下面的两个因素引起的问题:
1. 需要明确两端的加密/解密模式: ECB/CBC之类的。
2. Java的字节处理,应该是大字端,C++端的字节处理在x86系统上应该小字端。
你可以试试看。我回去找找看有没有以前的资料留下来看下。时间太长了,有点忘了

论坛徽章:
0
8 [报告]
发表于 2015-09-10 16:17 |只看该作者
楼主,你好,我也遇到类似的问题,android上加密,c++ 服务器解密出错,但是有部分android手机却可以被解密,求解

论坛徽章:
0
9 [报告]
发表于 2015-09-10 16:17 |只看该作者
回复 7# star_in_sky

兄弟,你是怎么解决,能否说说,现在遇到这样的问题,头痛
   

论坛徽章:
154
2022北京冬奥会纪念版徽章
日期:2015-08-07 17:10:5720周年集字徽章-年
日期:2022-10-26 16:44:2015-16赛季CBA联赛之深圳
日期:2022-11-02 14:02:4515-16赛季CBA联赛之八一
日期:2022-11-28 12:07:4820周年集字徽章-20	
日期:2023-07-19 08:49:4515-16赛季CBA联赛之八一
日期:2023-11-04 19:23:5115-16赛季CBA联赛之广夏
日期:2023-12-13 18:09:34
10 [报告]
发表于 2015-09-13 09:30 来自手机 |只看该作者
阿门,这个问题怪了。。。听大神分析
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP