test_crypto.py 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562
  1. from sympy.core import symbols
  2. from sympy.crypto.crypto import (cycle_list,
  3. encipher_shift, encipher_affine, encipher_substitution,
  4. check_and_join, encipher_vigenere, decipher_vigenere,
  5. encipher_hill, decipher_hill, encipher_bifid5, encipher_bifid6,
  6. bifid5_square, bifid6_square, bifid5, bifid6,
  7. decipher_bifid5, decipher_bifid6, encipher_kid_rsa,
  8. decipher_kid_rsa, kid_rsa_private_key, kid_rsa_public_key,
  9. decipher_rsa, rsa_private_key, rsa_public_key, encipher_rsa,
  10. lfsr_connection_polynomial, lfsr_autocorrelation, lfsr_sequence,
  11. encode_morse, decode_morse, elgamal_private_key, elgamal_public_key,
  12. encipher_elgamal, decipher_elgamal, dh_private_key, dh_public_key,
  13. dh_shared_key, decipher_shift, decipher_affine, encipher_bifid,
  14. decipher_bifid, bifid_square, padded_key, uniq, decipher_gm,
  15. encipher_gm, gm_public_key, gm_private_key, encipher_bg, decipher_bg,
  16. bg_private_key, bg_public_key, encipher_rot13, decipher_rot13,
  17. encipher_atbash, decipher_atbash, NonInvertibleCipherWarning,
  18. encipher_railfence, decipher_railfence)
  19. from sympy.external.gmpy import gcd
  20. from sympy.matrices import Matrix
  21. from sympy.ntheory import isprime, is_primitive_root
  22. from sympy.polys.domains import FF
  23. from sympy.testing.pytest import raises, warns
  24. from sympy.core.random import randrange
  25. def test_encipher_railfence():
  26. assert encipher_railfence("hello world",2) == "hlowrdel ol"
  27. assert encipher_railfence("hello world",3) == "horel ollwd"
  28. assert encipher_railfence("hello world",4) == "hwe olordll"
  29. def test_decipher_railfence():
  30. assert decipher_railfence("hlowrdel ol",2) == "hello world"
  31. assert decipher_railfence("horel ollwd",3) == "hello world"
  32. assert decipher_railfence("hwe olordll",4) == "hello world"
  33. def test_cycle_list():
  34. assert cycle_list(3, 4) == [3, 0, 1, 2]
  35. assert cycle_list(-1, 4) == [3, 0, 1, 2]
  36. assert cycle_list(1, 4) == [1, 2, 3, 0]
  37. def test_encipher_shift():
  38. assert encipher_shift("ABC", 0) == "ABC"
  39. assert encipher_shift("ABC", 1) == "BCD"
  40. assert encipher_shift("ABC", -1) == "ZAB"
  41. assert decipher_shift("ZAB", -1) == "ABC"
  42. def test_encipher_rot13():
  43. assert encipher_rot13("ABC") == "NOP"
  44. assert encipher_rot13("NOP") == "ABC"
  45. assert decipher_rot13("ABC") == "NOP"
  46. assert decipher_rot13("NOP") == "ABC"
  47. def test_encipher_affine():
  48. assert encipher_affine("ABC", (1, 0)) == "ABC"
  49. assert encipher_affine("ABC", (1, 1)) == "BCD"
  50. assert encipher_affine("ABC", (-1, 0)) == "AZY"
  51. assert encipher_affine("ABC", (-1, 1), symbols="ABCD") == "BAD"
  52. assert encipher_affine("123", (-1, 1), symbols="1234") == "214"
  53. assert encipher_affine("ABC", (3, 16)) == "QTW"
  54. assert decipher_affine("QTW", (3, 16)) == "ABC"
  55. def test_encipher_atbash():
  56. assert encipher_atbash("ABC") == "ZYX"
  57. assert encipher_atbash("ZYX") == "ABC"
  58. assert decipher_atbash("ABC") == "ZYX"
  59. assert decipher_atbash("ZYX") == "ABC"
  60. def test_encipher_substitution():
  61. assert encipher_substitution("ABC", "BAC", "ABC") == "BAC"
  62. assert encipher_substitution("123", "1243", "1234") == "124"
  63. def test_check_and_join():
  64. assert check_and_join("abc") == "abc"
  65. assert check_and_join(uniq("aaabc")) == "abc"
  66. assert check_and_join("ab c".split()) == "abc"
  67. assert check_and_join("abc", "a", filter=True) == "a"
  68. raises(ValueError, lambda: check_and_join('ab', 'a'))
  69. def test_encipher_vigenere():
  70. assert encipher_vigenere("ABC", "ABC") == "ACE"
  71. assert encipher_vigenere("ABC", "ABC", symbols="ABCD") == "ACA"
  72. assert encipher_vigenere("ABC", "AB", symbols="ABCD") == "ACC"
  73. assert encipher_vigenere("AB", "ABC", symbols="ABCD") == "AC"
  74. assert encipher_vigenere("A", "ABC", symbols="ABCD") == "A"
  75. def test_decipher_vigenere():
  76. assert decipher_vigenere("ABC", "ABC") == "AAA"
  77. assert decipher_vigenere("ABC", "ABC", symbols="ABCD") == "AAA"
  78. assert decipher_vigenere("ABC", "AB", symbols="ABCD") == "AAC"
  79. assert decipher_vigenere("AB", "ABC", symbols="ABCD") == "AA"
  80. assert decipher_vigenere("A", "ABC", symbols="ABCD") == "A"
  81. def test_encipher_hill():
  82. A = Matrix(2, 2, [1, 2, 3, 5])
  83. assert encipher_hill("ABCD", A) == "CFIV"
  84. A = Matrix(2, 2, [1, 0, 0, 1])
  85. assert encipher_hill("ABCD", A) == "ABCD"
  86. assert encipher_hill("ABCD", A, symbols="ABCD") == "ABCD"
  87. A = Matrix(2, 2, [1, 2, 3, 5])
  88. assert encipher_hill("ABCD", A, symbols="ABCD") == "CBAB"
  89. assert encipher_hill("AB", A, symbols="ABCD") == "CB"
  90. # message length, n, does not need to be a multiple of k;
  91. # it is padded
  92. assert encipher_hill("ABA", A) == "CFGC"
  93. assert encipher_hill("ABA", A, pad="Z") == "CFYV"
  94. def test_decipher_hill():
  95. A = Matrix(2, 2, [1, 2, 3, 5])
  96. assert decipher_hill("CFIV", A) == "ABCD"
  97. A = Matrix(2, 2, [1, 0, 0, 1])
  98. assert decipher_hill("ABCD", A) == "ABCD"
  99. assert decipher_hill("ABCD", A, symbols="ABCD") == "ABCD"
  100. A = Matrix(2, 2, [1, 2, 3, 5])
  101. assert decipher_hill("CBAB", A, symbols="ABCD") == "ABCD"
  102. assert decipher_hill("CB", A, symbols="ABCD") == "AB"
  103. # n does not need to be a multiple of k
  104. assert decipher_hill("CFA", A) == "ABAA"
  105. def test_encipher_bifid5():
  106. assert encipher_bifid5("AB", "AB") == "AB"
  107. assert encipher_bifid5("AB", "CD") == "CO"
  108. assert encipher_bifid5("ab", "c") == "CH"
  109. assert encipher_bifid5("a bc", "b") == "BAC"
  110. def test_bifid5_square():
  111. A = bifid5
  112. f = lambda i, j: symbols(A[5*i + j])
  113. M = Matrix(5, 5, f)
  114. assert bifid5_square("") == M
  115. def test_decipher_bifid5():
  116. assert decipher_bifid5("AB", "AB") == "AB"
  117. assert decipher_bifid5("CO", "CD") == "AB"
  118. assert decipher_bifid5("ch", "c") == "AB"
  119. assert decipher_bifid5("b ac", "b") == "ABC"
  120. def test_encipher_bifid6():
  121. assert encipher_bifid6("AB", "AB") == "AB"
  122. assert encipher_bifid6("AB", "CD") == "CP"
  123. assert encipher_bifid6("ab", "c") == "CI"
  124. assert encipher_bifid6("a bc", "b") == "BAC"
  125. def test_decipher_bifid6():
  126. assert decipher_bifid6("AB", "AB") == "AB"
  127. assert decipher_bifid6("CP", "CD") == "AB"
  128. assert decipher_bifid6("ci", "c") == "AB"
  129. assert decipher_bifid6("b ac", "b") == "ABC"
  130. def test_bifid6_square():
  131. A = bifid6
  132. f = lambda i, j: symbols(A[6*i + j])
  133. M = Matrix(6, 6, f)
  134. assert bifid6_square("") == M
  135. def test_rsa_public_key():
  136. assert rsa_public_key(2, 3, 1) == (6, 1)
  137. assert rsa_public_key(5, 3, 3) == (15, 3)
  138. with warns(NonInvertibleCipherWarning):
  139. assert rsa_public_key(2, 2, 1) == (4, 1)
  140. assert rsa_public_key(8, 8, 8) is False
  141. def test_rsa_private_key():
  142. assert rsa_private_key(2, 3, 1) == (6, 1)
  143. assert rsa_private_key(5, 3, 3) == (15, 3)
  144. assert rsa_private_key(23,29,5) == (667,493)
  145. with warns(NonInvertibleCipherWarning):
  146. assert rsa_private_key(2, 2, 1) == (4, 1)
  147. assert rsa_private_key(8, 8, 8) is False
  148. def test_rsa_large_key():
  149. # Sample from
  150. # http://www.herongyang.com/Cryptography/JCE-Public-Key-RSA-Private-Public-Key-Pair-Sample.html
  151. p = int('101565610013301240713207239558950144682174355406589305284428666'\
  152. '903702505233009')
  153. q = int('894687191887545488935455605955948413812376003053143521429242133'\
  154. '12069293984003')
  155. e = int('65537')
  156. d = int('893650581832704239530398858744759129594796235440844479456143566'\
  157. '6999402846577625762582824202269399672579058991442587406384754958587'\
  158. '400493169361356902030209')
  159. assert rsa_public_key(p, q, e) == (p*q, e)
  160. assert rsa_private_key(p, q, e) == (p*q, d)
  161. def test_encipher_rsa():
  162. puk = rsa_public_key(2, 3, 1)
  163. assert encipher_rsa(2, puk) == 2
  164. puk = rsa_public_key(5, 3, 3)
  165. assert encipher_rsa(2, puk) == 8
  166. with warns(NonInvertibleCipherWarning):
  167. puk = rsa_public_key(2, 2, 1)
  168. assert encipher_rsa(2, puk) == 2
  169. def test_decipher_rsa():
  170. prk = rsa_private_key(2, 3, 1)
  171. assert decipher_rsa(2, prk) == 2
  172. prk = rsa_private_key(5, 3, 3)
  173. assert decipher_rsa(8, prk) == 2
  174. with warns(NonInvertibleCipherWarning):
  175. prk = rsa_private_key(2, 2, 1)
  176. assert decipher_rsa(2, prk) == 2
  177. def test_mutltiprime_rsa_full_example():
  178. # Test example from
  179. # https://iopscience.iop.org/article/10.1088/1742-6596/995/1/012030
  180. puk = rsa_public_key(2, 3, 5, 7, 11, 13, 7)
  181. prk = rsa_private_key(2, 3, 5, 7, 11, 13, 7)
  182. assert puk == (30030, 7)
  183. assert prk == (30030, 823)
  184. msg = 10
  185. encrypted = encipher_rsa(2 * msg - 15, puk)
  186. assert encrypted == 18065
  187. decrypted = (decipher_rsa(encrypted, prk) + 15) / 2
  188. assert decrypted == msg
  189. # Test example from
  190. # https://www.scirp.org/pdf/JCC_2018032215502008.pdf
  191. puk1 = rsa_public_key(53, 41, 43, 47, 41)
  192. prk1 = rsa_private_key(53, 41, 43, 47, 41)
  193. puk2 = rsa_public_key(53, 41, 43, 47, 97)
  194. prk2 = rsa_private_key(53, 41, 43, 47, 97)
  195. assert puk1 == (4391633, 41)
  196. assert prk1 == (4391633, 294041)
  197. assert puk2 == (4391633, 97)
  198. assert prk2 == (4391633, 455713)
  199. msg = 12321
  200. encrypted = encipher_rsa(encipher_rsa(msg, puk1), puk2)
  201. assert encrypted == 1081588
  202. decrypted = decipher_rsa(decipher_rsa(encrypted, prk2), prk1)
  203. assert decrypted == msg
  204. def test_rsa_crt_extreme():
  205. p = int(
  206. '10177157607154245068023861503693082120906487143725062283406501' \
  207. '54082258226204046999838297167140821364638180697194879500245557' \
  208. '65445186962893346463841419427008800341257468600224049986260471' \
  209. '92257248163014468841725476918639415726709736077813632961290911' \
  210. '0256421232977833028677441206049309220354796014376698325101693')
  211. q = int(
  212. '28752342353095132872290181526607275886182793241660805077850801' \
  213. '75689512797754286972952273553128181861830576836289738668745250' \
  214. '34028199691128870676414118458442900035778874482624765513861643' \
  215. '27966696316822188398336199002306588703902894100476186823849595' \
  216. '103239410527279605442148285816149368667083114802852804976893')
  217. r = int(
  218. '17698229259868825776879500736350186838850961935956310134378261' \
  219. '89771862186717463067541369694816245225291921138038800171125596' \
  220. '07315449521981157084370187887650624061033066022458512942411841' \
  221. '18747893789972315277160085086164119879536041875335384844820566' \
  222. '0287479617671726408053319619892052000850883994343378882717849')
  223. s = int(
  224. '68925428438585431029269182233502611027091755064643742383515623' \
  225. '64321310582896893395529367074942808353187138794422745718419645' \
  226. '28291231865157212604266903677599180789896916456120289112752835' \
  227. '98502265889669730331688206825220074713977607415178738015831030' \
  228. '364290585369150502819743827343552098197095520550865360159439'
  229. )
  230. t = int(
  231. '69035483433453632820551311892368908779778144568711455301541094' \
  232. '31487047642322695357696860925747923189635033183069823820910521' \
  233. '71172909106797748883261493224162414050106920442445896819806600' \
  234. '15448444826108008217972129130625571421904893252804729877353352' \
  235. '739420480574842850202181462656251626522910618936534699566291'
  236. )
  237. e = 65537
  238. puk = rsa_public_key(p, q, r, s, t, e)
  239. prk = rsa_private_key(p, q, r, s, t, e)
  240. plaintext = 1000
  241. ciphertext_1 = encipher_rsa(plaintext, puk)
  242. ciphertext_2 = encipher_rsa(plaintext, puk, [p, q, r, s, t])
  243. assert ciphertext_1 == ciphertext_2
  244. assert decipher_rsa(ciphertext_1, prk) == \
  245. decipher_rsa(ciphertext_1, prk, [p, q, r, s, t])
  246. def test_rsa_exhaustive():
  247. p, q = 61, 53
  248. e = 17
  249. puk = rsa_public_key(p, q, e, totient='Carmichael')
  250. prk = rsa_private_key(p, q, e, totient='Carmichael')
  251. for msg in range(puk[0]):
  252. encrypted = encipher_rsa(msg, puk)
  253. decrypted = decipher_rsa(encrypted, prk)
  254. try:
  255. assert decrypted == msg
  256. except AssertionError:
  257. raise AssertionError(
  258. "The RSA is not correctly decrypted " \
  259. "(Original : {}, Encrypted : {}, Decrypted : {})" \
  260. .format(msg, encrypted, decrypted)
  261. )
  262. def test_rsa_multiprime_exhanstive():
  263. primes = [3, 5, 7, 11]
  264. e = 7
  265. args = primes + [e]
  266. puk = rsa_public_key(*args, totient='Carmichael')
  267. prk = rsa_private_key(*args, totient='Carmichael')
  268. n = puk[0]
  269. for msg in range(n):
  270. encrypted = encipher_rsa(msg, puk)
  271. decrypted = decipher_rsa(encrypted, prk)
  272. try:
  273. assert decrypted == msg
  274. except AssertionError:
  275. raise AssertionError(
  276. "The RSA is not correctly decrypted " \
  277. "(Original : {}, Encrypted : {}, Decrypted : {})" \
  278. .format(msg, encrypted, decrypted)
  279. )
  280. def test_rsa_multipower_exhanstive():
  281. primes = [5, 5, 7]
  282. e = 7
  283. args = primes + [e]
  284. puk = rsa_public_key(*args, multipower=True)
  285. prk = rsa_private_key(*args, multipower=True)
  286. n = puk[0]
  287. for msg in range(n):
  288. if gcd(msg, n) != 1:
  289. continue
  290. encrypted = encipher_rsa(msg, puk)
  291. decrypted = decipher_rsa(encrypted, prk)
  292. try:
  293. assert decrypted == msg
  294. except AssertionError:
  295. raise AssertionError(
  296. "The RSA is not correctly decrypted " \
  297. "(Original : {}, Encrypted : {}, Decrypted : {})" \
  298. .format(msg, encrypted, decrypted)
  299. )
  300. def test_kid_rsa_public_key():
  301. assert kid_rsa_public_key(1, 2, 1, 1) == (5, 2)
  302. assert kid_rsa_public_key(1, 2, 2, 1) == (8, 3)
  303. assert kid_rsa_public_key(1, 2, 1, 2) == (7, 2)
  304. def test_kid_rsa_private_key():
  305. assert kid_rsa_private_key(1, 2, 1, 1) == (5, 3)
  306. assert kid_rsa_private_key(1, 2, 2, 1) == (8, 3)
  307. assert kid_rsa_private_key(1, 2, 1, 2) == (7, 4)
  308. def test_encipher_kid_rsa():
  309. assert encipher_kid_rsa(1, (5, 2)) == 2
  310. assert encipher_kid_rsa(1, (8, 3)) == 3
  311. assert encipher_kid_rsa(1, (7, 2)) == 2
  312. def test_decipher_kid_rsa():
  313. assert decipher_kid_rsa(2, (5, 3)) == 1
  314. assert decipher_kid_rsa(3, (8, 3)) == 1
  315. assert decipher_kid_rsa(2, (7, 4)) == 1
  316. def test_encode_morse():
  317. assert encode_morse('ABC') == '.-|-...|-.-.'
  318. assert encode_morse('SMS ') == '...|--|...||'
  319. assert encode_morse('SMS\n') == '...|--|...||'
  320. assert encode_morse('') == ''
  321. assert encode_morse(' ') == '||'
  322. assert encode_morse(' ', sep='`') == '``'
  323. assert encode_morse(' ', sep='``') == '````'
  324. assert encode_morse('!@#$%^&*()_+') == '-.-.--|.--.-.|...-..-|-.--.|-.--.-|..--.-|.-.-.'
  325. assert encode_morse('12345') == '.----|..---|...--|....-|.....'
  326. assert encode_morse('67890') == '-....|--...|---..|----.|-----'
  327. def test_decode_morse():
  328. assert decode_morse('-.-|.|-.--') == 'KEY'
  329. assert decode_morse('.-.|..-|-.||') == 'RUN'
  330. raises(KeyError, lambda: decode_morse('.....----'))
  331. def test_lfsr_sequence():
  332. raises(TypeError, lambda: lfsr_sequence(1, [1], 1))
  333. raises(TypeError, lambda: lfsr_sequence([1], 1, 1))
  334. F = FF(2)
  335. assert lfsr_sequence([F(1)], [F(1)], 2) == [F(1), F(1)]
  336. assert lfsr_sequence([F(0)], [F(1)], 2) == [F(1), F(0)]
  337. F = FF(3)
  338. assert lfsr_sequence([F(1)], [F(1)], 2) == [F(1), F(1)]
  339. assert lfsr_sequence([F(0)], [F(2)], 2) == [F(2), F(0)]
  340. assert lfsr_sequence([F(1)], [F(2)], 2) == [F(2), F(2)]
  341. def test_lfsr_autocorrelation():
  342. raises(TypeError, lambda: lfsr_autocorrelation(1, 2, 3))
  343. F = FF(2)
  344. s = lfsr_sequence([F(1), F(0)], [F(0), F(1)], 5)
  345. assert lfsr_autocorrelation(s, 2, 0) == 1
  346. assert lfsr_autocorrelation(s, 2, 1) == -1
  347. def test_lfsr_connection_polynomial():
  348. F = FF(2)
  349. x = symbols("x")
  350. s = lfsr_sequence([F(1), F(0)], [F(0), F(1)], 5)
  351. assert lfsr_connection_polynomial(s) == x**2 + 1
  352. s = lfsr_sequence([F(1), F(1)], [F(0), F(1)], 5)
  353. assert lfsr_connection_polynomial(s) == x**2 + x + 1
  354. def test_elgamal_private_key():
  355. a, b, _ = elgamal_private_key(digit=100)
  356. assert isprime(a)
  357. assert is_primitive_root(b, a)
  358. assert len(bin(a)) >= 102
  359. def test_elgamal():
  360. dk = elgamal_private_key(5)
  361. ek = elgamal_public_key(dk)
  362. P = ek[0]
  363. assert P - 1 == decipher_elgamal(encipher_elgamal(P - 1, ek), dk)
  364. raises(ValueError, lambda: encipher_elgamal(P, dk))
  365. raises(ValueError, lambda: encipher_elgamal(-1, dk))
  366. def test_dh_private_key():
  367. p, g, _ = dh_private_key(digit = 100)
  368. assert isprime(p)
  369. assert is_primitive_root(g, p)
  370. assert len(bin(p)) >= 102
  371. def test_dh_public_key():
  372. p1, g1, a = dh_private_key(digit = 100)
  373. p2, g2, ga = dh_public_key((p1, g1, a))
  374. assert p1 == p2
  375. assert g1 == g2
  376. assert ga == pow(g1, a, p1)
  377. def test_dh_shared_key():
  378. prk = dh_private_key(digit = 100)
  379. p, _, ga = dh_public_key(prk)
  380. b = randrange(2, p)
  381. sk = dh_shared_key((p, _, ga), b)
  382. assert sk == pow(ga, b, p)
  383. raises(ValueError, lambda: dh_shared_key((1031, 14, 565), 2000))
  384. def test_padded_key():
  385. assert padded_key('b', 'ab') == 'ba'
  386. raises(ValueError, lambda: padded_key('ab', 'ace'))
  387. raises(ValueError, lambda: padded_key('ab', 'abba'))
  388. def test_bifid():
  389. raises(ValueError, lambda: encipher_bifid('abc', 'b', 'abcde'))
  390. assert encipher_bifid('abc', 'b', 'abcd') == 'bdb'
  391. raises(ValueError, lambda: decipher_bifid('bdb', 'b', 'abcde'))
  392. assert encipher_bifid('bdb', 'b', 'abcd') == 'abc'
  393. raises(ValueError, lambda: bifid_square('abcde'))
  394. assert bifid5_square("B") == \
  395. bifid5_square('BACDEFGHIKLMNOPQRSTUVWXYZ')
  396. assert bifid6_square('B0') == \
  397. bifid6_square('B0ACDEFGHIJKLMNOPQRSTUVWXYZ123456789')
  398. def test_encipher_decipher_gm():
  399. ps = [131, 137, 139, 149, 151, 157, 163, 167,
  400. 173, 179, 181, 191, 193, 197, 199]
  401. qs = [89, 97, 101, 103, 107, 109, 113, 127,
  402. 131, 137, 139, 149, 151, 157, 47]
  403. messages = [
  404. 0, 32855, 34303, 14805, 1280, 75859, 38368,
  405. 724, 60356, 51675, 76697, 61854, 18661,
  406. ]
  407. for p, q in zip(ps, qs):
  408. pri = gm_private_key(p, q)
  409. for msg in messages:
  410. pub = gm_public_key(p, q)
  411. enc = encipher_gm(msg, pub)
  412. dec = decipher_gm(enc, pri)
  413. assert dec == msg
  414. def test_gm_private_key():
  415. raises(ValueError, lambda: gm_public_key(13, 15))
  416. raises(ValueError, lambda: gm_public_key(0, 0))
  417. raises(ValueError, lambda: gm_public_key(0, 5))
  418. assert 17, 19 == gm_public_key(17, 19)
  419. def test_gm_public_key():
  420. assert 323 == gm_public_key(17, 19)[1]
  421. assert 15 == gm_public_key(3, 5)[1]
  422. raises(ValueError, lambda: gm_public_key(15, 19))
  423. def test_encipher_decipher_bg():
  424. ps = [67, 7, 71, 103, 11, 43, 107, 47,
  425. 79, 19, 83, 23, 59, 127, 31]
  426. qs = qs = [7, 71, 103, 11, 43, 107, 47,
  427. 79, 19, 83, 23, 59, 127, 31, 67]
  428. messages = [
  429. 0, 328, 343, 148, 1280, 758, 383,
  430. 724, 603, 516, 766, 618, 186,
  431. ]
  432. for p, q in zip(ps, qs):
  433. pri = bg_private_key(p, q)
  434. for msg in messages:
  435. pub = bg_public_key(p, q)
  436. enc = encipher_bg(msg, pub)
  437. dec = decipher_bg(enc, pri)
  438. assert dec == msg
  439. def test_bg_private_key():
  440. raises(ValueError, lambda: bg_private_key(8, 16))
  441. raises(ValueError, lambda: bg_private_key(8, 8))
  442. raises(ValueError, lambda: bg_private_key(13, 17))
  443. assert 23, 31 == bg_private_key(23, 31)
  444. def test_bg_public_key():
  445. assert 5293 == bg_public_key(67, 79)
  446. assert 713 == bg_public_key(23, 31)
  447. raises(ValueError, lambda: bg_private_key(13, 17))