def extended_gcd(aa, bb):
lastremainder, remainder = abs(aa), abs(bb)
x, lastx, y, lasty = 0, 1, 1, 0
while remainder:
lastremainder, (quotient, remainder) = remainder, divmod(lastremainder, remainder)
x, lastx = lastx - quotient*x, x
y, lasty = lasty - quotient*y, y
return lastremainder, lastx * (-1 if aa < 0 else 1), lasty * (-1 if bb < 0 else 1)
def modinv(a, m):
g, x, y = extended_gcd(a, m)
if g != 1:
raise ValueError
return x % m
N = 0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141
# ввод первых данных
R = 0x0056b6c0b4c19ee6978ff662aad1257dd2c74b21ba7a85c563a8ea7f3d492f2d74
S = 0x002eda98beedff7c75c9a3a19c2fd051ed9c6c8c6f500332ffed62b57e793cdf8a
Z = 0x0020a998e0382becbcc7055797c9787e42f1710664d9fd51c64d238162cc0b7843
X = 0x007b08b8bc5bb1d914c55cd4ff56fa96b9d356040b2da11338199fb8594991e631
K = 0x0055550dce6743f5eae4f740512b66ec680156b7e9b4138beee23cbcf6a93299ea
# ввод вторых данных
R5 = 0x000f18c2d1fe6513b90f44513e975e05cc498e7f5a565b46c65b1d448734392c6f
S5 = 0x0000917766d14f2e9933eb269c83b3ad440ed8432da8beb5733f34046509e48b1d85
Z5 = 0x000d9dd44880b58f3e12c66978fc4651f20442a0b47731f6bcc9af594a67dcfb7e
#X5 = 0x008b184d0143d89f76c342cbd9ffa96329ece0e854e6416fd1f58230b90f007ba0
#K5 = 0x0062d1da6649ce56f9ba56be11f9c38e7ff725888f31eeb4c9cf3e6ca382282e5d
# получаем ключ X11
R111 = ((((S * K) - Z) * modinv(X,N)) % N)
R11 = hex((((S * K) - Z) * modinv(X,N)) % N)
S111 = (((Z + (X * R)) * modinv(K,N)) % N)
S11 = hex(((Z + (X * R)) * modinv(K,N)) % N)
Z111 = (((S * K) - (X * R)) % N)
Z11 = hex(((S * K) - (X * R)) % N)
X111 = ((((S * K) - Z) * modinv(R,N)) % N)
X11 = hex((((S * K) - Z) * modinv(R,N)) % N)
K111 = (((Z + (X * R)) * modinv(S,N)) % N)
K11 = hex(((Z + (X * R)) * modinv(S,N)) % N)
#K5
print R11
print S11
print Z11
print X11
print K11
# ключ X11 используем для получения подписи K55 с использованием вторых данных
#R55 = ((((S5 * K11) - Z5) * modinv(X11,N)) % N)
#S55 = (((Z5 + (X11 * R5)) * modinv(K11,N)) % N)
#Z55 = (((S5 * K11) - (X11 * R5)) % N)
#X55 = ((((S5 * K11) - Z5) * modinv(R5,N)) % N)
#K551 = (((Z5 + (X111 * R5)) * modinv(S5,N)) % N)
K55 = hex(((Z5 + (X111 * R5)) * modinv(S5,N)) % N)
print "Анализ первых вводных"
print R - R111
print S - S111
print Z - Z111
print X - X111
print K - K111
print "ПОДПИСЬ вторых данных"
print K55
ZGVmIGV4dGVuZGVkX2djZChhYSwgYmIpOgogICAgbGFzdHJlbWFpbmRlciwgcmVtYWluZGVyID0gYWJzKGFhKSwgYWJzKGJiKQogICAgeCwgbGFzdHgsIHksIGxhc3R5ID0gMCwgMSwgMSwgMAogICAgd2hpbGUgcmVtYWluZGVyOgogICAgICAgIGxhc3RyZW1haW5kZXIsIChxdW90aWVudCwgcmVtYWluZGVyKSA9IHJlbWFpbmRlciwgZGl2bW9kKGxhc3RyZW1haW5kZXIsIHJlbWFpbmRlcikKICAgICAgICB4LCBsYXN0eCA9IGxhc3R4IC0gcXVvdGllbnQqeCwgeAogICAgICAgIHksIGxhc3R5ID0gbGFzdHkgLSBxdW90aWVudCp5LCB5CiAgICByZXR1cm4gbGFzdHJlbWFpbmRlciwgbGFzdHggKiAoLTEgaWYgYWEgPCAwIGVsc2UgMSksIGxhc3R5ICogKC0xIGlmIGJiIDwgMCBlbHNlIDEpCiAKZGVmIG1vZGludihhLCBtKToKICAgIGcsIHgsIHkgPSBleHRlbmRlZF9nY2QoYSwgbSkKICAgIGlmIGcgIT0gMToKICAgICAgICByYWlzZSBWYWx1ZUVycm9yCiAgICByZXR1cm4geCAlIG0KTiA9IDB4ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmViYWFlZGNlNmFmNDhhMDNiYmZkMjVlOGNkMDM2NDE0MQojINCy0LLQvtC0INC/0LXRgNCy0YvRhSDQtNCw0L3QvdGL0YUKUiA9IDB4MDA1NmI2YzBiNGMxOWVlNjk3OGZmNjYyYWFkMTI1N2RkMmM3NGIyMWJhN2E4NWM1NjNhOGVhN2YzZDQ5MmYyZDc0ClMgPSAweDAwMmVkYTk4YmVlZGZmN2M3NWM5YTNhMTljMmZkMDUxZWQ5YzZjOGM2ZjUwMDMzMmZmZWQ2MmI1N2U3OTNjZGY4YQpaID0gMHgwMDIwYTk5OGUwMzgyYmVjYmNjNzA1NTc5N2M5Nzg3ZTQyZjE3MTA2NjRkOWZkNTFjNjRkMjM4MTYyY2MwYjc4NDMKWCA9IDB4MDA3YjA4YjhiYzViYjFkOTE0YzU1Y2Q0ZmY1NmZhOTZiOWQzNTYwNDBiMmRhMTEzMzgxOTlmYjg1OTQ5OTFlNjMxCksgPSAweDAwNTU1NTBkY2U2NzQzZjVlYWU0Zjc0MDUxMmI2NmVjNjgwMTU2YjdlOWI0MTM4YmVlZTIzY2JjZjZhOTMyOTllYQojINCy0LLQvtC0INCy0YLQvtGA0YvRhSDQtNCw0L3QvdGL0YUKUjUgPSAweDAwMGYxOGMyZDFmZTY1MTNiOTBmNDQ1MTNlOTc1ZTA1Y2M0OThlN2Y1YTU2NWI0NmM2NWIxZDQ0ODczNDM5MmM2ZgpTNSA9IDB4MDAwMDkxNzc2NmQxNGYyZTk5MzNlYjI2OWM4M2IzYWQ0NDBlZDg0MzJkYThiZWI1NzMzZjM0MDQ2NTA5ZTQ4YjFkODUKWjUgPSAweDAwMGQ5ZGQ0NDg4MGI1OGYzZTEyYzY2OTc4ZmM0NjUxZjIwNDQyYTBiNDc3MzFmNmJjYzlhZjU5NGE2N2RjZmI3ZQojWDUgPSAweDAwOGIxODRkMDE0M2Q4OWY3NmMzNDJjYmQ5ZmZhOTYzMjllY2UwZTg1NGU2NDE2ZmQxZjU4MjMwYjkwZjAwN2JhMAojSzUgPSAweDAwNjJkMWRhNjY0OWNlNTZmOWJhNTZiZTExZjljMzhlN2ZmNzI1ODg4ZjMxZWViNGM5Y2YzZTZjYTM4MjI4MmU1ZAogCiMg0L/QvtC70YPRh9Cw0LXQvCDQutC70Y7RhyBYMTEKUjExMSA9ICgoKChTICogSykgLSBaKSAqIG1vZGludihYLE4pKSAlIE4pClIxMSA9IGhleCgoKChTICogSykgLSBaKSAqIG1vZGludihYLE4pKSAlIE4pClMxMTEgPSAoKChaICsgKFggKiBSKSkgKiBtb2RpbnYoSyxOKSkgJSBOKQpTMTEgPSBoZXgoKChaICsgKFggKiBSKSkgKiBtb2RpbnYoSyxOKSkgJSBOKQpaMTExID0gKCgoUyAqIEspIC0gKFggKiBSKSkgJSBOKQpaMTEgPSBoZXgoKChTICogSykgLSAoWCAqIFIpKSAlIE4pClgxMTEgPSAoKCgoUyAqIEspIC0gWikgKiBtb2RpbnYoUixOKSkgJSBOKQpYMTEgPSBoZXgoKCgoUyAqIEspIC0gWikgKiBtb2RpbnYoUixOKSkgJSBOKQpLMTExID0gKCgoWiArIChYICogUikpICogbW9kaW52KFMsTikpICUgTikKSzExID0gaGV4KCgoWiArIChYICogUikpICogbW9kaW52KFMsTikpICUgTikKI0s1ICAKcHJpbnQgUjExCnByaW50IFMxMQpwcmludCBaMTEKcHJpbnQgWDExCnByaW50IEsxMQogCiMg0LrQu9GO0YcgWDExINC40YHQv9C+0LvRjNC30YPQtdC8INC00LvRjyDQv9C+0LvRg9GH0LXQvdC40Y8g0L/QvtC00L/QuNGB0LggSzU1INGBINC40YHQv9C+0LvRjNC30L7QstCw0L3QuNC10Lwg0LLRgtC+0YDRi9GFINC00LDQvdC90YvRhQogCiNSNTUgPSAoKCgoUzUgKiBLMTEpIC0gWjUpICogbW9kaW52KFgxMSxOKSkgJSBOKQojUzU1ID0gKCgoWjUgKyAoWDExICogUjUpKSAqIG1vZGludihLMTEsTikpICUgTikKI1o1NSA9ICgoKFM1ICogSzExKSAtIChYMTEgKiBSNSkpICUgTikKI1g1NSA9ICgoKChTNSAqIEsxMSkgLSBaNSkgKiBtb2RpbnYoUjUsTikpICUgTikKI0s1NTEgPSAoKChaNSArIChYMTExICogUjUpKSAqIG1vZGludihTNSxOKSkgJSBOKQpLNTUgPSBoZXgoKChaNSArIChYMTExICogUjUpKSAqIG1vZGludihTNSxOKSkgJSBOKQogCnByaW50ICLQkNC90LDQu9C40Lcg0L/QtdGA0LLRi9GFINCy0LLQvtC00L3Ri9GFIgpwcmludCBSIC0gUjExMQpwcmludCBTIC0gUzExMQpwcmludCBaIC0gWjExMQpwcmludCBYIC0gWDExMQpwcmludCBLIC0gSzExMQogCnByaW50ICLQn9Ce0JTQn9CY0KHQrCDQstGC0L7RgNGL0YUg0LTQsNC90L3Ri9GFIiAKcHJpbnQgSzU1