首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NBitcoin生成与等于1和256的私钥相对应的重复比特币地址

NBitcoin生成与等于1和256的私钥相对应的重复比特币地址
EN

Stack Overflow用户
提问于 2021-03-19 00:01:34
回答 1查看 112关注 0票数 0

我正在用NBitcoin Nuget开发一个解决方案,突然我发现它为一些等于1和256的私钥生成了重复的地址……我用来生成比特币地址的代码如下:

_bitcoin_address=_private_key.PubKey.GetAddress(ScriptPubKeyType.Legacy, Network.Main).ToString();

当生成_private_key=1或_private_key=512相同的地址如1BgGZ9tcN4rm9KBzDn7KprQz87SZ26SAMH时,_private_key=4或_private_key=256也会出现同样的问题。

这是一个bug,还是我犯了一个错误?

您可以使用以下代码作为POC:

代码语言:javascript
复制
using System;
using System.Collections.Generic;
using System.Linq;
using System.Numerics;
using System.Text;
using System.Threading.Tasks;
using NBitcoin;

namespace Bitcoin_address_generation
{
    class Program
    {
        static void Main(string[] args)
        {
            //generating a private key that is equal to 1
            byte[] _priv_bytes1 = IntegerToBytes(1, 32);

            Key _private_key1 = new Key();
            _private_key1.FromBytes(_priv_bytes1);


            //generating a private key that is equal to 256
            byte[] _priv_bytes256 = IntegerToBytes(256, 32);

            Key _private_key256 = new Key();
            _private_key256.FromBytes(_priv_bytes1);

            Console.WriteLine(_private_key1.PubKey.GetAddress(ScriptPubKeyType.Legacy, Network.Main).ToString());

            Console.WriteLine(_private_key256.PubKey.GetAddress(ScriptPubKeyType.Legacy, Network.Main).ToString());
            Console.ReadKey();

        }

        /// <summary>
        /// convert a big integer to byte array
        /// </summary>
        /// <param name="s"></param>
        /// <param name="qLength"></param>
        /// <returns></returns>
        public static byte[] IntegerToBytes(BigInteger s, int qLength)
        {
            byte[] bytes = s.ToByteArray();

            if (qLength < bytes.Length)
            {
                byte[] tmp = new byte[qLength];

                Array.Copy(bytes, bytes.Length - tmp.Length, tmp, 0, tmp.Length);

                return tmp;
            }

            if (qLength > bytes.Length)
            {
                byte[] tmp = new byte[qLength];

                Array.Copy(bytes, 0, tmp, tmp.Length - bytes.Length, bytes.Length);

                return tmp;
            }

            return bytes;
        }
    }
}
EN

回答 1

Stack Overflow用户

发布于 2021-03-24 22:30:39

在一些问题/答案之后,我发现NBitcoin没有任何错误,但下面的函数是有问题的:

代码语言:javascript
复制
public static byte[] IntegerToBytes(BigInteger s, int qLength)
{
    byte[] bytes = s.ToByteArray();

    if (qLength < bytes.Length)
    {
        byte[] tmp = new byte[qLength];

        Array.Copy(bytes, bytes.Length - tmp.Length, tmp, 0, tmp.Length);

        return tmp;
    }

    if (qLength > bytes.Length)
    {
        byte[] tmp = new byte[qLength];

        Array.Copy(bytes, 0, tmp, tmp.Length - bytes.Length, bytes.Length);

        return tmp;
    }

    return bytes;
}

修正后的函数必须如下所示:

代码语言:javascript
复制
/// <summary>
/// convert a big integer to byte array
/// </summary>
/// <param name="s"></param>
/// <param name="qLength"></param>
/// <returns></returns>
public static byte[] convert_integer_to_byte(BigInteger _input, int qlength)
{
    byte[] _temp_byte = _input.ToByteArray();
    _temp_byte.Reverse();
    byte[] _result_byte;
    if (_temp_byte.Length < qlength)
    {
        _result_byte = new byte[qlength];
        _temp_byte.Reverse();
        _temp_byte.CopyTo(_result_byte, 0);
    }
    else
    {
        _result_byte = new byte[qlength];
        _temp_byte.CopyTo(_result_byte, 0);
    }
    //_result_byte.Reverse();
    return _result_byte;
}

最后,感谢Lucas OntiveroDan Gershony,他们帮助我发现并解决了问题。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66694686

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档