首页
社区
课程
招聘
[旧帖] C/C++ 的 openssl的RSA加密问题 0.00雪花
发表于: 2012-11-1 11:17 13150

[旧帖] C/C++ 的 openssl的RSA加密问题 0.00雪花

2012-11-1 11:17
13150
最近需要做一些关于RSA加密的算法问题,从服务器返回的公钥与一些参数值进行公钥加密

已知 e 和 公钥 strPublic ;

代码大致片段为:

BIGNUM *bnn,*bne;

int nRet = BN_hex2bn(&bnn,strPublic );  //公钥 已知公钥每次都相同

unsigned long e = 0x10001; 
nRet = BN_set_word(bne, e);      //e

RSA *pRsa = RSA_new();
  pRsa->n = bnn;
  pRsa->e = bne;
        pRsa->d = NULL;

flen =  RSA_size(pRsa); // RSA密钥长度

strTemp.Format(_T("%s\t%s\n%s"),strSvcTime,strNonce,_T("abcedf")); //strSvcTime 与 strNonce 是服务器返回的两个参数 并且这是服务器js的密码拼接方法

strPwd = strTemp;

nRet =  RSA_public_encrypt(flen-11, pszPwd, encData, pRsa,  RSA_PKCS1_PADDING);   // pszPwd 为需要加密的源字符串, 采用PKCS1填充所以flen需要-11;

可是这加密后的结果对服务器进行post后总是返回密码错误,

如果使用服务器的js 进行加密则可通过验证

以下为服务器的主要的加密过程

 if ((me.loginType & rsa) && me.servertime && sinaSSOEncoder && sinaSSOEncoder.RSAKey) {
          request["servertime"] = me.servertime;
          request["nonce"] = me.nonce;
          request["pwencode"] = "rsa2";
          request["rsakv"] = me.rsakv;
          var RSAKey = new sinaSSOEncoder.RSAKey();
          RSAKey.setPublic(me.rsaPubkey, '10001'); //公钥 与 e参数
          password = RSAKey.encrypt([me.servertime, me.nonce].join("\t") + "\n" + password);
      } 

//这是js 的RSA加密过程
function RSAEncrypt(text) {
    var m = pkcs1pad2(text,(this.n.bitLength()+7)>>3); //经验证这是标准的 pkcs1填充
    if(m == null) return null;
    var c = this.doPublic(m);
    if(c == null) return null;
    var h = c.toString(16);
    if((h.length & 1) == 0) return h; else return "0" + h;
  }

请问 这是什么原因导致 OPENSSL的 RSA 加密 通不过服务器验证的问题呢 ?

[课程]FART 脱壳王!加量不加价!FART作者讲授!

收藏
免费 0
支持
分享
最新回复 (11)
雪    币: 2015
活跃值: (902)
能力值: ( LV12,RANK:1000 )
在线值:
发帖
回帖
粉丝
2
有没发现下面是指针的指针?
BIGNUM **n;      
BIGNUM **e;   

struct rsa_st
        {
        int pad;
        long version;
        const RSA_METHOD *meth;
        ENGINE *engine;
        BIGNUM **n;      
    BIGNUM **e;      
    BIGNUM *d;      
        BIGNUM *p;      
        BIGNUM *q;      
        BIGNUM *dmp1;   
        BIGNUM *dmq1;   
        BIGNUM *iqmp;    // (inverse of q) mod p
        CRYPTO_EX_DATA ex_data;
        int references;
        int flags;
        BN_MONT_CTX *_method_mod_n;
        BN_MONT_CTX *_method_mod_p;
        BN_MONT_CTX *_method_mod_q;
        char *bignum_data;
        BN_BLINDING *blinding;
        BN_BLINDING *mt_blinding;
        };
2012-11-1 23:43
0
雪    币: 211
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
应该不是 指针的问题.. 毕竟函数已经成功返回了 只是用RSA返回的加密字串提交给服务器就返回密码错误了
2012-11-2 10:26
0
雪    币: 2015
活跃值: (902)
能力值: ( LV12,RANK:1000 )
在线值:
发帖
回帖
粉丝
4
无语,函数参数形式都没搞清楚还调用的一头是劲!白费口舌!
2012-11-2 11:42
0
雪    币: 120
活跃值: (18)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
1> 估计是padding方式,没统一
2> 估计是公钥,或者是数据大小端没统一
2012-11-2 17:27
0
雪    币: 211
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
拜托 哪里是指针的指针,你看我的 RSA的结构体定义,别想当然的认为每个人的环境版本都一样:

不知道你的是什么版本 我的1.0.0e的 要是我传参都弄错 编译器自然会报错的

struct rsa_st
        {
        /* The first parameter is used to pickup errors where
         * this is passed instead of aEVP_PKEY, it is set to 0 */
        int pad;
        long version;
        const RSA_METHOD *meth;
        /* functional reference if 'meth' is ENGINE-provided */
        ENGINE *engine;
        BIGNUM *n;
        BIGNUM *e;
        BIGNUM *d;
        BIGNUM *p;
        BIGNUM *q;
        BIGNUM *dmp1;
        BIGNUM *dmq1;
        BIGNUM *iqmp;
        /* be careful using this if the RSA structure is shared */
        CRYPTO_EX_DATA ex_data;
        int references;
        int flags;

        /* Used to cache montgomery values */
        BN_MONT_CTX *_method_mod_n;
        BN_MONT_CTX *_method_mod_p;
        BN_MONT_CTX *_method_mod_q;

        /* all BIGNUM values are actually in the following data, if it is not
         * NULL */
        char *bignum_data;
        BN_BLINDING *blinding;
        BN_BLINDING *mt_blinding;
        };
2012-11-5 10:14
0
雪    币: 2015
活跃值: (902)
能力值: ( LV12,RANK:1000 )
在线值:
发帖
回帖
粉丝
7
原来是头文件给人做了手脚,现在的社会好人真是做不得!
2012-11-5 13:09
0
雪    币: 211
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
那你好人做到底 发一个最新未给人做过手脚的 openssl下载地址给我吧
2012-11-6 14:53
0
雪    币: 1
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
楼主问题解决了吗,我也遇到同样的问题,能个留箱联系一下
2013-1-27 15:42
0
雪    币: 215
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
已经说的很明白了,自己慢慢调试看!伸手党不好。
2013-3-15 11:35
0
雪    币: 4
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
小新和小浪是两个好基友,现在他们都变坏了
2013-7-8 15:04
0
雪    币: 36
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
楼主一定是没将加密后的数据转化成16进制字符串。
2014-1-20 18:25
0
游客
登录 | 注册 方可回帖
返回
//