• 椭圆曲线加密


    椭圆曲线加密

    闲来无事,发现xctf网站更新了一个攻防世界的栏目,里边有很多ctf练习题,其中一个为椭圆曲线加密,原理上课老师都没讲。。。

    题目:easy_ECC
    题目来源: XUSTCTF2016
    题目描述:转眼两个人又走到了下一个谜题的地方,这又是一种经典的密码学加密方式 而你刚好没有这个的工具,你对小鱼说“小鱼我知道数学真的很重要了,有了工具只是方便我们使用 懂了原理才能做到,小鱼你教我一下这个缇努怎么做吧!”在小鱼的一步步带领下,你终于明白了ECC 的基本原理,成功的解开了这个题目,两个人相视一笑,快步走向了下一个题目所在的位置。flag格式为cyberpeace{x+y的值}
    
    已知椭圆曲线加密Ep(a,b)参数为
    
    p = 15424654874903
    
    a = 16546484
    
    b = 4548674875
    
    G(6478678675,5636379357093)
    
    私钥为
    
    k = 546768
    
    求公钥K(x,y)
    

    网上百度大神代码(有时间好好研究一下):

    import collections
    import random
    EllipticCurve = collections.namedtuple('EllipticCurve', 'name p a b g n h')
    curve = EllipticCurve(
       'secp256k1',
       # Field characteristic.
       p=int(input('p=')),
       # Curve coefficients.
       a=int(input('a=')),
       b=int(input('b=')),
       # Base point.
       g=(int(input('Gx=')),
          int(input('Gy='))),
       # Subgroup order.
       n=int(input('k=')),
       # Subgroup cofactor.
       h=1,
    )
    # Modular arithmetic ##########################################################
    def inverse_mod(k, p):
       """Returns the inverse of k modulo p.
      This function returns the only integer x such that (x * k) % p == 1.
      k must be non-zero and p must be a prime.
      """
       if k == 0:
           raise ZeroDivisionError('division by zero')
       if k < 0:
           # k ** -1 = p - (-k) ** -1 (mod p)
           return p - inverse_mod(-k, p)
       # Extended Euclidean algorithm.
       s, old_s = 0, 1
       t, old_t = 1, 0
       r, old_r = p, k
       while r != 0:
           quotient = old_r // r
           old_r, r = r, old_r - quotient * r
           old_s, s = s, old_s - quotient * s
           old_t, t = t, old_t - quotient * t
       gcd, x, y = old_r, old_s, old_t
       assert gcd == 1
       assert (k * x) % p == 1
       return x % p
    # Functions that work on curve points #########################################
    def is_on_curve(point):
       """Returns True if the given point lies on the elliptic curve."""
       if point is None:
           # None represents the point at infinity.
           return True
       x, y = point
       return (y * y - x * x * x - curve.a * x - curve.b) % curve.p == 0
    def point_neg(point):
       """Returns -point."""
       assert is_on_curve(point)
       if point is None:
           # -0 = 0
           return None
       x, y = point
       result = (x, -y % curve.p)
       assert is_on_curve(result)
       return result
    def point_add(point1, point2):
       """Returns the result of point1 + point2 according to the group law."""
       assert is_on_curve(point1)
       assert is_on_curve(point2)
       if point1 is None:
           # 0 + point2 = point2
           return point2
       if point2 is None:
           # point1 + 0 = point1
           return point1
       x1, y1 = point1
       x2, y2 = point2
       if x1 == x2 and y1 != y2:
           # point1 + (-point1) = 0
           return None
       if x1 == x2:
           # This is the case point1 == point2.
           m = (3 * x1 * x1 + curve.a) * inverse_mod(2 * y1, curve.p)
       else:
           # This is the case point1 != point2.
           m = (y1 - y2) * inverse_mod(x1 - x2, curve.p)
       x3 = m * m - x1 - x2
       y3 = y1 + m * (x3 - x1)
       result = (x3 % curve.p,
                 -y3 % curve.p)
       assert is_on_curve(result)
       return result
    def scalar_mult(k, point):
       """Returns k * point computed using the double and point_add algorithm."""
       assert is_on_curve(point)
       if k < 0:
           # k * point = -k * (-point)
           return scalar_mult(-k, point_neg(point))
       result = None
       addend = point
       while k:
           if k & 1:
               # Add.
               result = point_add(result, addend)
           # Double.
           addend = point_add(addend, addend)
           k >>= 1
       assert is_on_curve(result)
       return result
    # Keypair generation and ECDHE ################################################
    def make_keypair():
       """Generates a random private-public key pair."""
       private_key = curve.n
       public_key = scalar_mult(private_key, curve.g)
       return private_key, public_key
    private_key, public_key = make_keypair()
    print("private key:", hex(private_key))
    print("public key: (0x{:x}, 0x{:x})".format(*public_key))
    
  • 相关阅读:
    ecstore中kvstore之mongodb
    ecstore中kvstore之memcached
    ecostore搜索注意事项
    ecos的dbschema
    ecos的model
    ecos的mvcl
    ecos的app处理类
    ecos的app生命周期
    Linux系统的时间设置
    数的机器码表示——彻底弄清什么是原码、反码、补码、移码
  • 原文地址:https://www.cnblogs.com/anzerong2012/p/12071615.html
Copyright © 2020-2023  润新知