fork download
  1. def extended_gcd(aa, bb):
  2. lastremainder, remainder = abs(aa), abs(bb)
  3. x, lastx, y, lasty = 0, 1, 1, 0
  4. while remainder:
  5. lastremainder, (quotient, remainder) = remainder, divmod(lastremainder, remainder)
  6. x, lastx = lastx - quotient*x, x
  7. y, lasty = lasty - quotient*y, y
  8. return lastremainder, lastx * (-1 if aa < 0 else 1), lasty * (-1 if bb < 0 else 1)
  9.  
  10. def modinv(a, m):
  11. g, x, y = extended_gcd(a, m)
  12. if g != 1:
  13. raise ValueError
  14. return x % m
  15. N = 0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141
  16. # ввод первых данных
  17. R = 0x0056b6c0b4c19ee6978ff662aad1257dd2c74b21ba7a85c563a8ea7f3d492f2d74
  18. S = 0x002eda98beedff7c75c9a3a19c2fd051ed9c6c8c6f500332ffed62b57e793cdf8a
  19. Z = 0x0020a998e0382becbcc7055797c9787e42f1710664d9fd51c64d238162cc0b7843
  20. X = 0x007b08b8bc5bb1d914c55cd4ff56fa96b9d356040b2da11338199fb8594991e631
  21. K = 0x0055550dce6743f5eae4f740512b66ec680156b7e9b4138beee23cbcf6a93299ea
  22. # ввод вторых данных
  23. R5 = 0x000f18c2d1fe6513b90f44513e975e05cc498e7f5a565b46c65b1d448734392c6f
  24. S5 = 0x0000917766d14f2e9933eb269c83b3ad440ed8432da8beb5733f34046509e48b1d85
  25. Z5 = 0x000d9dd44880b58f3e12c66978fc4651f20442a0b47731f6bcc9af594a67dcfb7e
  26. #X5 = 0x008b184d0143d89f76c342cbd9ffa96329ece0e854e6416fd1f58230b90f007ba0
  27. #K5 = 0x0062d1da6649ce56f9ba56be11f9c38e7ff725888f31eeb4c9cf3e6ca382282e5d
  28.  
  29. # получаем ключ X11
  30. R111 = ((((S * K) - Z) * modinv(X,N)) % N)
  31. R11 = hex((((S * K) - Z) * modinv(X,N)) % N)
  32. S111 = (((Z + (X * R)) * modinv(K,N)) % N)
  33. S11 = hex(((Z + (X * R)) * modinv(K,N)) % N)
  34. Z111 = (((S * K) - (X * R)) % N)
  35. Z11 = hex(((S * K) - (X * R)) % N)
  36. X111 = ((((S * K) - Z) * modinv(R,N)) % N)
  37. X11 = hex((((S * K) - Z) * modinv(R,N)) % N)
  38. K111 = (((Z + (X * R)) * modinv(S,N)) % N)
  39. K11 = hex(((Z + (X * R)) * modinv(S,N)) % N)
  40. #K5
  41. print R11
  42. print S11
  43. print Z11
  44. print X11
  45. print K11
  46.  
  47. # ключ X11 используем для получения подписи K55 с использованием вторых данных
  48.  
  49. #R55 = ((((S5 * K11) - Z5) * modinv(X11,N)) % N)
  50. #S55 = (((Z5 + (X11 * R5)) * modinv(K11,N)) % N)
  51. #Z55 = (((S5 * K11) - (X11 * R5)) % N)
  52. #X55 = ((((S5 * K11) - Z5) * modinv(R5,N)) % N)
  53. #K551 = (((Z5 + (X111 * R5)) * modinv(S5,N)) % N)
  54. K55 = hex(((Z5 + (X111 * R5)) * modinv(S5,N)) % N)
  55.  
  56. print "Анализ первых вводных"
  57. print R - R111
  58. print S - S111
  59. print Z - Z111
  60. print X - X111
  61. print K - K111
  62.  
  63. print "ПОДПИСЬ вторых данных"
  64. print K55
Success #stdin #stdout 0.06s 64808KB
stdin
Standard input is empty
stdout
0x56b6c0b4c19ee6978ff662aad1257dd2c74b21ba7a85c563a8ea7f3d492f2d74L
0x2eda98beedff7c75c9a3a19c2fd051ed9c6c8c6f500332ffed62b57e793cdf8aL
0x20a998e0382becbcc7055797c9787e42f1710664d9fd51c64d238162cc0b7843L
0x7b08b8bc5bb1d914c55cd4ff56fa96b9d356040b2da11338199fb8594991e631L
0x55550dce6743f5eae4f740512b66ec680156b7e9b4138beee23cbcf6a93299eaL
Анализ первых вводных
0
0
0
0
0
ПОДПИСЬ вторых данных
0x9c525fd83aac24ea52594d821cecf45b7a172707f12a180785c10e883cc3be42L