suchen

Heim  >  Fragen und Antworten  >  Hauptteil

node.js - RSA算法使用公钥加密,前端和后端得到的密文不一致

1.鄙人在做一个安全登录的实验时,接触到jQuery插件jCryption,版本为3.1.0。密钥对以pem文件格式存放在服务器,客户端请求公钥,则读取公钥文件返回给客户端。客户端用公钥加密之后将信息交给服务器,但是服务器一直解密错误(node.js用的类库为node-rsa)

2.后来仔细检查发现前端加密得到的密文与后端得到的密文不一致
如图:
这是前端打印的公钥
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC0hFaQcFU481wyhy5JXOv/cgOp
2xQXISjc31cfPk/Ba33j2DayrRr0lWapqIBUPPVECV4wz/S1Gq4NIPDJzIpwSkGG
+XCDccJmtbyd7UhWlqphm8Lsc4AKa28Y7pcxWs6t78fxHHBb06+N7PlNhdWu8sPj
ZLdoCxdIS9WWYuB1EQIDAQAB
-----END PUBLIC KEY-----

这是前端加密的数据
9e5040bed296c4810aa8f8f96b00b9370e3ca171c66942c358441d56d29125bf
这是前端得到的密文
jlKIiz3cW2ethkQauow89QcRnKaac8+r4dwdvYYAIqbbQlSz0bJV7WTx69Xvu/fZ8p9yolg94Lb56nfqwX0yyx4E7at+6YwHL1HxEAiM+zqL+U9gZZGZ04KmH/zScdFHdtnQixe2FwtPa6TFDK5XgUM7C7rsNrvToIipPRp+1qI=

而后端从pem文件中读取公钥加密同样的数据,得到的密文是:
FZRzdEbMeaJruhJWYT1dxNZ+Ho7QVxcic/XGQcqfgwZuQdhKqyxPQskg/ddbti52TztV21AH9MuQBDk7vVpfD/3N2ZsqCib0s0XGfPkN8LYoJ4l4lx9JigGYjLtRk34WxV7AZPVsJ1r9TCwYYitQCHQAT6PW5+O6rpPlVsYQ2yY=

以如下形式使用私钥:

得到的密文也不相同.

将上图中的私钥部分的换行符全部去掉得到的密文任然不相同。

我想问的是jCryption这个插件将字符串设置为公钥的时候怎么操作的,怎样才能使得前端和后端加密得到的密文一致,可以互相加解密呢?

请各位大神指教,困扰好几天了,不胜感谢。

怪我咯怪我咯2781 Tage vor1588

Antworte allen(3)Ich werde antworten

  • PHP中文网

    PHP中文网2017-04-17 13:46:21

    虽然帮不上你这个jCryption,我们当时开发是从网上找了一个librsa,大概注释是

    // Copyright (c) 2005  Tom Wu
    // All Rights Reserved.
    // See "LICENSE" for details.
    
    // Basic JavaScript BN library - subset useful for RSA encryption.
    
    // Bits per digit

    然后回有JSEncrypt的导出

    这个东西当时和php,java,ios接头全没问题,用的时候直接给定公钥和要加密字符串,也不需要给模这些参数

    Antwort
    0
  • 黄舟

    黄舟2017-04-17 13:46:21

    我自己来回答一下吧

    在node-rsa模块中加解密默认使用 pkcs1_oaep ,而在js中加密解密默认使用的是 pkcs1,在node-rsa中提供了函数可以修改这个选项

    var rsakey = new NodeRSA();
    rsakey.setOptions({encryptionScheme: 'pkcs1'});//就是增加这一行代码。
    

    参考:http://stackoverflow.com/questions/33837617/node-rsa-errors-when-trying-to-decrypt-message-with-private-key

    Antwort
    0
  • 大家讲道理

    大家讲道理2017-04-17 13:46:21

    如果确保你的明文一样,公钥也是一致的,那可能原因是你前后端加密时候的padding方式不一样。

    Antwort
    0
  • StornierenAntwort