Advertisement
Guest User

Untitled

a guest
Dec 11th, 2019
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.37 KB | None | 0 0
  1. from random import randint
  2.  
  3. def get_T(z,k):
  4. if k==10:
  5. return 3+5*z+10*z**2,3-5*z+10*z**2
  6. elif k==6:
  7. return 1+2*z,1-2*z
  8. def get_p(z,k):
  9. if k==10:
  10. return 25*z**4+25*z**3+25*z**2+10*z+3
  11. elif k==6:
  12. return 4*z**2+1
  13. def get_r(z,k):
  14. if k==10:
  15. return 25*z**4+25*z**3+15*z**2-5*z+1,25*z**4+25*z**3+15*z**2+5*z+1
  16. elif k==6:
  17. return 4*z**2-2*z+1,4*z**2+2*z+1
  18. def genParams(k):
  19. z = 2
  20. while True:
  21. p = get_p(z,k)
  22. if p in Primes():
  23. r1,r2 =get_r(z,k)
  24. if r1 in Primes():
  25. r = r1
  26. T,g = get_T(z,k)
  27. break
  28. elif r2 in Primes():
  29. r = r2
  30. g,T = get_T(z,k)
  31. break
  32. z = z + 1
  33. print "k = {}".format(k)
  34. print "z = {}".format(z)
  35. print "Trace T : {}".format(T)
  36. print "Char p = {}".format(p)
  37. print "Count of points r = {}".format(r)
  38. return z,r,T,p
  39. def gen_A(j,K):
  40. return K(3*j / (1728 - j))
  41. def gen_B(j,K):
  42. return K(2*j / (1728 - j))
  43. def genCurve(k):
  44. z,r,T,p = genParams(k)
  45. D = 4*p - T**2
  46. H = hilbert_class_polynomial(-D) #Получаем полином Гильберта
  47. K = GF(p)
  48. roots = H.roots(ring = K, multiplicities = False)
  49. if (roots == []):
  50. return '', ''
  51. print(roots)
  52. j = roots[0]
  53. print "j = {}".format(j)
  54.  
  55. A = gen_A(j,K)
  56. B = gen_B(j,K)
  57. E = EllipticCurve(K, [A,B])
  58. if E.order() != r:
  59. return '', '', 0
  60.  
  61. print "Nice. {}".format(E)
  62.  
  63. KK.<t> = GF(p**k)
  64. EK = EllipticCurve(KK, [A, B])
  65. if gcd(EK.order(), r**2) == 1:
  66. return '', '', 0
  67. print "Nice. {}".format(EK)
  68. return E, EK, r
  69.  
  70.  
  71. def genKRGroup(P, Q, r):
  72. table = []
  73. for i in range (1, r):
  74. row = []
  75. P_i = i*P
  76. for j in range (1, r):
  77. Q_j = j*Q
  78. row.append(P_i + Q_j)
  79. table.append(row)
  80. print 'P+Q {}'.format(table[0][0])
  81. print 'P+2Q {}'.format(table[0][1])
  82. print '2P+Q {}'.format(table[1][0])
  83. print '2P+2Q {}'.format(table[1][1])
  84. print 'P = {}\nQ = {}'.format(P,Q)
  85. return table
  86. def getWeil(EK, KRgroup, r):
  87. res = []
  88. S1 = KRgroup[randint(0, r - 2)][randint(0, r - 2)]
  89. S2 = KRgroup[randint(0, r - 2)][randint(0, r - 2)]
  90. T = KRgroup[randint(0, r - 2)][randint(0, r - 2)]
  91. S1_S2 = S1 + S2
  92. S1S2T = S1_S2.weil_pairing(T,r)
  93. S1T = S1.weil_pairing(T, r)
  94. S2T = S2.weil_pairing(T, r)
  95. resS1S2T = S1T*S2T
  96. if S1S2T == resS1S2T:
  97. res.append("+");
  98. else:
  99. res.append("-");
  100.  
  101. P_0 = EK([0, 1, 0])
  102. S1P = S1.weil_pairing(P_0,r)
  103. PS1 = P_0.weil_pairing(S1,r)
  104. if S1P == PS1 == 1:
  105. res.append("+");
  106. else:
  107. res.append("-");
  108.  
  109. TT = T.weil_pairing(T,r)
  110. if TT == 1:
  111. res.append("+");
  112. else:
  113. res.append("-");
  114. return res
  115.  
  116. def getTate(EK, KRgroup, r, k):
  117. res = []
  118. S1 = KRgroup[randint(0, r - 2)][randint(0, r - 2)]
  119. S2 = KRgroup[randint(0, r - 2)][randint(0, r - 2)]
  120. T = KRgroup[randint(0, r - 2)][randint(0, r - 2)]
  121. S1_S2 = S1 + S2
  122. S1S2T = S1_S2.tate_pairing(T,r,k)
  123. S1T = S1.tate_pairing(T,r,k)
  124. S2T = S2.tate_pairing(T,r,k)
  125. resS1S2T = S1T*S2T
  126. if S1S2T == resS1S2T:
  127. res.append("+");
  128. else:
  129. res.append("-");
  130.  
  131. P_0 = EK([0, 1, 0])
  132. S1P = S1.tate_pairing(P_0,r,k)
  133. PS1 = P_0.tate_pairing(S1,r,k)
  134. if S1P == PS1 == 1:
  135. res.append("+");
  136. else:
  137. res.append("-");
  138.  
  139. TT = T.tate_pairing(T,r,k)
  140. if TT == 1:
  141. res.append("+");
  142. else:
  143. res.append("-");
  144. return res
  145.  
  146. def calcHash(string, p):
  147. res = 0
  148. for i in string:
  149. res = res + ord(i)
  150. return res % p
  151.  
  152. def createEKP(string, EK):
  153. p = int(EK.base_field().characteristic())
  154. A = int(EK.a4())
  155. B = int(EK.a6())
  156. KT = GF(p)
  157. for i in range(2, p):
  158. h = calcHash(string, i)
  159. t = kronecker_symbol(h**3 + A*h + B, p)
  160. if t == 1:
  161. var('y')
  162. x = h
  163. E = x**3 + A*x + B == y**2
  164. y_res = E.roots(ring = KT, multiplicities = False)
  165. yr = y_res[randint(0, p) % len(y_res)]
  166. try:
  167. P = EK([h, yr])
  168. return P
  169. except:
  170. continue
  171. P0 = EK([0,1,0])
  172. return P0
  173.  
  174. def genSign(string, EK, KRgroup, r):
  175. M = createEKP(string, EK)
  176. a = randint(1, r - 1)
  177. sign = a * M
  178. P = KRgroup[randint(0, r - 2)][randint(0, r - 2)]
  179. T = a * P
  180. print 'M = {}'.format(M)
  181. print 'a = {}'.format(a)
  182. print 'a*M = {}'.format(sign)
  183. print 'Point from gr. kr. {}'.format(P)
  184. print 'a*P = {}'.format(T)
  185. return sign[0], P, T
  186.  
  187. def checkSign(string, EK, torsion_group, r, Xs, P, T):
  188. KT = GF(EK.base_field().characteristic())
  189. A = int(EK.a4())
  190. B = int(EK.a6())
  191. Ytau = KT(Xs**3 + A*Xs + B)
  192. Ytau = KT(sqrt(Ytau))
  193. try:
  194. T1 = EK([Xs, Ytau])
  195. except:
  196. Ytau = KT(-Ytau)
  197. T1 = EK([Xs, Ytau])
  198. M = createEKP(string, EK)
  199. print 'M = {}'.format(M)
  200. print 'T1 = {}'.format(T1)
  201. P1 = P.weil_pairing(T1, r)
  202. P2 = T.weil_pairing(M, r)
  203. if (P1 == P2) or (P1 == P2^(-1)):
  204. print 'Sign correct'
  205. else:
  206. print 'Sing incorrect'
  207.  
  208.  
  209. if __name__ == "__main__":
  210. k = 6
  211. E, EK, r = genCurve(k)
  212. if r == 0:
  213. print 'error: 1 step .GEN '
  214. P = EK([13,13,1])
  215. KT.<t> = GF(EK.base_field().characteristic()).extension(k)
  216. KT = EK.base_field()
  217. Q = EK([KT(10*t^3 + 6*t^2 + 15*t + 12), KT(8*t^5 + 12*t^4 + 3*t^3 + 4*t + 1), KT(1)])
  218. KR_group = genKRGroup(P, Q, r)
  219. res1 = getWeil(EK, KR_group, r)
  220. res2 = getTate(EK, KR_group, r, k)
  221. print("\t\tВейля\tТейта\t")
  222. print "Билин-ть\t {} \t {} \t".format(res1[0],res2[0])
  223. print "Знакоп-ть\t {} \t {} \t".format(res1[2],res2[2])
  224. print "Невырож.\t {} \t {} \t".format(res1[1],res2[1])
  225.  
  226. print 'Short sign'
  227. string = 'My life is pain'
  228. signn, P, T = genSign(string, EK, KR_group, r)
  229. print "SIGN : {}".format(signn)
  230. checkSign(string, EK, KR_group, r, signn, P, T)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement