Addresses

在 C# 中生成乙太坊地址

  • September 21, 2018

我按照此處的說明從頭開始生成有效的乙太坊地址。我正在使用 BouncyCastle 的 secp256k1 來執行 privkey –> pubkey,但我不知道在哪裡可以為 C# 正確實現 keccak 來執行最後一步 pubkey –> 地址。誰能幫我這個?

BouncyCastle KeccakDigest 返回的結果與針對同一 pubkey 的說明中的結果不同。

BouncyCastle KeccakDigest 似乎確實有效:https ://github.com/Nethereum/Nethereum/blob/master/src/Nethereum.Util/Sha3Keccack.cs

public byte[] CalculateHash(byte[] value)
       {
           var digest = new KeccakDigest(256);
           var output = new byte[digest.GetDigestSize()];
           digest.BlockUpdate(value, 0, value.Length);
           digest.DoFinal(output, 0);
           return output;
}

生成地址的完整過程可以通過https://github.com/Nethereum/Nethereum/blob/master/src/Nethereum.Signer/EthECKey.cs中的程式碼來理解,特別是

public string GetPublicAddress()
{
           var initaddr = new Sha3Keccack().CalculateHash(GetPubKeyNoPrefix());
           var addr = new byte[initaddr.Length - 12];
           Array.Copy(initaddr, 12, addr, 0, initaddr.Length - 12);
           return new AddressUtil().ConvertToChecksumAddress(addr.ToHex());
}

它通常很簡單:

  1. 生成隨機 32 字節(並使用 secp256k1lib 驗證它們是否是有效的私鑰)(記得使用安全隨機生成器
  2. 使用 secp256k1 操作(使用 secp256k1lib 或 Bouncy Castle)計算公鑰。
  3. 在公鑰的 64 字節上計算 Keccak 雜湊。
  4. 獲取 Keccak 雜湊的最後 20 個字節
  5. 地址的大小寫無關緊要,但如果您想遵守規則,那麼您可能需要查看EIP55

你可以查看 Nethermind 的實現——它使用 secp256k1lib 而不是 Bouncy Castle。

私鑰: https ://github.com/tkstanczak/nethermind/blob/master/src/Nethermind/Nethermind.Core/Crypto/PrivateKey.cs

請注意,在創建私鑰時,您希望確保它們已從記憶體中清除並且通常難以被攔截。Nethermind(和許多其他現有實現)尚未(截至 2018 年 9 月)以適當的安全性處理該問題,因此僅將其用作參考。

引用自:https://ethereum.stackexchange.com/questions/25208