Guest User

Untitled

a guest
Aug 17th, 2018
95
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 14.03 KB | None | 0 0
  1. #coding:utf-8
  2. import urllib
  3. from Crypto.Cipher import AES,DES
  4. from Crypto.Util.number import long_to_bytes,bytes_to_long,getPrime,isPrime
  5. import primefac
  6. import gmpy2
  7.  
  8.  
  9. alphabet_to_morse = {
  10. "A": ".-",
  11. "B": "-...",
  12. "C": "-.-.",
  13. "D": "-..",
  14. "E": ".",
  15. "F": "..-.",
  16. "G": "--.",
  17. "H": "....",
  18. "I": "..",
  19. "J": ".---",
  20. "K": "-.-",
  21. "L": ".-..",
  22. "M": "--",
  23. "N": "-.",
  24. "O": "---",
  25. "P": ".--.",
  26. "Q": "--.-",
  27. "R": ".-.",
  28. "S": "...",
  29. "T": "-",
  30. "U": "..-",
  31. "V": "...-",
  32. "W": ".--",
  33. "X": "-..-",
  34. "Y": "-.--",
  35. "Z": "--..",
  36. "0": "-----",
  37. "1": ".----",
  38. "2": "..---",
  39. "3": "...--",
  40. "4": "....-",
  41. "5": ".....",
  42. "6": "-....",
  43. "7": "--...",
  44. "8": "---..",
  45. "9": "----.",
  46. "Ä": ".-.-",
  47. "Ü": "..--",
  48. "ß": "...--..",
  49. "À": ".--.-",
  50. "È": ".-..-",
  51. "É": "..-..",
  52. ".": ".-.-.-",
  53. ",": "--..--",
  54. ":": "---...",
  55. ";": "-.-.-.",
  56. "?": "..--..",
  57. "-": "-....-",
  58. "_": "..--.-",
  59. "(": "-.--.",
  60. ")": "-.--.-",
  61. "'": ".----.",
  62. "=": "-...-",
  63. "+": ".-.-.",
  64. "/": "-..-.",
  65. "@": ".--.-.",
  66. "Ñ": "--.--",
  67. " ": " ",
  68. "": ""
  69. }
  70. morse_to_alphabet = {v: k for k, v in alphabet_to_morse.iteritems()}
  71. def _morseremoveunusablecharacters(uncorrected_string):
  72. return filter(lambda char: char in alphabet_to_morse, uncorrected_string.upper())
  73. def _playfair_2char_encode(tmp,map):
  74. for i in range(5):
  75. for j in range(5):
  76. if map[i][j] ==tmp[0]:
  77. ai=i
  78. aj=j
  79. if map[i][j] ==tmp[1]:
  80. bi=i
  81. bj=j
  82. if ai==bi:
  83. axi=ai
  84. bxi=bi
  85. axj=(aj+1)%5
  86. bxj=(bj+1)%5
  87. elif aj==bj:
  88. axj=aj
  89. bxj=bj
  90. axi=(ai+1)%5
  91. bxi=(bi+1)%5
  92. else:
  93. axi=ai
  94. axj=bj
  95. bxi=bi
  96. bxj=aj
  97. return map[axi][axj]+map[bxi][bxj]
  98. def _playfair_2char_decode(tmp,map):
  99. for i in range(5):
  100. for j in range(5):
  101. if map[i][j] ==tmp[0]:
  102. ai=i
  103. aj=j
  104. if map[i][j] ==tmp[1]:
  105. bi=i
  106. bj=j
  107. if ai==bi:
  108. axi=ai
  109. bxi=bi
  110. axj=(aj-1)%5
  111. bxj=(bj-1)%5
  112. elif aj==bj:
  113. axj=aj
  114. bxj=bj
  115. axi=(ai-1)%5
  116. bxi=(bi-1)%5
  117. else:
  118. axi=ai
  119. axj=bj
  120. bxi=bi
  121. bxj=aj
  122. return map[axi][axj]+map[bxi][bxj]
  123.  
  124.  
  125.  
  126. def atbash_encode(m):
  127. alphabet="ABCDEFGHIJKLMNOPQRSTUVWXYZ"
  128. Origin=alphabet+alphabet.lower()
  129. TH_A=alphabet[::-1]
  130. TH_a=alphabet.lower()[::-1]
  131. TH=TH_A+TH_a
  132. r=""
  133. for i in m:
  134. tmp=Origin.find(i)
  135. if tmp!=-1:
  136. r+=TH[tmp]
  137. else:
  138. r+=i
  139. return r
  140. def atbash_decode(c):
  141. return atbash_encode(c)
  142. def urlencode(m):
  143. return urllib.quote(m)
  144. def urldecode(c):
  145. return urllib.unquote(c)
  146. def morseencode(decoded):
  147. """
  148. :param decoded:
  149. :return:
  150. """
  151. morsestring = []
  152. decoded = _morseremoveunusablecharacters(decoded)
  153. decoded = decoded.upper()
  154. words = decoded.split(" ")
  155. for word in words:
  156. letters = list(word)
  157. morseword = []
  158. for letter in letters:
  159. morseletter = alphabet_to_morse[letter]
  160. morseword.append(morseletter)
  161. word = "/".join(morseword)
  162. morsestring.append(word)
  163. return " ".join(morsestring)
  164. def morsedecode(encoded):
  165. """
  166. :param encoded:
  167. :return:
  168. """
  169. characterstring = []
  170. words = encoded.split(" ")
  171. for word in words:
  172. letters = word.split("/")
  173. characterword = []
  174. for letter in letters:
  175. characterletter = morse_to_alphabet[letter]
  176. characterword.append(characterletter)
  177. word = "".join(characterword)
  178. characterstring.append(word)
  179. return " ".join(characterstring)
  180. def shift_encrypt(m,k):
  181. l=len(k)
  182. c=""
  183. for i in range(0,len(m),l):
  184. tmp_c=[""]*l
  185. if i+l>len(m):
  186. tmp_m=m[i:]
  187. else:
  188. tmp_m=m[i:i+l]
  189. for kindex in range(len(tmp_m)):
  190. tmp_c[int(k[kindex])-1]=tmp_m[kindex]
  191. c+="".join(tmp_c)
  192. return c
  193. def shift_decrypt(c,k):
  194. l=len(k)
  195. m=""
  196. for i in range(0,len(c),l):
  197. tmp_m=[""]*l
  198. if i+l>=len(c):
  199. tmp_c=c[i:]
  200. use=[]
  201. for kindex in range(len(tmp_c)):
  202. use.append(int(k[kindex]) - 1)
  203. use.sort()
  204. for kindex in range(len(tmp_c)):
  205. tmp_m[kindex] = tmp_c[use.index(int(k[kindex])-1)]
  206. else:
  207. tmp_c=c[i:i+l]
  208. for kindex in range(len(tmp_c)):
  209. tmp_m[kindex] = tmp_c[int(k[kindex]) - 1]
  210. m+="".join(tmp_m)
  211. return m
  212. def zhalan_encrypt(m,k):
  213. chip=[]
  214. for i in range(0,len(m),k):
  215. if i+k>=len(m):
  216. tmp_m=m[i:]
  217. else:
  218. tmp_m=m[i:i+k]
  219. chip.append(tmp_m)
  220. c=""
  221. for i in range(k):
  222. for tmp_m in chip:
  223. if i < len(tmp_m):
  224. c+=tmp_m[i]
  225. return c
  226. def zhalan_decrypt(c,k):
  227. l=len(c)
  228. partnum=l/k
  229. if l%k!=0:
  230. partnum+=1
  231. m=[""]*l
  232. for i in range(0,l,partnum):
  233. if i+partnum>=len(c):
  234. tmp_c=c[i:]
  235. else:
  236. tmp_c=c[i:i+partnum]
  237. for j in range(len(tmp_c)):
  238. m[j*k+i/partnum]=tmp_c[j]
  239. return "".join(m)
  240. def caesar_128_encrypt(m,k):
  241. r=""
  242. for i in m:
  243. r+=chr((ord(i)+k)%128)
  244. return r
  245. def caesar_128_decrypt(c,k):
  246. r=""
  247. for i in c:
  248. r+=chr((ord(i)-k)%128)
  249. return r
  250. def caesar_128_brute(c,match_str):
  251. result=[]
  252. for k in range(128):
  253. tmp=caesar_128_decrypt(c,k)
  254. if match_str in tmp:
  255. result.append(tmp)
  256. return result
  257. def caesar_128_bruteall(c):
  258. result=[]
  259. for k in range(128):
  260. tmp=caesar_128_decrypt(c,k)
  261. result.append(tmp)
  262. return result
  263. def rot13(m):
  264. r=""
  265. for i in m:
  266. if ord(i) in range(ord('A'),ord('Z')+1):
  267. r+=chr((ord(i)+13-ord('A'))%26+ord('A'))
  268. elif ord(i) in range(ord('a'),ord('z')+1):
  269. r += chr((ord(i) + 13 - ord('a')) % 26 + ord('a'))
  270. else:
  271. r+=i
  272. return r
  273. def caesar_alphabet_encrypt(m,k):
  274. r = ""
  275. for i in m:
  276. if ord(i) in range(ord('A'), ord('Z') + 1):
  277. r += chr((ord(i) + k - ord('A')) % 26 + ord('A'))
  278. elif ord(i) in range(ord('a'), ord('z') + 1):
  279. r += chr((ord(i) + k - ord('a')) % 26 + ord('a'))
  280. else:
  281. r += i
  282. return r
  283. def caesar_alphabet_decrypt(c,k):
  284. r = ""
  285. for i in c:
  286. if ord(i) in range(ord('A'), ord('Z') + 1):
  287. r += chr((ord(i) - k - ord('A')) % 26 + ord('A'))
  288. elif ord(i) in range(ord('a'), ord('z') + 1):
  289. r += chr((ord(i) - k - ord('a')) % 26 + ord('a'))
  290. else:
  291. r += i
  292. return r
  293. def caesar_alphabet_brute(c,match_str):
  294. result=[]
  295. for k in range(26):
  296. tmp=caesar_alphabet_decrypt(c,k)
  297. if match_str in tmp:
  298. result.append(tmp)
  299. return result
  300. def caesar_alphabet_bruteall(c):
  301. result=[]
  302. for k in range(26):
  303. tmp=caesar_alphabet_decrypt(c,k)
  304. result.append(tmp)
  305. return result
  306. def substitution_encode(m,k,origin="abcdefghijklmnopqrstuvwxyz"):
  307. r=""
  308. for i in m:
  309. if origin.find(i)!=-1:
  310. r+=k[origin.find(i)]
  311. else:
  312. r+=i
  313. return r
  314. def substitution_decode(c,k,origin="abcdefghijklmnopqrstuvwxyz"):
  315. r = ""
  316. for i in c:
  317. if k.find(i) != -1:
  318. r += origin[k.find(i)]
  319. else:
  320. r += i
  321. return r
  322. def affine_encode(m,a,b,origin="abcdefghijklmnopqrstuvwxyz"):
  323. r=""
  324. for i in m:
  325. if origin.find(i)!=-1:
  326. r+=origin[(a*origin.index(i)+b)%len(origin)]
  327. else:
  328. r+=i
  329. return r
  330. def affine_decode(c,a,b,origin="abcdefghijklmnopqrstuvwxyz"):
  331. r=""
  332. n=len(origin)
  333. ai=primefac.modinv(a,n)%n
  334. for i in c:
  335. if origin.find(i)!=-1:
  336. r+=origin[(ai*(origin.index(i)-b))%len(origin)]
  337. else:
  338. r+=i
  339. return r
  340. def affine_brute(c,origin="abcdefghijklmnopqrstuvwxyz"):
  341. result=[]
  342. for a in range(len(origin)):
  343. for b in range(len(origin)):
  344. result.append(affine_decode(c,a,b,origin))
  345. return result
  346. def affine_guessab(m1,c1,m2,c2,origin="abcdefghijklmnopqrstuvwxyz"):
  347. x1=origin.index(m1)
  348. x2=origin.index(m2)
  349. y1=origin.index(c1)
  350. y2=origin.index(c2)
  351. n=len(origin)
  352. dxi=primefac.modinv(x1-x2,n)%n
  353. a=dxi*(y1-y2) % n
  354. b=(y1-a*x1)%n
  355. return (a,b)
  356. def gen_cheese_map(k,use_Q=True,upper=True):
  357. k=k.upper()
  358. k0=""
  359. origin = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
  360. for i in k:
  361. if i not in k0:
  362. k0+=i
  363. for i in origin:
  364. if i not in k0:
  365. k0+=i
  366. if use_Q==True:
  367. k0=k0[0:k0.index("J")]+k0[k0.index("J")+1:]
  368. else:
  369. k0 = k0[0:k0.index("Q")] + k0[k0.index("Q") + 1:]
  370. if upper==False:
  371. k0=k0.lower()
  372. assert len(k0)==25
  373. r=[]
  374. for i in range(5):
  375. r.append(k0[i*5:i*5+5])
  376. return r
  377. def playfair_encode(m,k="",cheese_map=[]):
  378. m=m.upper()
  379. origin = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
  380. tmp=""
  381. for i in m:
  382. if i in origin:
  383. tmp+=i
  384. m=tmp
  385. assert k!="" or cheese_map!=[]
  386. if cheese_map==[]:
  387. map=gen_cheese_map(k)
  388. else:
  389. map=cheese_map
  390. m0=[]
  391. idx=0
  392. while idx<len(m):
  393. tmp=m[idx:idx+2]
  394. if tmp[0]!=tmp[1]:
  395. m0.append(tmp)
  396. idx+=2
  397. elif tmp[0]!="X":
  398. m0.append(tmp[0]+'X')
  399. idx+=1
  400. else:
  401. m0.append(tmp[0] + 'Q')
  402. idx+=1
  403. if idx==len(m)-1:
  404. if tmp[0] != "X":
  405. m0.append(tmp[0] + 'X')
  406. idx += 1
  407. else:
  408. m0.append(tmp[0] + 'Q')
  409. idx += 1
  410. r=[]
  411. for i in m0:
  412. r.append(_playfair_2char_encode(i,map))
  413. return r
  414. def playfair_decode(c,k="",cheese_map=[]):
  415. assert k != "" or cheese_map != []
  416. if cheese_map == []:
  417. map = gen_cheese_map(k)
  418. else:
  419. map = cheese_map
  420. r=[]
  421. for i in c:
  422. r.append(_playfair_2char_decode(i,map))
  423. return "".join(r)
  424. def polybius_encode(m,k="",name="ADFGX",cheese_map=[]):
  425. m=m.upper()
  426. assert k != "" or cheese_map != []
  427. if cheese_map == []:
  428. map = gen_cheese_map(k)
  429. else:
  430. map = cheese_map
  431. r=[]
  432. for x in m:
  433. for i in range(5):
  434. for j in range(5):
  435. if map[i][j]==x:
  436. r.append(name[i]+name[j])
  437. return r
  438. def polybius_decode(c,k="",name="ADFGX",cheese_map=[]):
  439. assert k != "" or cheese_map != []
  440. if cheese_map == []:
  441. map = gen_cheese_map(k)
  442. else:
  443. map = cheese_map
  444.  
  445. r=""
  446. for x in c:
  447. i=name.index(x[0])
  448. j=name.index(x[1])
  449. r+=map[i][j]
  450. return r
  451. def c01248_decode(c):
  452. l=c.split("0")
  453. origin = "abcdefghijklmnopqrstuvwxyz"
  454. r=""
  455. for i in l:
  456. tmp=0
  457. for num in i:
  458. tmp+=int(num)
  459. r+=origin[tmp-1]
  460. return r
  461. def des_encrypt_ecb(m,key):
  462. cipher = DES.new(key, DES.MODE_ECB)
  463. c = cipher.encrypt(m)
  464. return c
  465. def des_decrypt_ecb(c,key):
  466. cipher = DES.new(key, DES.MODE_ECB)
  467. m = cipher.encrypt(c)
  468. return m
  469. def des_encrypt_cbc(m,key,iv):
  470. cipher = DES.new(key, DES.MODE_CBC,iv)
  471. c = cipher.encrypt(m)
  472. return c
  473. def des_decrypt_ecb(c,key,iv):
  474. cipher = DES.new(key, DES.MODE_CBC,iv)
  475. m = cipher.encrypt(c)
  476. return m
  477. def aes_encrypt_ecb(m,key):
  478. cipher = AES.new(key, AES.MODE_ECB)
  479. c = cipher.encrypt(m)
  480. return c
  481. def aes_decrypt_ecb(c,key):
  482. cipher = AES.new(key, AES.MODE_ECB)
  483. m = cipher.encrypt(c)
  484. return m
  485. def aes_encrypt_cbc(m,key,iv):
  486. cipher = AES.new(key, AES.MODE_CBC,iv)
  487. c = cipher.encrypt(m)
  488. return c
  489. def aes_decrypt_ecb(c,key,iv):
  490. cipher = AES.new(key, AES.MODE_CBC,iv)
  491. m = cipher.encrypt(c)
  492. return m
  493. def cbc_bit_attack_mul(c,m,position,target):
  494. l = len(position)
  495. r=c
  496. for i in range(l):
  497. change=position[i]-16
  498. tmp=chr(ord(m[position[i]])^ord(target[i])^ord(c[change]))
  499. r=r[0:change]+tmp+r[change+1:]
  500. return r
  501. def cbc_chosen_cipher_recover_iv(cc,mm):
  502. assert cc[0:16]==cc[16:32]
  503. def _xorstr(a, b):
  504. s = ""
  505. for i in range(16):
  506. s += chr(ord(a[i]) ^ ord(b[i]))
  507. return s
  508. p0=mm[0:16]
  509. p1=mm[16:32]
  510. return _xorstr(_xorstr(p0, p1), cc[0:16])
  511. def modinv(a,n):
  512. return primefac.modinv(a,n) % n
  513. def gcd(a,b):
  514. return primefac.gcd(a,b)
  515. def relate_message_attack(a, b, c1, c2, n):
  516. b3 = gmpy2.powmod(b, 3, n)
  517. part1 = b * (c1 + 2 * c2 - b3) % n
  518. part2 = a * (c1 - c2 + 2 * b3) % n
  519. part2 = gmpy2.invert(part2, n)
  520. return part1 * part2 % n
  521. def brute_m_with_low_e(c,n,e):
  522. i = 0
  523. while 1:
  524. if (gmpy2.iroot(c + i * n, e)[1] == 1):
  525. return gmpy2.iroot(c + i * n, e)[0]
  526. i = i + 1
  527. def same_n_sttack(n,e1,e2,c1,c2):
  528. def egcd(a, b):
  529. x, lastX = 0, 1
  530. y, lastY = 1, 0
  531. while (b != 0):
  532. q = a // b
  533. a, b = b, a % b
  534. x, lastX = lastX - q * x, x
  535. y, lastY = lastY - q * y, y
  536. return (lastX, lastY)
  537.  
  538. s = egcd(e1, e2)
  539. s1 = s[0]
  540. s2 = s[1]
  541. if s1<0:
  542. s1 = - s1
  543. c1 = primefac.modinv(c1, n)
  544. if c1<0:
  545. c1+=n
  546. elif s2<0:
  547. s2 = - s2
  548. c2 = primefac.modinv(c2, n)
  549. if c2<0:
  550. c2+=n
  551. m=(pow(c1,s1,n)*pow(c2,s2,n)) % n
  552. return m
  553. def broadcast_attack(data):
  554. def extended_gcd(a, b):
  555. x,y = 0, 1
  556. lastx, lasty = 1, 0
  557. while b:
  558. a, (q, b) = b, divmod(a,b)
  559. x, lastx = lastx-q*x, x
  560. y, lasty = lasty-q*y, y
  561. return (lastx, lasty, a)
  562. def chinese_remainder_theorem(items):
  563. N = 1
  564. for a, n in items:
  565. N *= n
  566. result = 0
  567. for a, n in items:
  568. m = N/n
  569. r, s, d = extended_gcd(n, m)
  570. if d != 1:
  571. N=N/n
  572. continue
  573. result += a*s*m
  574. return result % N, N
  575. x, n = chinese_remainder_theorem(data)
  576. m = gmpy2.iroot(x, 3)[0]
  577. return m
Add Comment
Please, Sign In to add comment