首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从Cryptico.js中提取RSA私钥

从Cryptico.js中提取RSA私钥
EN

Stack Overflow用户
提问于 2014-12-23 17:08:46
回答 1查看 2.5K关注 0票数 1

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

publicKeyString(RsaKey)

即:

代码语言:javascript
复制
my.publicKeyString = function(rsakey) 
{
    pubkey = my.b16to64(rsakey.n.toString(16));
    return pubkey; 
}

在生成函数中的键时定义了rsakey.n:

代码语言:javascript
复制
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;
        }
    }
}

但是密钥的私有部分,我只是不知道如何提取,所以我将能够保存公共/私钥部分,并可供以后使用。

图书馆文档:https://github.com/wwwtyro/cryptico

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-12-23 17:34:42

RSA的定义是这样的:公钥中包含的值构成私钥中包含的值的子集。所以你的私钥已经是rsakey了。在公钥和私钥值完全不同的情况下,其他公钥方案的工作方式不同。

此外,rsakey.n没有完全定义公钥。你至少需要公共指数e。它通常被简单地设置为65537,所以如果您不需要更改密钥或升级方案,这可能是硬编码的。这是E in RSAGenerate。在本例中,它被忽略,因为

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

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

代码语言:javascript
复制
(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)
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27624935

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档