【问题标题】:Extract RSA private key from Cryptico.js从 Cryptico.js 中提取 RSA 私钥
【发布时间】:2014-12-23 17:08:46
【问题描述】:

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

publicKeyString(RsaKey)

这是:

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;
        }
    }
}

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

库文档: https://github.com/wwwtyro/cryptico

【问题讨论】:

    标签: javascript rsa cryptico


    【解决方案1】:

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

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

    使用 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(passphrase, bitlength) 生成了 RSA(私有)密钥?如果这是一个系统问题,那么您没有提供有关这是在浏览器还是在服务器上执行的任何详细信息。
    • 是的,我生成了密钥。这是在客户端执行的。但我想要一个链接,用于下载,用密钥(私有)指向一个变量。这是我仍在尝试开发的项目的一部分,这就是为什么我希望能够保存私钥,通过下载提供它。
    猜你喜欢
    • 2011-07-31
    • 1970-01-01
    • 1970-01-01
    • 2018-11-27
    • 2014-09-23
    • 2012-01-02
    • 1970-01-01
    • 2011-11-05
    相关资源
    最近更新 更多