如何像 Terra Station Wallet 生成的那样生成 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
最后是加密实用程序函数。 https://github.com/terra-money/station-mobile/blob/3ec15b9a620432dee47378f5b6e621d93780748a/src/utils/crypto.ts
这是所有 NodeJS/ReactNative 代码,因此您需要在 Python 中创建相同的 encrypt/decrypt、密码和存储流,如有必要。
Terra Station 的导入 'key' 实际上是一个 base64 编码的 JSON 对象,包含钱包名称、Terra 地址和私钥(进一步 AES 加密和 base64 编码)。这是一些 C# 来创建它(您需要使用助记符代码转换器网页之类的东西获取私钥)- 在顶部填写字符串变量:
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);
有谁知道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
最后是加密实用程序函数。 https://github.com/terra-money/station-mobile/blob/3ec15b9a620432dee47378f5b6e621d93780748a/src/utils/crypto.ts
这是所有 NodeJS/ReactNative 代码,因此您需要在 Python 中创建相同的 encrypt/decrypt、密码和存储流,如有必要。
Terra Station 的导入 'key' 实际上是一个 base64 编码的 JSON 对象,包含钱包名称、Terra 地址和私钥(进一步 AES 加密和 base64 编码)。这是一些 C# 来创建它(您需要使用助记符代码转换器网页之类的东西获取私钥)- 在顶部填写字符串变量:
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);