Advertisement
miklis

RSA nulauzimas

Apr 24th, 2016
136
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.74 KB | None | 0 0
  1. from math import*
  2. import string
  3.  
  4. def number2phrase(number):
  5. '''skaiciu pavers i fraze'''
  6. dictionary = dict(zip(range(27)," "+string.lowercase))
  7. ans = ""
  8. while number > 0:
  9. ans = dictionary[number % 27] + ans
  10. number = number // 27
  11. return ans
  12.  
  13. def count_pow(a,n,modulus):
  14. '''suskaiciuos rezultata a^n (mod modulus)'''
  15. def get_binary(n):
  16. '''n pavers i dvejetaine forma ir parasys gautos formos skaitmenu sarasa (atbula tvarka)'''
  17. ls=[]
  18. while n>0:
  19. ls.append(n%2)
  20. n/=2
  21. return [n for n in ls]
  22.  
  23. def binary_residues(base,length, modulus):
  24. '''pagrindas base bus keliamas kvadratu tiek kartu, kiek reikalauja length ir bus grazinamas rezultatu (mod modulus) masyvas '''
  25. array=[]
  26. for i in range(length):
  27. array.append(base)
  28. base=(base**2)%modulus
  29. return array
  30. binary_pow=get_binary(n)
  31. multipliers=binary_residues(a,len(binary_pow), modulus)
  32. result=1
  33. for i in range(len(binary_pow)):
  34. if binary_pow[i]: result=(result*multipliers[i])%modulus
  35. return result
  36.  
  37. def gcd(a,b,M=[[1,0],[0,1]]):
  38. '''ispresime lygti ax=1 (mod b) taip, kad x butu teigiama liekana'''
  39. A,B=a,b
  40. while a<>0:
  41. factor=b/a
  42. a,b=b-a*factor,a
  43. M=[[M[1][0]-factor*M[0][0],M[1][1]-factor*M[0][1]],[M[0][0],M[0][1]]]
  44. if M[1][0]>0: return M[1][0]
  45. else: return M[1][0]+B
  46.  
  47. n=int('107150860718626732094842504906000181056140481170553360744375038'+\
  48. '8370351051124936122493198378815695858127594672917553146825187145285'+\
  49. '6923140435984577575320519019434834730126737027818318443983533130626'+\
  50. '1364921548718349218473625842869329869868614879988527732396664619229'+\
  51. '55659411708575370849066969625910058241')
  52.  
  53. m=int('5891891362324618801516625276689753892986599946617538963411230332134'+\
  54. '2112190514713843777222238924868922623498834914053875551248418228253'+\
  55. '1197092733993097827467708018501761089296474369148392207940371165257'+\
  56. '7298170507933443719740542805570094855295089660630892981913643413045'+\
  57. '581501376437077203633106798985884')
  58.  
  59. #Kodo dalis, kuri tikrina, ar salia n spinduliu 100 nera kokio nors kvadrato X, kad X^2-n yra kvadratas
  60. for i in range(-100, 100):
  61. A=(int(sqrt(n))+i)**2-n
  62. if A>0 and A==(int(sqrt(A)))**2:
  63. print 'suradome: (int(sqrt(n)) +', i,'- n)^2 yra', int(sqrt(A)), 'kvadratas'
  64. break
  65.  
  66. p_plus_q_div2 = int(sqrt(n))+i
  67. p_minus_q_div2 = int(sqrt(A))
  68. p=p_plus_q_div2+p_minus_q_div2
  69. q=p_plus_q_div2-p_minus_q_div2
  70.  
  71. d=17 #public key
  72. e=gcd(d,(p-1)*(q-1)) #private key
  73. meaning=count_pow(m,e,n)
  74. print 'public key d=', d
  75. print 'private key e=', e
  76. print 'encrypted text:', meaning
  77. print 'text:', number2phrase(meaning)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement