Javascript 从Cryptico.js中提取RSA私钥

Javascript 从Cryptico.js中提取RSA私钥,javascript,rsa,cryptico,Javascript,Rsa,Cryptico,我相信这是一个非常基本的问题,但我正在开始研究JavaScript和RSA,所以我有点迷茫。我刚刚下载了Cryptico库,它为我提供了一个易于使用的RSA密钥gen/加密/解密。只需使用以下命令,即可轻松提取生成的RSA密钥的公共部分: publicKeyString(RSKey) 即: my.publicKeyString = function(rsakey) { pubkey = my.b16to64(rsakey.n.toString(16)); return pubk

我相信这是一个非常基本的问题,但我正在开始研究JavaScript和RSA,所以我有点迷茫。我刚刚下载了Cryptico库,它为我提供了一个易于使用的RSA密钥gen/加密/解密。只需使用以下命令,即可轻松提取生成的RSA密钥的公共部分:

publicKeyString(RSKey)

即:

my.publicKeyString = function(rsakey) 
{
    pubkey = my.b16to64(rsakey.n.toString(16));
    return pubkey; 
}
在函数中生成密钥时定义rsakey.n:

function RSAGenerate(B, E)
{
    var rng = new SeededRandom();
    var qs = B >> 1;
    this.e = parseInt(E, 16);
    var ee = new BigInteger(E, 16);
    for (;;)
    {
        for (;;)
        {
            this.p = new BigInteger(B - qs, 1, rng);
            if (this.p.subtract(BigInteger.ONE).gcd(ee).compareTo(BigInteger.ONE) == 0 && this.p.isProbablePrime(10)) break;
        }
        for (;;)
        {
            this.q = new BigInteger(qs, 1, rng);
            if (this.q.subtract(BigInteger.ONE).gcd(ee).compareTo(BigInteger.ONE) == 0 && this.q.isProbablePrime(10)) break;
        }
        if (this.p.compareTo(this.q) <= 0)
        {
            var t = this.p;
            this.p = this.q;
            this.q = t;
        }
        var p1 = this.p.subtract(BigInteger.ONE);
        var q1 = this.q.subtract(BigInteger.ONE);
        var phi = p1.multiply(q1);
        if (phi.gcd(ee).compareTo(BigInteger.ONE) == 0)
        {
            this.n = this.p.multiply(this.q);
            this.d = ee.modInverse(phi);
            this.dmp1 = this.d.mod(p1);
            this.dmq1 = this.d.mod(q1);
            this.coeff = this.q.modInverse(this.p);
            break;
        }
    }
}
函数生成(B,E)
{
var rng=新的seedrandom();
var qs=B>>1;
this.e=parseInt(e,16);
var ee=新的大整数(E,16);
对于(;;)
{
对于(;;)
{
p=新的大整数(B-qs,1,rng);
如果(this.p.subtract(biginger.ONE).gcd(ee).compareTo(biginger.ONE)==0&&this.p.isProbablePrime(10))中断;
}
对于(;;)
{
这个.q=新的大整数(qs,1,rng);
if(this.q.subtract(biginger.ONE).gcd(ee).compareTo(biginger.ONE)==0&&this.q.isProbablePrime(10))中断;
}

如果(this.p.compareTo(this.q)RSA的定义方式是,公钥中包含的值构成私钥中包含的值的子集。因此,您的私钥已经是
rsakey
。在公钥和私钥值完全不同的情况下,其他公钥方案的工作方式不同

此外,
rsakey.n
没有完全定义公钥。您至少需要公钥指数
e
。但由于它通常被简单地设置为65537。它是
RSAGenerate
中的
e
。在这种情况下被忽略

使用Tom Wu的RSA密钥生成器生成(种子)随机RSA密钥,其中3作为硬编码的公共指数

您可以选择与公钥类似的私钥编码,但由于它必须包含多个值,因此我选择了JSON序列化:

(function(c){
    var parametersBigint = ["n", "d", "p", "q", "dmp1", "dmq1", "coeff"];

    c.privateKeyString = function(rsakey) {
        var keyObj = {};
        parametersBigint.forEach(function(parameter){
            keyObj[parameter] = c.b16to64(rsakey[parameter].toString(16));
        });
        // e is 3 implicitly
        return JSON.stringify(keyObj);
    }
    c.privateKeyFromString = function(string) {
        var keyObj = JSON.parse(string);
        var rsa = new RSAKey();
        parametersBigint.forEach(function(parameter){
            rsa[parameter] = parseBigInt(c.b64to16(keyObj[parameter].split("|")[0]), 16);
        });
        rsa.e = parseInt("03", 16);
        return rsa
    }
})(cryptico)

RSA的定义方式是,公钥中包含的值构成私钥中包含的值的子集。因此,您的私钥已经是
rsakey
。在公钥和私钥值完全不同的情况下,其他公钥方案的工作方式不同

此外,
rsakey.n
没有完全定义公钥。您至少需要公钥指数
e
。但由于它通常被简单地设置为65537。它是
RSAGenerate
中的
e
。在这种情况下被忽略

使用Tom Wu的RSA密钥生成器生成(种子)随机RSA密钥,其中3作为硬编码的公共指数

您可以选择与公钥类似的私钥编码,但由于它必须包含多个值,因此我选择了JSON序列化:

(function(c){
    var parametersBigint = ["n", "d", "p", "q", "dmp1", "dmq1", "coeff"];

    c.privateKeyString = function(rsakey) {
        var keyObj = {};
        parametersBigint.forEach(function(parameter){
            keyObj[parameter] = c.b16to64(rsakey[parameter].toString(16));
        });
        // e is 3 implicitly
        return JSON.stringify(keyObj);
    }
    c.privateKeyFromString = function(string) {
        var keyObj = JSON.parse(string);
        var rsa = new RSAKey();
        parametersBigint.forEach(function(parameter){
            rsa[parameter] = parseBigInt(c.b64to16(keyObj[parameter].split("|")[0]), 16);
        });
        rsa.e = parseInt("03", 16);
        return rsa
    }
})(cryptico)

谢谢你的回答。那么,你有没有办法查看或保存整个对象“rsakey”?因为当我保存时,我只看到[object object]…正如我所说,为了以后使用同一个密钥进行加密/解密,我需要以某种方式保存它。我添加了私钥序列化谢谢。但我仍然没有成功完成这项工作。现在我感到有点羞愧,因为你做了一件大事,而我仍然不知道如何做这项工作。我所需要的是保存密钥供以后使用,因为我没有以某种方式保存和加密/解密的密钥(至少是私有的),你得到了我吗?没有,我没有得到你。所以你用
cryptico.generateRSAKey(密码短语,位长度)生成了RSA(私有)密钥
?如果这是一个系统问题,那么您没有提供关于这是在浏览器还是在服务器上执行的任何详细信息。是的,我生成了密钥。这是在客户端执行的。但是我想有一个链接,用于下载,用密钥(private)指向一个变量。这是我仍在努力开发的项目的一部分,这就是为什么我希望能够保存私钥,通过下载提供。谢谢你的回答。那么,你有没有办法查看或保存整个对象“rsakey”?因为保存时我只看到[对象对象]…正如我所说,为了以后使用同一个密钥进行加密/解密,我需要以某种方式保存它。我添加了私钥序列化谢谢。但我仍然没有成功完成这项工作。现在我感到有点羞愧,因为你做了一件大事,而我仍然不知道如何做这项工作。我所需要的是保存密钥供以后使用,因为我没有以某种方式保存和加密/解密的密钥(至少是私有的),你得到了我吗?没有,我没有得到你。所以你用
cryptico.generateRSAKey(密码短语,位长度)生成了RSA(私有)密钥
?如果这是一个系统问题,那么您没有提供关于这是在浏览器还是在服务器上执行的任何详细信息。是的,我生成了密钥。这是在客户端执行的。但是我想有一个链接,用于下载,用密钥(private)指向一个变量.这是我仍在努力开发的项目的一部分,这就是为什么我希望能够保存私钥,通过下载提供私钥。