forge.js 复制我用 rsa 但用 aes 做的事情

forge.js Replicate what I do with rsa but with aes

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

rsa public如果 896 位长度的密钥允许我加密一段文本,但是,public密钥本身的长度对我的需要来说太长了。

如果我将它缩短为 460 位的密钥,那么密钥的长度几乎可以,但是,我只能加密一小部分。

我喜欢 RSA 的功能(encrypt/decrypt & sign/verify),但我不喜欢密钥本身的长度和大小限制。

是否有其他更适合我使用的加密形式?

需要:

我一直在玩弄伪造的 AES,但看起来加密是一种共享的东西——你有一个密钥(共享的?)。然后你可以创建一个密码和解密。但我不明白这将如何与 rsa 相似;使用 rsa,我可以共享我的 public 密钥并安全地签名和解密,但我不知道如何根据我目前对 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){} 进行解密和验证,以防我们发送给不同用户的消息 publicKey。

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

//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 密钥。

如今,460 位 RSA 密钥不提供(任何)安全性。它可以用一点点 EC2 时间来暴力破解。建议至少使用 2048 位 RSA 密钥。

既然您想签署东西,您可以使用基于椭圆曲线密码术 (ECC) 的 ECDSA,它使您能够使用更小的密钥来实现类似的安全性(Some numbers). Forge doesn't provide ECC support 还。

SJCL 提供了 ECDSA

的实现
  • 添加sjcl.js、core/bn.js、core/ecc.js
  • 生成密钥var ecdsaKeys = sjcl.ecc.ecdsa.generateKeys(256);
  • ecdsaKeys.pub 提供 verify() function
  • ecdsaKeys.sec 提供 sign() function
  • 如果需要发送public或者秘钥,需要自己序列化。

如果您需要加密而不是签名,请使用 ElGamal 而不是 ECDSA。 SJCL 还提供了这一点。由于无法使用任何大小的 ElGamal 密钥加密 140 个字符,因此您需要选择使用 AES 的 hybrid encryption。 SJCL 还提供了一些认证模式,如 GCM 或 CCM。