我的一个朋友丢失了 BitGo 帐户的密码。她的“钥匙卡”包含她的私钥(出于安全原因,实际信息已编辑):
用户密钥: {“iv”:“IDMkr...UH4g0TBCofAcIg”,“v”:1,“iter”:10000,“ks”:256,“ts”:64,“模式”:“ccm”,“adata”:“ ","密码":"aes","盐":"lI8k...vhX0","ct":"Kf...LOmgbn67w2CRYBhcXtX 0wdPF3D7ThCKaeZhTymin9hcMD5eL...AosmmvfA8npiDIHWgvdbHAk"}
很明显,“ct”(密文)是使用 AES 256 CCM 加密的。我找到了一个模块(https://github.com/spark/node-aes-ccm)可以帮助我解密私钥(“ct”),但该模块的文档不是很有帮助:
decrypt(key, iv, ciphertext, aad, auth_tag)
key, iv, plaintext, aad, and auth_tag are all Buffer objects. decrypt will return an object like the following:
{
plaintext: Buffer,
auth_ok: Boolean
}
所以除了参数是缓冲区之外,没有对它们的描述......但是,除了密钥之外,似乎我已经得到了我需要的一切。通过阅读相关模块的文档(https://github.com/xorbit/node-aes-gcm):
key 是一个 16、24 或 32 字节的 Buffer 对象,包含所使用的 AES 密钥 用于加密
我认为这是加密私钥的密钥,但是我从哪里可以获得它以及它与丢失的密码有何关系?
非常感谢任何帮助
* 附录一 *
我的朋友找到了密码,所以按照下面本的建议,我想尝试一下。代码很简单:
var sjcl = require('sjcl-all');
var s = sjcl.decrypt("ThePassword", {
"iv":"IDMkrTa5UH4g0TBCofAcIg",
"v":"1",
"iter":"10000",
"ks":"256",
"ts":"64",
"mode":"ccm",
"adata":"",
"cipher":"aes",
"salt":"lI8kABgvhX0",
"ct":"KfJUrLOmgbn67w2CRYBhcXtX0wdPF3D7ThCKaeZhTymin9hcMD5eLHIUAosmmvfA8npiDIHWgvdbHAk"
}
);
console.log(s);
但是当我运行它时,它会呕吐,但有以下例外:
/用户/ekkis/开发/解密/node_modules/sjcl-all/sjcl.js:66 c="{",d="";for(b 中 a)if(a.hasOwnProperty(b))switch(b.match(/^[a-z0-9]+$/i)||p(新 sjcl.exception.invalid("json 编码:无效属性 名称")),c+=d+'"'+b+'":',d=",",typeof a[b]){case "数字":case “布尔值”:c+=a[b];break;case "字符串":c+='"'+escape(a[b])+'"';break;case “对象”:c+='"'+sjcl.codec.base64.fromBits(a[b],0)+'"';break;default:p(new sjcl.exception.bug("json 编码: 不支持的类型"))}return c+"}"},decode:function(a){a=a.replace(/\s/g,"");a.match(/^{.*}$/)||p(new sjcl.exception.invalid("json 解码:这不是 json!"));
TypeError:a.replace 不是函数 在 Object.decode (/Users/ekkis/Development/decrypt/node_modules/sjcl-all/sjcl.js:66:438) 在 Object.decrypt (/Users/ekkis/Development/decrypt/node_modules/sjcl-all/sjcl.js:65:473) 在对象。 (/Users/ekkis/Development/decrypt/buff.js:3:14) 在 Module._compile (module.js:571:32) 在 Object.Module._extensions..js (module.js:580:10) 在 Module.load (module.js:488:32) 在 tryModuleLoad (module.js:447:12) 在 Function.Module._load (module.js:439:3) 在 Module.runMain (module.js:605:10) 运行时 (bootstrap_node.js:425:7)
所以它抱怨 json 不是 json。但对我来说看起来不错!非常感谢任何帮助
此加密的 JSON blob 由 SJCL 库生成 (https://www.npmjs.com/package/sjcl)。将使用 sjcl.decrypt("password", json_blob) 完成解密。但是,如果您的朋友尚未接触过 BitGo [bitgo.com 的支持],我首先推荐该路线。
你直接传递了一个json对象。您需要做的是传递一个 JSON 字符串,例如:
let a = '{“iv”:“IDMkrTa5UH4g0TBCofAcIg”,“v”:“1”,“iter”:“10000”,“ks”:“256”,“ts”:“64”,“模式”: “ccm”,“adata”:“”,“密码”:“aes”,“盐”:“lI8kABgvhX0”,“ct”:“KfJUrLOmgbn67w2CRYBhcXtX0wdPF3D7ThCKaeZhTymin9hcMD5eLHIUAosmmvfA8npiDIHWgvdbHAk”}'
var s = sjcl.decrypt("密码",a);