问题 基于密码在javascript中生成RSA密钥对


据我所知,RSA密钥通常是基于(强)随机生成器生成的。

相反,我想基于密码创建它们。

或者更确切地说是它的哈希值,例如sha512(sha512(密码+盐)+密码+胡椒)

这需要在JavaScript中以客户端方式完成。

谁会知道怎么做?是否有一个简单的JavaScript库,可以根据给定的输入确定性地创建RSA密钥对?

(实际上,我提到了RSA,但任何安全的非对称加密就足够了,我只需要公私加密)


另外:我需要这个,因为我正在构建一些安全的通信解决方案,不需要依赖连接甚至服务器来保证安全。

我正在使用随机密钥使用AES加密所有内容,并且密钥是RSA加密的。这个想法是Alice可以使用Bob的公钥对其内容(或实际上是她的内容的AES密钥)进行RSA加密(因此Bob的公钥必须在线存储)。

之后,当Bob再次输入密码时,他的浏览器可以在现场确定性地计算他的RSA私钥和公钥,从Alice下载内容,并使用他的私钥在本地解密。


1435
2018-06-22 12:35


起源

使用JavaScript创建RSA密钥?我记得自己尝试过。它吃掉了我所有的记忆并且永远地计算了。然后我切换到Java。 - Amberlamps
除RSA之外的非对称加密方案也可以。但我需要生成密钥客户端,并在发送之前加密数据(使用私钥)。公钥将存储在服务器端。我不知道ECC方法是否更快? - Sheldon Pinkman
@SheldonPinkman加密是使用公钥完成的,而不是私有的。你的想法往往是有缺陷的。 - Eugene Mayevski 'Allied Bits
@Eugene:对不起你是对的,我的意思是用公钥加密,我在线存储公钥+加密内容。用户实际上会使用彼此的公钥加密内容。 - Sheldon Pinkman
请注意关于在javascript中执行加密的警告 - > stackoverflow.com/a/10553576/993133 - pd40


答案:


好像 Cryptico 当您提供密码作为RNG的种子时,可以帮助您。


9
2018-06-23 12:03



太棒了,看起来很完美! - Sheldon Pinkman
链接不起作用。 - Akam
@akam链接更新了,谢谢。 - Eugene Mayevski 'Allied Bits


RSA密钥不仅像大多数对称算法一样是随机位,它们是从大素数导出的指数和模数。因此,我没有看到任何合理的方法可以从密码生成它们。看到 这篇维基百科文章

你用这些密钥对做什么用的?为什么它们必须来自密码?如果要使用密码加密某些内容,可以使用SHA256(密码)来获取AES256密钥。 (一定要仔细阅读 关键加强 如果你打算这样做)。


2
2018-06-22 15:06



你可以用密码初始化随机数发生器,并通过这种方式获得“依赖”密码的密钥。但通常没有实际的理由这样做(我知道一个案例虽然它是合理的:)。 - Eugene Mayevski 'Allied Bits
好吧,我认为缺乏RNG将是一个很好的原因。但我觉得整个方案有一些严重的设计缺陷。 - Maarten Bodewes
@Petey:我知道RSA密钥不仅仅是随机位,而且我可以简单地用随机密码生成的东西替换随机生成器(无论它出现在现有的RSA密钥生成器中)。它甚至可以是一个随机生成器,只需使用密码的哈希值。这样,相同的密码将产生完全相同的RSA密钥。 - Sheldon Pinkman


我不能评论我的标点符号,但除了他所说的+ Eugene_Mayevski_'EldoS之外

对于javascript纯: https://www.npmjs.com/package/cryptico

对于nodejs: https://www.npmjs.com/package/cryptico 你需要:

npm install cryptico

并添加此行:

var cryptico = require("cryptico");

创建对象:

function cryptoObj(passPhrase)
{
   this.bits = 1024; //2048;
   this.passPhrase = passPhrase;
   this.rsaKey = cryptico.generateRSAKey(this.passPhrase,this.bits);
   this.rsaPublicKey = cryptico.publicKeyString(this.rsaKey);

   this.encrypt = function(message){
     var result = cryptico.encrypt(message,this.rsaPublicKey);
     return result.cipher;
   };

   this.decrypt = function(message){
     var result = cryptico.decrypt(message, this.rsaKey);
     return result.plaintext;
   };
}

console.log('---------------------------------------------------------');
var localEncryptor = new cryptoObj("XXyour secret txt or number hereXX");

var encryptedMessage = localEncryptor.encrypt('new message or json code here');
var decryptedMessage = localEncryptor.decrypt(encryptedMessage);

console.log('');
console.log('>>> Encrypted Message: '+encryptedMessage);
console.log('');
console.log('>>> Decrypted Message: '+decryptedMessage);

2
2018-02-08 00:45



当我使用var cryptico = require(“cryptico”);在我的component.ts中我收到错误-----“(SystemJS)XHR错误(404 Not Found)loading 本地主机:5555 / node_modules / crypto.js”;。 - Khushi