加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

破解比特币secp256k1第一步,y^2=x^3+7 (mod p),已知x求y。用python语言编写。

(2017-12-04 12:11:48)
标签:

xwc

白币

币缘币

虚拟币

比特币

分类: 白币
    比特币的公钥分为非压缩公钥和压缩公钥。非压缩公钥由04+32位的x和32位的y组成。而压缩公钥由02+32位的x组成,或者03+32位的x组成。压缩公钥是不知道y值的。破解secp256k1,一定要知道y值的,那么如何根据x求y呢?可以通过如下方式求出来。
1.相关环境
本人测试环境:win10 64位
开发环境:VS2015 
python版本:3.5.2

2.代码示例:
※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※

#!/usr/bin/python
#coding=gbk
import math
def quick_algorithm(a,b,c):  #y=a^b%c,a的b次幂余除c
    a = a % c  
    ans = 1  
    #这里我们不需要考虑b<0,因为分数没有取模运算
    while b != 0:  #费马小定理
        if b & 1:  
            ans = (ans * a) % c  
        b>>=1  
        a = (a * a) % c  
    return ans  
def IsHaveMoSqrt(x,P):#是否有模平方根y*y=x mod p,已知x,p,判断是否存在y
    ret = quick_algorithm(x,(P-1)//2,P)
    if ret==1:
        return True
    else:
        return False
def GetMoSqrt(x,P):#求模平方根y*y=x mod p,已知x,p求y
    if(IsHaveMoSqrt(x,P)==1):
        t=0
        s=P-1#P-1=(2^t)*s //s是奇数
        while s%2==0:
            s=s//2
            t=t+1
        if(t==1):
            ret = quick_algorithm(x,(s+1)//2,P)
            return (ret,P-ret)
        elif (t>=2):
            x_=quick_algorithm(x,P-2,P)
            n=1
            while(IsHaveMoSqrt(n,P)==1):
                n=n+1
            b=quick_algorithm(n,s,P)
            print(b)
            ret = quick_algorithm(x,(s+1)//2,P)#t-1
            t_=0
            while(t-1>0):
                if(quick_algorithm(x_*ret*ret,2**(t-2),P)==1):
                    ret=ret
                else:
                    ret=ret*(b**(2**t_))%P
                t=t-1
                t_=t_+1
            return (ret,P-ret)
        else:
            return (-2,-2)
    else:
        return (-1,-1)
def Secp256k1GetYByX(x):#y^2=x^3+7 (mod p)根据x求y
     a=(x*x*x+7)%0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F
     ret = GetMoSqrt(a,0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F)
     return ret
if __name__ == "__main__":
    if True:
        x=0x79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798#私钥为1,对应的公钥x
        ret = Secp256k1GetYByX(x)#secp256k1,根据x求y
        print("x=%x" % (x))
        print("y=%x" % (ret[0]))
        print("y=%x" % (ret[1]))
        print("")
        x=1#x最小值
        ret = Secp256k1GetYByX(x)#secp256k1,根据x求y
        print("x=%x" % (x))
        print("y=%x" % (ret[0]))
        print("y=%x" % (ret[1]))
        print("")
        x=0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F-3#x最大值
        ret = Secp256k1GetYByX(x)#secp256k1,根据x求y
        print("x=%x" % (x))
        print("y=%x" % (ret[0]))
        print("y=%x" % (ret[1]))
        print("")
    input()

※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※
3.测试效果:

x=79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798
y=483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8
y=b7c52588d95c3b9aa25b0403f1eef75702e84bb7597aabe663b82f6f04ef2777

x=1
y=4218f20ae6c646b363db68605822fb14264ca8d2587fdd6fbc750d587e76a7ee
y=bde70df51939b94c9c24979fa7dd04ebd9b3572da7802290438af2a681895441

x=fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2c
y=e994b14ea72f8c3eb95c71ef692575e775058332d7e52d0995cf8038871b67d
y=f166b4eb158d073c146a38e1096da8a188afa7ccd281ad2f66a307fb778e45b2

这里是白币私钥:
WsBLkkXYyjXo4JsJULLQGS76py36yAJVhkNuBLu7Jy1622KNgrVW
免费赠送,先到先得。
如果觉得有用,就打赏点虚拟币给我,谢谢。
白币(XWC)打赏地址:WYkBw4qveiFGgkCJbKmz55SAK79qJwGrQv
比特币(BTC)打赏地址:1KckCJAiMnwbQLSSSWY7uJBfcgvrMsMJiZ
无限币(IFC)打赏地址:i66xPVPgZXWuAPPMbqh4q1fhJABUFwHi9q
狗狗币(DOGE)打赏地址:DJBF5UwQwuPJj72XsQi62cwDooyPLY1i2e

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有