繁体   English   中英

如何像 Terra Station 钱包一样生成 Terra 的私钥?

[英]How to generate Terra's private key like the one Terra Station Wallet produces?

有谁知道 Terra Station 钱包如何生成 364 个字符的私钥? 我正在寻找一种使用 terra-sdk 生成这个 364 个字符的私钥的方法,但是mk = MnemonicKey()mk.private_key的长度不是 364 个字符。

感谢任何帮助

你激发了我的好奇心。 我浏览了 Terra Station 代码(我选择了手机),看看他们是如何做到的。 我首先在 UI 中搜索“导出私钥”的位置; 它看起来是 AuthDataValueType 中的加密密钥字符串。

这是他们从密钥库中读取它的地方。 https://github.com/terra-money/station-mobile/blob/f74c4224986fd9ed32b4380b537e9ae13ca05c3e/src/utils/authData.ts#L15

这是他们为新恢复的钱包创建它的地方。 https://github.com/terra-money/station-mobile/blob/3ec15b9a620432dee47378f5b6e621d93780748a/src/utils/wallet.ts#L66

最后,这里是 encrypt util 函数。 https://github.com/terra-money/station-mobile/blob/3ec15b9a620432dee47378f5b6e621d93780748a/src/utils/crypto.ts

这都是 NodeJS/ReactNative 代码,因此如果需要,您需要在 Python 中创建相同的加密/解密、密码和存储流程。

Terra Station 的导入“密钥”实际上是一个 base64 编码的 JSON 对象,其中包含钱包名称、Terra 地址和私钥(进一步 AES 加密和 base64 编码)。 这是一些用于创建它的 C#(您需要使用 Mnemonic Code Converter 网页之类的东西来获取私钥) - 在顶部填写字符串变量:

        string privatekey = @"";  
        string walletName = @"";
        string address = @"";
        string password = @"changeme";

        byte[] salt = Encoding.UTF8.GetBytes("kopwemdmondawfwa");
        byte[] iv = Encoding.UTF8.GetBytes("dgfdkfsokwedopmf");
        int iterations = 100;
        int keySize = 256;

        var myRijndael = new RijndaelManaged();

        myRijndael.KeySize = keySize; 
        myRijndael.IV = iv;

        var rfc2898 = new Rfc2898DeriveBytes(System.Text.Encoding.UTF8.GetBytes(password), salt, iterations);
        byte[] key = rfc2898.GetBytes(keySize / 8);

        myRijndael.Key = key;
        myRijndael.Padding = PaddingMode.PKCS7;
        myRijndael.Mode = CipherMode.CBC;
        ICryptoTransform transform = myRijndael.CreateEncryptor();

        byte[] bak = new System.Text.UTF8Encoding().GetBytes(privatekey);
        byte[] encrypted = transform.TransformFinalBlock(bak, 0, bak.Length);

        string saltStr = BitConverter.ToString(salt).Replace("-", ""); 
        string ivStr = BitConverter.ToString(iv).Replace("-", "");  
        string cipherStr = System.Convert.ToBase64String(encrypted);

        string keyString = saltStr + ivStr + cipherStr;

        string res = "{ \"name\":\"" + walletName + "\",\"address\":\"" + address + "\",\"encrypted_key\":\"" + keyString + "\"}";
        byte[] resBytes = new System.Text.UTF8Encoding().GetBytes(res);
        string base64 = System.Convert.ToBase64String(resBytes);

        File.WriteAllText(@"c:\temp\ts_exported_key.txt", base64);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM