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),但我不喜欢密钥本身的长度和大小限制。
是否有其他更适合我使用的加密形式?
需要:
一个public键大约20个字符长
能够加密大约 140 个字符
与 RSA
相同或相似的功能
我一直在玩弄伪造的 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。
我正在使用 JavaScript 库 forge.js (https://github.com/digitalbazaar/forge)
rsa public如果 896 位长度的密钥允许我加密一段文本,但是,public密钥本身的长度对我的需要来说太长了。
如果我将它缩短为 460 位的密钥,那么密钥的长度几乎可以,但是,我只能加密一小部分。
我喜欢 RSA 的功能(encrypt/decrypt & sign/verify),但我不喜欢密钥本身的长度和大小限制。
是否有其他更适合我使用的加密形式?
需要:
一个public键大约20个字符长
能够加密大约 140 个字符
与 RSA
相同或相似的功能
我一直在玩弄伪造的 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()
functionecdsaKeys.sec
提供sign()
function- 如果需要发送public或者秘钥,需要自己序列化。
如果您需要加密而不是签名,请使用 ElGamal 而不是 ECDSA。 SJCL 还提供了这一点。由于无法使用任何大小的 ElGamal 密钥加密 140 个字符,因此您需要选择使用 AES 的 hybrid encryption。 SJCL 还提供了一些认证模式,如 GCM 或 CCM。