Javascript Forge Crypto Library:重新创建公钥和私钥,以便以后重用

Pau*_*ker 6 javascript cryptography

在Forge Javascript Cryptography Library中,我很难确定在使用私钥和公钥后如何重建私钥和公钥.我尝试过以下方法:

var rsa = forge.pki.rsa;
var keypair = rsa.generateKeyPair({bits: 2048, e: 0x10001});
var ct = keypair.publicKey.encrypt("Arbitrary Message Here");
keypair.privateKey.decrypt(ct);
Run Code Online (Sandbox Code Playgroud)

哪些产出:"Arbitrary Message Here"如预期的那样.我试图以这种方式重建公钥:

var nVal = JSON.stringify(keypair.publicKey.n);
var eVal = JSON.stringify(keypair.publicKey.e);
var nwRsa = rsa.setPublicKey(JSON.parse(nHere), JSON.parse(eHere));
var nwCt = nwRsa.encrypt("Arbitrary Message Here"); 
Run Code Online (Sandbox Code Playgroud)

当我再次尝试加密邮件时,出现错误:

"TypeError: Object #<Object> has no method 'bitLength'"
Run Code Online (Sandbox Code Playgroud)

我不确定为什么,因为我相信我已经正确使用了这个方法:

/**
 * Sets an RSA public key from BigIntegers modulus and exponent.
 *
 * @param n the modulus.
 * @param e the exponent.
 *
 * @return the public key.
 */
pki.setRsaPublicKey = pki.rsa.setPublicKey = function(n, e) {
  var key = {
    n: n,
    e: e
  };
Run Code Online (Sandbox Code Playgroud)

我还没有尝试过重建私钥.我不确定我做得不对,有人可以帮帮我吗?一如既往地感谢!

额外的Afterthough:这里是我在html页面中导入的文件,我相信我已经解决了所有依赖性问题,但我以防万一(请注意,它们不是按字母顺序排列,而是依赖顺序):

<script src="forge/util.js"></script>
<script src="forge/debug.js"></script>
<script src="forge/jsbn.js"></script>
<script src="forge/oids.js"></script>
<script src="forge/asn1.js"></script>
<script src="forge/sha1.js"></script>
<script src="forge/sha256.js"></script>
<script src="forge/md5.js"></script>
<script src="forge/md.js"></script> 
<script src="forge/aes.js"></script>
<script src="forge/prng.js"></script>
<script src="forge/random.js"></script>
<script src="forge/jsbn.js"></script> 
<script src="forge/pkcs1.js"></script>
<script src="forge/rsa.js"></script>

<script src="forge/des.js"></script>
<script src="forge/rc2.js"></script>
<script src="forge/pbe.js"></script>
<script src="forge/pem.js"></script>
<script src="forge/hmac.js"></script>
<script src="forge/pbkdf2.js"></script>
<script src="forge/pkcs7asn1.js"></script>
<script src="forge/pkcs12.js"></script>
<script src="forge/pss.js"></script>
<script src="forge/mgf1.js"></script>
<script src="forge/mgf.js"></script>
<script src="forge/x509.js"></script>
<script src="forge/pki.js"></script>
Run Code Online (Sandbox Code Playgroud)

TL; DR:在Forge中,如何将其公钥提供给其他人,以及如何将其私钥存储多次使用?

Pau*_*ker 12

我很幸运,通过在Github上提出问题与开发人员取得联系.他给了我正确的使用方法,它们似乎都有效.直接引用,这是正确的用法:

传输公钥或存储私钥的最简单,最兼容的方法是将它们转换为PEM格式.在转换私钥时,可以选择加密私钥(通过使用不同的方法,见下文).

将公钥转换为PEM或从PEM转换:

// convert a Forge public key to PEM-format
var pem = pki.publicKeyToPem(publicKey);

// convert a PEM-formatted public key to a Forge public key
var publicKey = pki.publicKeyFromPem(pem); Converting a private key to/from PEM:

// convert a Forge private key to PEM-format
// (preferred method if you don't want encryption)
var pem = pki.privateKeyToPem(privateKey);

// wraps and encrypts a Forge private key and outputs it in PEM format
// (preferred method if you do want encryption)
var pem = pki.encryptRsaPrivateKey(privateKey, 'password');

// encrypts a Forge private key and outputs it in PEM format using OpenSSL's
// proprietary legacy format + encapsulated PEM headers (DEK-Info)
// (perhaps more compatible with some legacy OpenSSL-based applications)
var pem = pki.encryptRsaPrivateKey(privateKey, 'password', {legacy: true});

// decrypts a PEM-formatted, encrypted private key
var privateKey = pki.decryptRsaPrivateKey(pem, 'password');
Run Code Online (Sandbox Code Playgroud)