jsencrypt icon indicating copy to clipboard operation
jsencrypt copied to clipboard

不能通过公钥解密

Open qqqq5566 opened this issue 5 years ago • 13 comments

在客户端只存了公钥,使用公钥加密,服务端可以解密成功;服务端私钥加密,js没有公钥的解密方法

qqqq5566 avatar Nov 12 '19 04:11 qqqq5566

我也遇到了,你咋解决的?

ryangsun avatar Jul 23 '20 13:07 ryangsun

​菜鸟,几经探索解觉了这个问题

首先根据 jsencrypt 的官方文档,是不支持使用 公钥对数据解密的,最好的方法依然是换个支持的库

百度搜来搜去发现,其实nodejs 里面的 node-rsa 模块是支持这个需求的。 所以就试试了 ,居然跑通了

npm install node-rsa

main.js 中 引入相关组件

let NodeRSA = require('node-rsa'); Vue.prototype.$nodersa = NodeRSA; 在需要解密的地方这样调用

let data = this.GetUrlParam("data"); // 加密后的数据,base64 编码 let key = new this.$nodersa(this.$global.rsa_pubkey); // 设置你的公钥 console.log(key.decryptPublic(data,"utf-8")); // 解密数据

sang8052 avatar Oct 14 '20 03:10 sang8052

私钥加密,公钥解密。这种场景应该是签名吧

// Sign with the private key...
var sign = new JSEncrypt();
sign.setPrivateKey($('#privkey').val());
var signature = sign.sign($('#input').val(), CryptoJS.SHA256, "sha256");

// Verify with the public key...
var verify = new JSEncrypt();
verify.setPublicKey($('#pubkey').val());
var verified = verify.verify($('#input').val(), signature, CryptoJS.SHA256);

// Now a simple check to see if the round-trip worked.
if (verified) {
  alert('It works!!!');
}
else {
  alert('Something went wrong....');
}

auver avatar Nov 06 '20 02:11 auver

正确的做法是: 1.通信的双方各自生成私钥并导出公钥 2.双方交换公钥 3.使用换来的公钥加密 4.密文发给对方 5.对方使用自己的私钥解密,获得原文 注:公钥仅有加密能力,无解密能力

oldfritter avatar Dec 25 '20 08:12 oldfritter

~~……不对啊,要是能凭公钥进行解密,这还能是非对称加密么~~

我想起来了,过程也是可以反过来的,私钥加密,公钥解密,这种过程是做数字签名

langyo avatar Jun 30 '21 04:06 langyo

为什么不是

发自我的iPhone

------------------ 原始邮件 ------------------ 发件人: 伊欧 @.> 发送时间: 2021年6月30日 12:36 收件人: travist/jsencrypt @.> 抄送: Subscribed @.***> 主题: 回复:[travist/jsencrypt] 不能通过公钥解密 (#168)

……不对啊,要是能凭公钥进行解密,这还能是非对称加密么

— You are receiving this because you are subscribed to this thread. Reply to this email directly, view it on GitHub, or unsubscribe.

hrp61 avatar Jul 02 '21 01:07 hrp61

私钥加密,公钥解密,是签名啊!!!!!有这个方法的啊!!!各位大哥大姐!!!

auver avatar Jul 02 '21 02:07 auver

……不对啊,要是能凭公钥进行解密,这还能是非对称加密么

~~服了,怎么那么多人搞不清非对称说的是什么。非对称指的:明文和密文之间非对称。和公钥私钥之间对不对称有什么关系,,,,,~~

由于加密和解密需要两个不同的密钥,故被称为非对称加密;不同于加密和解密都使用同一个密钥的对称加密

liuyib avatar Jan 08 '23 15:01 liuyib

正确的做法是: 1.通信的双方各自生成私钥并导出公钥 2.双方交换公钥 3.使用换来的公钥加密 4.密文发给对方 5.对方使用自己的私钥解密,获得原文 注:公钥仅有加密能力,无解密能力

你的注是错的,公钥和私钥均可加密或解密。自己再去学下吧

liuyib avatar Jan 08 '23 15:01 liuyib

非对称加密

image

(引自维基百科

由于加密和解密需要两个不同的密钥,故被称为非对称加密;不同于加密和解密都使用同一个密钥的对称加密

请你先确定你的观点已经经过资料验证再来反驳。

(另外,我两年前的评论已经更正,公钥确实有解密能力,这种场景一般称作数字签名)

langyo avatar Jan 08 '23 18:01 langyo

非对称加密

image

(引自维基百科

由于加密和解密需要两个不同的密钥,故被称为非对称加密;不同于加密和解密都使用同一个密钥的对称加密

请你先确定你的观点已经经过资料验证再来反驳。

(另外,我两年前的评论已经更正,公钥确实有解密能力,这种场景一般称作数字签名)

“由于加密和解密需要两个不同的密钥,故被称为非对称加密”

这点受教了

liuyib avatar Jan 09 '23 02:01 liuyib

你两不要再吵加了! 常识: 所谓非对称加密, 公钥私钥都能加解密.区分应用场景: 公钥一般用于加密, 即常见的https原理 私钥用于签名, 用于验证.

这个云泥的说法感觉有点问题,  双方通讯时, 以TLS协议为例, 并 非什么"交换公钥",  而是有一方(忘了哪一方了)生成一个对称密钥, 然后用公钥还是私钥来着, 加密这个对称密钥,然后安全地传递给对方. 然后之后双方通信的内容, 依靠这个对称密钥采用对称算法进行加解密传输.

 

HRP @.***

 

hrp61 avatar Jan 09 '23 02:01 hrp61

私钥加密,公钥解密。这种场景应该是签名吧

// Sign with the private key...
var sign = new JSEncrypt();
sign.setPrivateKey($('#privkey').val());
var signature = sign.sign($('#input').val(), CryptoJS.SHA256, "sha256");

// Verify with the public key...
var verify = new JSEncrypt();
verify.setPublicKey($('#pubkey').val());
var verified = verify.verify($('#input').val(), signature, CryptoJS.SHA256);

// Now a simple check to see if the round-trip worked.
if (verified) {
  alert('It works!!!');
}
else {
  alert('Something went wrong....');
}

这个只是校验吧,无法通过解密获取到 $('#input').val() 的值

mraiguo avatar Aug 25 '23 12:08 mraiguo