gpt4 book ai didi

javascript - forge.js 复制我用 rsa 所做的事情,但用 aes

转载 作者:行者123 更新时间:2023-12-03 09:05:36 25 4
gpt4 key购买 nike

我正在使用 JavaScript 库 forge.js ( https://github.com/digitalbazaar/forge )

rsa publicKey(如果长度为 896 位)可以让我加密一段文本,但是 publicKey 本身的长度对于我的需要来说太长了。

如果我将其缩短为 460 位的 key ,那么 key 的长度几乎没问题,但是我只能加密一小部分。

我喜欢 RSA 的功能(加密/解密和签名/验证),但我不喜欢 key 本身的长度和大小限制。

还有其他形式的加密更适合我的使用吗?

需求:

  • 大约 20 个字符长的公钥

  • 能够加密大约 140 个字符

  • 与 RSA 相同或相似的功能

我一直在尝试伪造 AES,但看起来加密是一种共享的东西 - 你有一个 key (是共享的?)。然后你可以创建一个密码和解密。但我不明白这如何与 rsa as 类似地工作;使用 rsa,我可以共享我的公钥并安全地进行签名和解密,但我不知道如何以我目前对 aes 的理解来做到这一点。

我目前将如何操作:

//make sure that what user has said both hasn't been tampered with and is for you
var kp=forge.pki.rsa.generateKeyPair({bits: 896,e:0x10001});
var m=['Hi!'];
m[1]=kp.privateKey.sign(forge.md.sha1.create().update(m[0],'utf8'));
console.log(m);
console.log(kp.publicKey.verify(forge.md.sha1.create().update(m[0],'utf8').digest().bytes(),m[1]));
var asked='did you read this?';
var ask=kp.publicKey.encrypt(asked);
var read=kp.privateKey.decrypt(ask);
var r=['yes!'];
console.log('yes?');
r[1]=kp.privateKey.sign(forge.md.sha1.create().update(r[0],'utf8'));
r[2]=kp.privateKey.sign(forge.md.sha1.create().update(read,'utf8'));
console.log(kp.publicKey.verify(forge.md.sha1.create().update(asked,'utf8').digest().bytes(),r[2]));

注意:您需要在生产中使用 try{}catch(e){} 进行解密和验证,以防我们针对不同用户的公钥发送消息。

到目前为止,我基本上可以加密和解密,但我不明白如何将这种形式的密码学变成我习惯的方式

//encypher the letter i then decypher it
var aes=forge.pkcs5.pbkdf2('k9','kr',1000,32);
var ci=forge.cipher.createCipher('AES-CBC',aes);
ci.start({'iv':'k5'});
ci.update(forge.util.createBuffer('i','utf8'));
ci.finish();
console.log(ci.output.toHex());
var ci=forge.cipher.createDecipher('AES-CBC',aes);
ci.start({'iv':'k5'});
ci.update(forge.util.createBuffer(forge.util.hexToBytes('7276131d61a323c37b5e451c3acc983e')));
ci.finish();
ci.output.toString('utf8')
//7276131d61a323c37b5e451c3acc983e
//"i"

// k9 kr k5 might as well just be me mashing the keyboard with my head btw

最佳答案

,您不能使用 AES 来替代 RSA,因为正如您已经指出的,AES key 必须共享。

如今,460 位 RSA key 无法提供(任何)安全性。只需一点 EC2 时间即可对其进行暴力破解。建议至少使用 2048 位 RSA key 。

由于您想要签署内容,因此可以使用基于椭圆曲线加密 (ECC) 的 ECDSA,它使您能够使用更小的 key 来实现类似的安全性 ( Some numbers )。 Forge 不提供 ECC support还没有。

SJCL提供 ECDSA 的实现

  • 添加 sjcl.js、core/bn.js、core/ecc.js
  • 生成 key var ecdsaKeys = sjcl.ecc.ecdsa.generateKeys(256);
  • ecdsaKeys.pub 提供 verify() function
  • ecdsaKeys.sec 提供 sign() function
  • 如果您需要发送公钥或 key ,则需要自行序列化。
<小时/>

如果您需要加密而不是签名,请使用 ElGamal 而不是 ECDSA。 SJCL 也提供了这一点。由于使用任何大小的 ElGamal key 都不可能加密 140 个字符,因此您需要选择 hybrid encryption与 AES。 SJCL 还提供了一些身份验证模式,例如 GCM 或 CCM。

关于javascript - forge.js 复制我用 rsa 所做的事情,但用 aes,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32193347/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com