Advertisement
saleks28

kmzi2_8sem

Aug 10th, 2020
341
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 8.55 KB | None | 0 0
  1. from Cryptodome.Random import get_random_bytes
  2. from Cryptodome.Random.random import randint
  3. from Cryptodome.Cipher import AES
  4. from Cryptodome.Util.number import getPrime, inverse, GCD, isPrime
  5. from decimal import Decimal, localcontext
  6. from asn1 import Decoder, Numbers
  7.  
  8.  
  9. # Const variables
  10. CONST_MENU = "Enter the command number:\n" \
  11.        "1 - Common module attack\n" \
  12.        "2 - Wiener's attack\n" \
  13.        "3 - Broadcast attack\n" \
  14.        "4 - Generate good params\n" \
  15.        "5 - Exit\n"
  16.  
  17. e_A = 19
  18. d_A = 8951491488994130591450329621877650875590787614606970058937815143686053318358202107047972075855819632910118594186744692140167595039187521846226346403222614451356200574228642229153896172507224827541911642805183200622905104153808495003541756444423328630360444190985600803253244353807892361102380307011854208574819752139939496660951494871927984549980488625440286371167657743869518972841272343531521006291036125249846126524161290654060186880137271184621266305463220181450640510156096194546448369361561507085982360214103719262850464289998418518504867457526466141884978401820512842646609720322247902138580946552136781341219
  19. d_V = 49872187
  20.  
  21.  
  22. # Read file
  23. def read_file(filename):
  24.     data = b''
  25.     with open(filename, "rb") as enc:
  26.         for line in enc:
  27.             data += line
  28.     f = Decoder()
  29.     f.start(data)
  30.     f.enter()
  31.     f.enter()
  32.     f.enter()
  33.     value = f.read()
  34.     value = f.read()
  35.     f.enter()
  36.     op = list()
  37.     value = f.read()[1]
  38.     op.append(value)
  39.     value = f.read()[1]
  40.     op.append(value)
  41.     f.leave()
  42.     f.enter()
  43.     f.leave()
  44.     f.enter()
  45.     key = f.read()[1]
  46.     op.append(key)
  47.     f.leave()
  48.     f.leave()
  49.     f.leave()
  50.     f.enter()
  51.     value = f.read()[1]
  52.     length = f.read()[1]
  53.     f.leave()
  54.     f.leave()
  55.     cipher_text = f.read()[1]
  56.     op.append(cipher_text)
  57.     op.append(length)
  58.     return op
  59.  
  60.  
  61. # Get user filename
  62. def get_filename():
  63.     return input("Enter filename: ")
  64.  
  65.  
  66. # RSA key generation
  67. def generate_rsa_key(bitness=1024):
  68.     # Generate p and q for n
  69.     p, q = getPrime(bitness, randfunc=get_random_bytes), \
  70.            getPrime(bitness, randfunc=get_random_bytes)
  71.     # Const p and q
  72.     p = 94286323768322764949153206183630282231345205081506763411203480306975515026046638864603826268429591768662290063119783708397368191842260297446140330636685809073715186176664956589509295328164296329117310868897816232456701710285529107339058532391287911593547489660021540237002327209538165993210690581259545410397
  73.     q = 106108794307657365398267707732909976878093634069950792052198750672833579926019821503569440635598344141344867274167934010440371985708002129308319095670726805616787587451771217696125714150662739391434063603898060265054692803724491140655842502897874479001759762422144543530517299276847463882834353536426154569131
  74.     n = p * q
  75.     phi = (p - 1) * (q - 1)
  76.     # Generate e
  77.     e = -1
  78.     for i in range(1, phi - 1):
  79.         if GCD(i, phi) == 1:
  80.             e = i
  81.             break
  82.     # Const e
  83.     e = 65537
  84.     # d = e^-1
  85.     d = inverse(e, phi)
  86.     # (n, e) and d - public and private
  87.     return [n, e, d]
  88.  
  89.  
  90. # Common module attack
  91. def common_module_attack():
  92.     rsa_key = generate_rsa_key(1024)
  93.     # 1. N = 2^f * s
  94.     N = rsa_key[1] * rsa_key[2] - 1
  95.     f = 1
  96.     while N % (2 ** f) == 0:
  97.         f += 1
  98.     f -= 1
  99.     s = N // 2 ** f
  100.     # 2. a, b
  101.     a = randint(0, rsa_key[0] - 1)
  102.     b = pow(a, s, rsa_key[0])
  103.     # 3. l, t
  104.     l = 0
  105.     t = 0
  106.     while True:
  107.         deg = pow(2, l)
  108.         res = pow(b, deg, rsa_key[0])
  109.         if res == 1:
  110.             deg = pow(2, l - 1)
  111.             tmp = pow(b, deg, rsa_key[0])
  112.             if tmp == -1:
  113.                 a = randint(0, rsa_key[0] - 1)
  114.                 b = pow(a, s, rsa_key[0])
  115.                 l = 0
  116.                 continue
  117.             else:
  118.                 t = tmp
  119.                 break
  120.         l += 1
  121.     p = GCD(t + 1, rsa_key[0])
  122.     q = GCD(t - 1, rsa_key[0])
  123.     phi = (p - 1) * (q - 1)
  124.     da = inverse(e_A, phi)
  125.     if da == d_A:
  126.         print("Common module attack is successful\n")
  127.  
  128.  
  129. # Wieners input params generation
  130. def generate_wiener_params(bitness = 64):
  131.     while True:
  132.         # p = getPrime(bitness, randfunc=get_random_bytes)
  133.         # q = getPrime(bitness, randfunc=get_random_bytes)
  134.         p = 15733439112036677461
  135.         q = 11928399707412783767
  136.         if (q < p) and (p < 2 * q):
  137.             n = p * q
  138.             phi = (p - 1) * (q - 1)
  139.             e = 109410315299163392886979402045049646523
  140.             if GCD(e, phi) != 1:
  141.                 continue
  142.             d = inverse(e, phi)
  143.             zn = (n ** (1 / 4)) / 3
  144.             if d < int(zn):
  145.                 return [e, n]
  146.  
  147.  
  148. # Fracs generation
  149. def generate_fracs(params, frac):
  150.     if params[0] == 0 or params[1] == 0:
  151.         return True
  152.     if params[0] == 1:
  153.         frac.append(params[1])
  154.         return True
  155.     if params[1] == 1:
  156.         frac.append(params[0])
  157.         return True
  158.     if params[0] >= params[1]:
  159.         frac.append(params[0] // params[1])
  160.         params.insert(0, params[0] % params[1])
  161.         params.remove(params[1])
  162.     else:
  163.         frac.append(params[1] // params[0])
  164.         params.insert(1, params[1] % params[0])
  165.         params.remove(params[2])
  166.     generate_fracs(params, frac)
  167.  
  168.  
  169. # Wiener's attack
  170. def wieners_attack():
  171.     params = generate_wiener_params(64)
  172.     nums = list([params[0], params[1]])
  173.     frac = list()
  174.     if params[0] < params[1]:
  175.         frac.append(0)
  176.     generate_fracs(nums, frac)
  177.     P_2 = 1
  178.     Q_2 = 0
  179.     P_1 = 0
  180.     Q_1 = 1
  181.     m = randint(0, params[1] - 1)
  182.     print("Message: {}".format(m))
  183.     for i in range(1, len(frac)):
  184.         Pi = frac[i] * P_1 + P_2
  185.         Qi = frac[i] * Q_1 + Q_2
  186.         nod = GCD(Pi, Qi)
  187.         Pi = Pi // nod
  188.         Qi = Qi // nod
  189.         if pow(m, params[0] * Qi, params[1]) == m % params[1]:
  190.             if Qi == d_V:
  191.                 print("Wiener's attack is successful")
  192.                 print("Secret param d was {}".format(Qi))
  193.                 break
  194.         Q_2 = Q_1
  195.         P_2 = P_1
  196.         P_1 = Pi
  197.         Q_1 = Qi
  198.  
  199.  
  200. #
  201. def find_key(c_arr, n_arr, e):
  202.     M = list()
  203.     mod = 1
  204.     for i in range(0, len(n_arr)):
  205.         mod *= n_arr[i]
  206.     for i in range(0, len(n_arr)):
  207.         M.append(mod // n_arr[i])
  208.     x = 0
  209.     for n_i, c_i, M_i in zip(n_arr, c_arr, M):
  210.         x += c_i * inverse(M_i, n_i) * M_i
  211.     x = x % mod
  212.     deg = 1 / e
  213.     with localcontext() as ctx:
  214.         ctx.prec = 300
  215.         m = int(round(Decimal(x)) ** round(Decimal(deg), 10))
  216.         return m.to_bytes(32, "big")
  217.  
  218.  
  219. def data_decrypt(key, cipher_text, l):
  220.     iv = 16 * b' '
  221.     cipher = AES.new(key, AES.MODE_CBC, iv)
  222.     plain_text = cipher.decrypt(cipher_text)
  223.     plain_text = plain_text[0:l]
  224.     return plain_text
  225.  
  226.  
  227. # Broadcast attack
  228. def broadcast_attack():
  229.     # read multiple files
  230.     n_arr = list()
  231.     c_arr = list()
  232.     temp = -1
  233.     e = -1
  234.     for i in range(1, 6):
  235.         temp = read_file(str(i) + ".txt")
  236.         print(str(i) + ".txt")
  237.         n_arr.append(temp[0])
  238.         c_arr.append(temp[2])
  239.         e = temp[1]
  240.     key = find_key(c_arr, n_arr, e)
  241.     with open("attack.txt", "wb") as at:
  242.         at.write(data_decrypt(key, temp[3], temp[4]))
  243.     print("Broadcast attack was successful")
  244.  
  245.  
  246. # Good crypto params
  247. def generate_good_crypto_params(bitness=1024):
  248.     while 1:
  249.         p, q = getPrime(bitness, randfunc=get_random_bytes), getPrime(bitness, randfunc=get_random_bytes)
  250.         # Complexity increase param
  251.         # if isPrime((p - 1) // 2) == False or isPrime((q - 1) // 2) == False:
  252.         #   continue
  253.         n, phi = p * q, (p - 1) * (q - 1)
  254.         e = randint(3 * 10 ** 15, 10 ** 21)
  255.         if GCD(phi, e) != 1:
  256.             continue
  257.         d = inverse(e, phi)
  258.         with localcontext() as ctx:
  259.             ctx.prec = 300
  260.             zn = int((round(Decimal(n)) ** round(Decimal(0.25), 2)) / round(Decimal(3)))
  261.             if d < int(zn):
  262.                 continue
  263.         print("Good crypto params:\np = {}\nq = {}\ne = {}\nn = {}\n" . format(p, q, e, n))
  264.  
  265.  
  266. # main func
  267. def main():
  268.     while 1:
  269.         user_choice = int(input(CONST_MENU))
  270.         if user_choice == 1:
  271.             common_module_attack()
  272.             break
  273.         elif user_choice == 2:
  274.             wieners_attack()
  275.             break
  276.         elif user_choice == 3:
  277.             broadcast_attack()
  278.             break
  279.         elif user_choice == 4:
  280.             generate_good_crypto_params(1024)
  281.             break
  282.         elif user_choice == 5:
  283.             return
  284.  
  285.  
  286. main()
  287.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement