Mackan90096

Untitled

Jul 17th, 2017
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 26.69 KB | None | 0 0
  1. --
  2. -- RSA Encryption/Decryption Library
  3. -- By 1lann
  4. --
  5. -- Refer to license: http://pastebin.com/9gWSyqQt
  6. --
  7.  
  8. --
  9. -- Start of third-party libraries/helpers
  10. --
  11.  
  12. -- two functions to help make Lua act more like C
  13. local function fl(x)
  14. if x < 0 then
  15. return math.ceil(x) + 0 -- make -0 go away
  16. else
  17. return math.floor(x)
  18. end
  19. end
  20.  
  21. local function cmod(a, b)
  22. local x = a % b
  23. if a < 0 and x > 0 then
  24. x = x - b
  25. end
  26. return x
  27. end
  28.  
  29.  
  30. local radix = 2^24 -- maybe up to 2^26 is safe?
  31. local radix_sqrt = fl(math.sqrt(radix))
  32.  
  33. local bigintmt -- forward decl
  34.  
  35. local function alloc()
  36. local bi = {}
  37. setmetatable(bi, bigintmt)
  38. bi.comps = {}
  39. bi.sign = 1;
  40. return bi
  41. end
  42.  
  43. local function clone(a)
  44. local bi = alloc()
  45. bi.sign = a.sign
  46. local c = bi.comps
  47. local ac = a.comps
  48. for i = 1, #ac do
  49. c[i] = ac[i]
  50. end
  51. return bi
  52. end
  53.  
  54. local function normalize(bi, notrunc)
  55. local c = bi.comps
  56. local v
  57. -- borrow for negative components
  58. for i = 1, #c - 1 do
  59. v = c[i]
  60. if v < 0 then
  61. c[i+1] = c[i+1] + fl(v / radix) - 1
  62. v = cmod(v, radix)
  63. if v ~= 0 then
  64. c[i] = v + radix
  65. else
  66. c[i] = v
  67. c[i+1] = c[i+1] + 1
  68. end
  69. end
  70. end
  71. -- is top component negative?
  72. if c[#c] < 0 then
  73. -- switch the sign and fix components
  74. bi.sign = -bi.sign
  75. for i = 1, #c - 1 do
  76. v = c[i]
  77. c[i] = radix - v
  78. c[i+1] = c[i+1] + 1
  79. end
  80. c[#c] = -c[#c]
  81. end
  82. -- carry for components larger than radix
  83. for i = 1, #c do
  84. v = c[i]
  85. if v > radix then
  86. c[i+1] = (c[i+1] or 0) + fl(v / radix)
  87. c[i] = cmod(v, radix)
  88. end
  89. end
  90. -- trim off leading zeros
  91. if not notrunc then
  92. for i = #c, 2, -1 do
  93. if c[i] == 0 then
  94. c[i] = nil
  95. else
  96. break
  97. end
  98. end
  99. end
  100. -- check for -0
  101. if #c == 1 and c[1] == 0 and bi.sign == -1 then
  102. bi.sign = 1
  103. end
  104. end
  105.  
  106. local function negate(a)
  107. local bi = clone(a)
  108. bi.sign = -bi.sign
  109. return bi
  110. end
  111.  
  112. local function compare(a, b)
  113. local ac, bc = a.comps, b.comps
  114. local as, bs = a.sign, b.sign
  115. if ac == bc then
  116. return 0
  117. elseif as > bs then
  118. return 1
  119. elseif as < bs then
  120. return -1
  121. elseif #ac > #bc then
  122. return as
  123. elseif #ac < #bc then
  124. return -as
  125. end
  126. for i = #ac, 1, -1 do
  127. if ac[i] > bc[i] then
  128. return as
  129. elseif ac[i] < bc[i] then
  130. return -as
  131. end
  132. end
  133. return 0
  134. end
  135.  
  136. local function lt(a, b)
  137. return compare(a, b) < 0
  138. end
  139.  
  140. local function eq(a, b)
  141. return compare(a, b) == 0
  142. end
  143.  
  144. local function le(a, b)
  145. return compare(a, b) <= 0
  146. end
  147.  
  148. local function addint(a, n)
  149. local bi = clone(a)
  150. if bi.sign == 1 then
  151. bi.comps[1] = bi.comps[1] + n
  152. else
  153. bi.comps[1] = bi.comps[1] - n
  154. end
  155. normalize(bi)
  156. return bi
  157. end
  158.  
  159. local function add(a, b)
  160. if type(a) == "number" then
  161. return addint(b, a)
  162. elseif type(b) == "number" then
  163. return addint(a, b)
  164. end
  165. local bi = clone(a)
  166. local sign = bi.sign == b.sign
  167. local c = bi.comps
  168. for i = #c + 1, #b.comps do
  169. c[i] = 0
  170. end
  171. local bc = b.comps
  172. for i = 1, #bc do
  173. local v = bc[i]
  174. if sign then
  175. c[i] = c[i] + v
  176. else
  177. c[i] = c[i] - v
  178. end
  179. end
  180. normalize(bi)
  181. return bi
  182. end
  183.  
  184. local function sub(a, b)
  185. if type(b) == "number" then
  186. return addint(a, -b)
  187. elseif type(a) == "number" then
  188. a = bigint(a)
  189. end
  190. return add(a, negate(b))
  191. end
  192.  
  193. local function mulint(a, b)
  194. local bi = clone(a)
  195. if b < 0 then
  196. b = -b
  197. bi.sign = -bi.sign
  198. end
  199. local bc = bi.comps
  200. for i = 1, #bc do
  201. bc[i] = bc[i] * b
  202. end
  203. normalize(bi)
  204. return bi
  205. end
  206.  
  207. local function multiply(a, b)
  208. local bi = alloc()
  209. local c = bi.comps
  210. local ac, bc = a.comps, b.comps
  211. for i = 1, #ac + #bc do
  212. c[i] = 0
  213. end
  214. for i = 1, #ac do
  215. for j = 1, #bc do
  216. c[i+j-1] = c[i+j-1] + ac[i] * bc[j]
  217. end
  218. -- keep the zeroes
  219. normalize(bi, true)
  220. end
  221. normalize(bi)
  222. if bi ~= bigint(0) then
  223. bi.sign = a.sign * b.sign
  224. end
  225. return bi
  226. end
  227.  
  228. local function kmul(a, b)
  229. local ac, bc = a.comps, b.comps
  230. local an, bn = #a.comps, #b.comps
  231. local bi, bj, bk, bl = alloc(), alloc(), alloc(), alloc()
  232. local ic, jc, kc, lc = bi.comps, bj.comps, bk.comps, bl.comps
  233.  
  234. local n = fl((math.max(an, bn) + 1) / 2)
  235. for i = 1, n do
  236. ic[i] = (i + n <= an) and ac[i+n] or 0
  237. jc[i] = (i <= an) and ac[i] or 0
  238. kc[i] = (i + n <= bn) and bc[i+n] or 0
  239. lc[i] = (i <= bn) and bc[i] or 0
  240. end
  241. normalize(bi)
  242. normalize(bj)
  243. normalize(bk)
  244. normalize(bl)
  245. local ik = bi * bk
  246. local jl = bj * bl
  247. local mid = (bi + bj) * (bk + bl) - ik - jl
  248. local mc = mid.comps
  249. local ikc = ik.comps
  250. local jlc = jl.comps
  251. for i = 1, #ikc + n*2 do -- fill it up
  252. jlc[i] = jlc[i] or 0
  253. end
  254. for i = 1, #mc do
  255. jlc[i+n] = jlc[i+n] + mc[i]
  256. end
  257. for i = 1, #ikc do
  258. jlc[i+n*2] = jlc[i+n*2] + ikc[i]
  259. end
  260. jl.sign = a.sign * b.sign
  261. normalize(jl)
  262. return jl
  263. end
  264.  
  265. local kthresh = 12
  266.  
  267. local function mul(a, b)
  268. if type(a) == "number" then
  269. return mulint(b, a)
  270. elseif type(b) == "number" then
  271. return mulint(a, b)
  272. end
  273. if #a.comps < kthresh or #b.comps < kthresh then
  274. return multiply(a, b)
  275. end
  276. return kmul(a, b)
  277. end
  278.  
  279. local function divint(numer, denom)
  280. local bi = clone(numer)
  281. if denom < 0 then
  282. denom = -denom
  283. bi.sign = -bi.sign
  284. end
  285. local r = 0
  286. local c = bi.comps
  287. for i = #c, 1, -1 do
  288. r = r * radix + c[i]
  289. c[i] = fl(r / denom)
  290. r = cmod(r, denom)
  291. end
  292. normalize(bi)
  293. return bi
  294. end
  295.  
  296. local function multi_divide(numer, denom)
  297. local n = #denom.comps
  298. local approx = divint(numer, denom.comps[n])
  299. for i = n, #approx.comps do
  300. approx.comps[i - n + 1] = approx.comps[i]
  301. end
  302. for i = #approx.comps, #approx.comps - n + 2, -1 do
  303. approx.comps[i] = nil
  304. end
  305. local rem = approx * denom - numer
  306. if rem < denom then
  307. quotient = approx
  308. else
  309. quotient = approx - multi_divide(rem, denom)
  310. end
  311. return quotient
  312. end
  313.  
  314. local function multi_divide_wrap(numer, denom)
  315. -- we use a successive approximation method, but it doesn't work
  316. -- if the high order component is too small. adjust if needed.
  317. if denom.comps[#denom.comps] < radix_sqrt then
  318. numer = mulint(numer, radix_sqrt)
  319. denom = mulint(denom, radix_sqrt)
  320. end
  321. return multi_divide(numer, denom)
  322. end
  323.  
  324. local function div(numer, denom)
  325. if type(denom) == "number" then
  326. if denom == 0 then
  327. error("divide by 0", 2)
  328. end
  329. return divint(numer, denom)
  330. elseif type(numer) == "number" then
  331. numer = bigint(numer)
  332. end
  333. -- check signs and trivial cases
  334. local sign = 1
  335. local cmp = compare(denom, bigint(0))
  336. if cmp == 0 then
  337. error("divide by 0", 2)
  338. elseif cmp == -1 then
  339. sign = -sign
  340. denom = negate(denom)
  341. end
  342. cmp = compare(numer, bigint(0))
  343. if cmp == 0 then
  344. return bigint(0)
  345. elseif cmp == -1 then
  346. sign = -sign
  347. numer = negate(numer)
  348. end
  349. cmp = compare(numer, denom)
  350. if cmp == -1 then
  351. return bigint(0)
  352. elseif cmp == 0 then
  353. return bigint(sign)
  354. end
  355. local bi
  356. -- if small enough, do it the easy way
  357. if #denom.comps == 1 then
  358. bi = divint(numer, denom.comps[1])
  359. else
  360. bi = multi_divide_wrap(numer, denom)
  361. end
  362. if sign == -1 then
  363. bi = negate(bi)
  364. end
  365. return bi
  366. end
  367.  
  368. local function intrem(bi, m)
  369. if m < 0 then
  370. m = -m
  371. end
  372. local rad_r = 1
  373. local r = 0
  374. local bc = bi.comps
  375. for i = 1, #bc do
  376. local v = bc[i]
  377. r = cmod(r + v * rad_r, m)
  378. rad_r = cmod(rad_r * radix, m)
  379. end
  380. if bi.sign < 1 then
  381. r = -r
  382. end
  383. return r
  384. end
  385.  
  386. local function intmod(bi, m)
  387. local r = intrem(bi, m)
  388. if r < 0 then
  389. r = r + m
  390. end
  391. return r
  392. end
  393.  
  394. local function rem(bi, m)
  395. if type(m) == "number" then
  396. return bigint(intrem(bi, m))
  397. elseif type(bi) == "number" then
  398. bi = bigint(bi)
  399. end
  400.  
  401. return bi - ((bi / m) * m)
  402. end
  403.  
  404. local function mod(a, m)
  405. local bi = rem(a, m)
  406. if bi.sign == -1 then
  407. bi = bi + m
  408. end
  409. return bi
  410. end
  411.  
  412. local printscale = 10000000
  413. local printscalefmt = string.format("%%.%dd", math.log10(printscale))
  414. local function makestr(bi, s)
  415. if bi >= bigint(printscale) then
  416. makestr(divint(bi, printscale), s)
  417. end
  418. table.insert(s, string.format(printscalefmt, intmod(bi, printscale)))
  419. end
  420.  
  421. local function biginttostring(bi)
  422. local s = {}
  423. if bi < bigint(0) then
  424. bi = negate(bi)
  425. table.insert(s, "-")
  426. end
  427. makestr(bi, s)
  428. s = table.concat(s):gsub("^0*", "")
  429. if s == "" then s = "0" end
  430. return s
  431. end
  432.  
  433. local function biginttonumber(bi)
  434. return tonumber(biginttostring(bi))
  435. end
  436.  
  437. bigintmt = {
  438. __add = add,
  439. __sub = sub,
  440. __mul = mul,
  441. __div = div,
  442. __mod = mod,
  443. __unm = negate,
  444. __eq = eq,
  445. __lt = lt,
  446. __le = le,
  447. __tostring = biginttostring,
  448. }
  449.  
  450. local cache = {}
  451. local ncache = 0
  452.  
  453. function bigint(n)
  454. if cache[n] then
  455. return cache[n]
  456. end
  457. local bi
  458. if type(n) == "string" then
  459. local digits = { n:byte(1, -1) }
  460. for i = 1, #digits do
  461. digits[i] = string.char(digits[i])
  462. end
  463. local start = 1
  464. local sign = 1
  465. if digits[i] == '-' then
  466. sign = -1
  467. start = 2
  468. end
  469. bi = bigint(0)
  470. for i = start, #digits do
  471. bi = addint(mulint(bi, 10), tonumber(digits[i]))
  472. end
  473. bi = mulint(bi, sign)
  474. else
  475. bi = alloc()
  476. bi.comps[1] = n
  477. normalize(bi)
  478. end
  479. if ncache > 100 then
  480. cache = {}
  481. ncache = 0
  482. end
  483. cache[n] = bi
  484. ncache = ncache + 1
  485. return bi
  486. end
  487.  
  488. function isPrime(n)
  489. if type(n) == "number" then
  490. n = bigint(n)
  491. end
  492.  
  493. if n % 2 == bigZero then
  494. return false
  495. end
  496.  
  497. local s, d = 0, n - bigOne
  498. while d % 2 == bigZero do
  499. s, d = s + 1, d / 2
  500. end
  501.  
  502. for i = 1, 3 do
  503. local a = bigRandom(bigint(2), n - 2)
  504. local x = modexp(a, d, n)
  505. if x ~= bigOne and x + 1 ~= n then
  506. for j = 1, s do
  507. x = modexp(x, bigint(2), n)
  508. if x == bigOne then
  509. return false
  510. elseif x == n - 1 then
  511. a = bigZero
  512. break
  513. end
  514. end
  515. if a ~= bigZero then
  516. return false
  517. end
  518. end
  519. end
  520.  
  521. return true
  522. end
  523.  
  524. local function bigRandomWithLength(length, cap)
  525. if not cap then
  526. cap = 999999999
  527. end
  528.  
  529. local randomString = tostring(math.random(100000000, cap))
  530.  
  531. while true do
  532. randomString = randomString ..
  533. tostring(math.random(100000000, cap))
  534. if #randomString >= length then
  535. local finalRandom = randomString:sub(1, length)
  536. if finalRandom:sub(-1, -1) == "2" then
  537. return bigint(finalRandom:sub(1, -2) .. "3")
  538. elseif finalRandom:sub(-1, -1) == "4" then
  539. return bigint(finalRandom:sub(1, -2) .. "5")
  540. elseif finalRandom:sub(-1, -1) == "6" then
  541. return bigint(finalRandom:sub(1, -2) .. "7")
  542. elseif finalRandom:sub(-1, -1) == "8" then
  543. return bigint(finalRandom:sub(1, -2) .. "9")
  544. elseif finalRandom:sub(-1, -1) == "0" then
  545. return bigint(finalRandom:sub(1, -2) .. "1")
  546. else
  547. return bigint(finalRandom)
  548. end
  549. end
  550. end
  551. end
  552.  
  553. function generateLargePrime()
  554. local i = 0
  555. while true do
  556. local randomNumber = bigRandomWithLength(39)
  557.  
  558. if isPrime(randomNumber) then
  559. return randomNumber
  560. end
  561. end
  562. end
  563.  
  564. function generatePQ(e)
  565. local randomPrime
  566. while true do
  567. randomPrime = generateLargePrime()
  568. if gcd(e, randomPrime - 1) == bigOne then
  569. return randomPrime
  570. end
  571. end
  572. end
  573.  
  574. --
  575. -- Start of my code
  576. --
  577.  
  578. local powersTwo = {
  579. bigint("2"),
  580. bigint("4"),
  581. bigint("8"),
  582. bigint("16"),
  583. bigint("32"),
  584. bigint("64"),
  585. bigint("128"),
  586. bigint("256"),
  587. bigint("512"),
  588. bigint("1024"),
  589. bigint("2048"),
  590. bigint("4096"),
  591. bigint("8192"),
  592. bigint("16384"),
  593. bigint("32768"),
  594. bigint("65536"),
  595. bigint("131072"),
  596. bigint("262144"),
  597. bigint("524288"),
  598. bigint("1048576"),
  599. bigint("2097152"),
  600. bigint("4194304"),
  601. bigint("8388608"),
  602. bigint("16777216"),
  603. bigint("33554432"),
  604. bigint("67108864"),
  605. bigint("134217728"),
  606. bigint("268435456"),
  607. bigint("536870912"),
  608. bigint("1073741824"),
  609. bigint("2147483648"),
  610. bigint("4294967296"),
  611. bigint("8589934592"),
  612. bigint("17179869184"),
  613. bigint("34359738368"),
  614. bigint("68719476736"),
  615. bigint("137438953472"),
  616. bigint("274877906944"),
  617. bigint("549755813888"),
  618. bigint("1099511627776"),
  619. bigint("2199023255552"),
  620. bigint("4398046511104"),
  621. bigint("8796093022208"),
  622. bigint("17592186044416"),
  623. bigint("35184372088832"),
  624. bigint("70368744177664"),
  625. bigint("140737488355328"),
  626. bigint("281474976710656"),
  627. bigint("562949953421312"),
  628. bigint("1125899906842624"),
  629. bigint("2251799813685248"),
  630. bigint("4503599627370496"),
  631. bigint("9007199254740992"),
  632. bigint("18014398509481984"),
  633. bigint("36028797018963968"),
  634. bigint("72057594037927936"),
  635. bigint("144115188075855872"),
  636. bigint("288230376151711744"),
  637. bigint("576460752303423488"),
  638. bigint("1152921504606846976"),
  639. bigint("2305843009213693952"),
  640. bigint("4611686018427387904"),
  641. bigint("9223372036854775808"),
  642. bigint("18446744073709551616"),
  643. bigint("36893488147419103232"),
  644. bigint("73786976294838206464"),
  645. bigint("147573952589676412928"),
  646. bigint("295147905179352825856"),
  647. bigint("590295810358705651712"),
  648. bigint("1180591620717411303424"),
  649. bigint("2361183241434822606848"),
  650. bigint("4722366482869645213696"),
  651. bigint("9444732965739290427392"),
  652. bigint("18889465931478580854784"),
  653. bigint("37778931862957161709568"),
  654. bigint("75557863725914323419136"),
  655. bigint("151115727451828646838272"),
  656. bigint("302231454903657293676544"),
  657. bigint("604462909807314587353088"),
  658. bigint("1208925819614629174706176"),
  659. bigint("2417851639229258349412352"),
  660. bigint("4835703278458516698824704"),
  661. bigint("9671406556917033397649408"),
  662. bigint("19342813113834066795298816"),
  663. bigint("38685626227668133590597632"),
  664. bigint("77371252455336267181195264"),
  665. bigint("154742504910672534362390528"),
  666. bigint("309485009821345068724781056"),
  667. bigint("618970019642690137449562112"),
  668. bigint("1237940039285380274899124224"),
  669. bigint("2475880078570760549798248448"),
  670. bigint("4951760157141521099596496896"),
  671. bigint("9903520314283042199192993792"),
  672. bigint("19807040628566084398385987584"),
  673. bigint("39614081257132168796771975168"),
  674. bigint("79228162514264337593543950336"),
  675. bigint("158456325028528675187087900672"),
  676. bigint("316912650057057350374175801344"),
  677. bigint("633825300114114700748351602688"),
  678. bigint("1267650600228229401496703205376"),
  679. bigint("2535301200456458802993406410752"),
  680. bigint("5070602400912917605986812821504"),
  681. bigint("10141204801825835211973625643008"),
  682. bigint("20282409603651670423947251286016"),
  683. bigint("40564819207303340847894502572032"),
  684. bigint("81129638414606681695789005144064"),
  685. bigint("162259276829213363391578010288128"),
  686. bigint("324518553658426726783156020576256"),
  687. bigint("649037107316853453566312041152512"),
  688. bigint("1298074214633706907132624082305024"),
  689. bigint("2596148429267413814265248164610048"),
  690. bigint("5192296858534827628530496329220096"),
  691. bigint("10384593717069655257060992658440192"),
  692. bigint("20769187434139310514121985316880384"),
  693. bigint("41538374868278621028243970633760768"),
  694. bigint("83076749736557242056487941267521536"),
  695. bigint("166153499473114484112975882535043072"),
  696. bigint("332306998946228968225951765070086144"),
  697. bigint("664613997892457936451903530140172288"),
  698. bigint("1329227995784915872903807060280344576"),
  699. bigint("2658455991569831745807614120560689152"),
  700. bigint("5316911983139663491615228241121378304"),
  701. bigint("10633823966279326983230456482242756608"),
  702. bigint("21267647932558653966460912964485513216"),
  703. bigint("42535295865117307932921825928971026432"),
  704. bigint("85070591730234615865843651857942052864"),
  705. bigint("170141183460469231731687303715884105728"),
  706. bigint("340282366920938463463374607431768211456"),
  707. bigint("680564733841876926926749214863536422912"),
  708. bigint("1361129467683753853853498429727072845824"),
  709. bigint("2722258935367507707706996859454145691648"),
  710. bigint("5444517870735015415413993718908291383296"),
  711. bigint("10889035741470030830827987437816582766592"),
  712. bigint("21778071482940061661655974875633165533184"),
  713. bigint("43556142965880123323311949751266331066368"),
  714. bigint("87112285931760246646623899502532662132736"),
  715. bigint("174224571863520493293247799005065324265472"),
  716. bigint("348449143727040986586495598010130648530944"),
  717. bigint("696898287454081973172991196020261297061888"),
  718. bigint("1393796574908163946345982392040522594123776"),
  719. bigint("2787593149816327892691964784081045188247552"),
  720. bigint("5575186299632655785383929568162090376495104"),
  721. bigint("11150372599265311570767859136324180752990208"),
  722. bigint("22300745198530623141535718272648361505980416"),
  723. bigint("44601490397061246283071436545296723011960832"),
  724. bigint("89202980794122492566142873090593446023921664"),
  725. bigint("178405961588244985132285746181186892047843328"),
  726. bigint("356811923176489970264571492362373784095686656"),
  727. bigint("713623846352979940529142984724747568191373312"),
  728. bigint("1427247692705959881058285969449495136382746624"),
  729. bigint("2854495385411919762116571938898990272765493248"),
  730. bigint("5708990770823839524233143877797980545530986496"),
  731. bigint("11417981541647679048466287755595961091061972992"),
  732. bigint("22835963083295358096932575511191922182123945984"),
  733. bigint("45671926166590716193865151022383844364247891968"),
  734. bigint("91343852333181432387730302044767688728495783936"),
  735. bigint("182687704666362864775460604089535377456991567872"),
  736. bigint("365375409332725729550921208179070754913983135744"),
  737. bigint("730750818665451459101842416358141509827966271488"),
  738. bigint("1461501637330902918203684832716283019655932542976"),
  739. bigint("2923003274661805836407369665432566039311865085952"),
  740. bigint("5846006549323611672814739330865132078623730171904"),
  741. bigint("11692013098647223345629478661730264157247460343808"),
  742. bigint("23384026197294446691258957323460528314494920687616"),
  743. bigint("46768052394588893382517914646921056628989841375232"),
  744. bigint("93536104789177786765035829293842113257979682750464"),
  745. bigint("187072209578355573530071658587684226515959365500928"),
  746. bigint("374144419156711147060143317175368453031918731001856"),
  747. bigint("748288838313422294120286634350736906063837462003712"),
  748. bigint("1496577676626844588240573268701473812127674924007424"),
  749. bigint("2993155353253689176481146537402947624255349848014848"),
  750. bigint("5986310706507378352962293074805895248510699696029696"),
  751. bigint("11972621413014756705924586149611790497021399392059392"),
  752. bigint("23945242826029513411849172299223580994042798784118784"),
  753. bigint("47890485652059026823698344598447161988085597568237568"),
  754. bigint("95780971304118053647396689196894323976171195136475136"),
  755. bigint("191561942608236107294793378393788647952342390272950272"),
  756. bigint("383123885216472214589586756787577295904684780545900544"),
  757. bigint("766247770432944429179173513575154591809369561091801088"),
  758. bigint("1532495540865888858358347027150309183618739122183602176"),
  759. bigint("3064991081731777716716694054300618367237478244367204352"),
  760. bigint("6129982163463555433433388108601236734474956488734408704"),
  761. bigint("12259964326927110866866776217202473468949912977468817408"),
  762. bigint("24519928653854221733733552434404946937899825954937634816"),
  763. bigint("49039857307708443467467104868809893875799651909875269632"),
  764. bigint("98079714615416886934934209737619787751599303819750539264"),
  765. bigint("196159429230833773869868419475239575503198607639501078528"),
  766. bigint("392318858461667547739736838950479151006397215279002157056"),
  767. bigint("784637716923335095479473677900958302012794430558004314112"),
  768. bigint("1569275433846670190958947355801916604025588861116008628224"),
  769. bigint("3138550867693340381917894711603833208051177722232017256448"),
  770. bigint("6277101735386680763835789423207666416102355444464034512896"),
  771. bigint("12554203470773361527671578846415332832204710888928069025792"),
  772. bigint("25108406941546723055343157692830665664409421777856138051584"),
  773. bigint("50216813883093446110686315385661331328818843555712276103168"),
  774. bigint("100433627766186892221372630771322662657637687111424552206336"),
  775. bigint("200867255532373784442745261542645325315275374222849104412672"),
  776. bigint("401734511064747568885490523085290650630550748445698208825344"),
  777. bigint("803469022129495137770981046170581301261101496891396417650688"),
  778. bigint("1606938044258990275541962092341162602522202993782792835301376"),
  779. bigint("3213876088517980551083924184682325205044405987565585670602752"),
  780. bigint("6427752177035961102167848369364650410088811975131171341205504"),
  781. bigint("12855504354071922204335696738729300820177623950262342682411008"),
  782. bigint("25711008708143844408671393477458601640355247900524685364822016"),
  783. bigint("51422017416287688817342786954917203280710495801049370729644032"),
  784. bigint("102844034832575377634685573909834406561420991602098741459288064"),
  785. bigint("205688069665150755269371147819668813122841983204197482918576128"),
  786. bigint("411376139330301510538742295639337626245683966408394965837152256"),
  787. bigint("822752278660603021077484591278675252491367932816789931674304512"),
  788. bigint("1645504557321206042154969182557350504982735865633579863348609024"),
  789. bigint("3291009114642412084309938365114701009965471731267159726697218048"),
  790. bigint("6582018229284824168619876730229402019930943462534319453394436096"),
  791. bigint("13164036458569648337239753460458804039861886925068638906788872192"),
  792. bigint("26328072917139296674479506920917608079723773850137277813577744384"),
  793. bigint("52656145834278593348959013841835216159447547700274555627155488768"),
  794. bigint("105312291668557186697918027683670432318895095400549111254310977536"),
  795. bigint("210624583337114373395836055367340864637790190801098222508621955072"),
  796. bigint("421249166674228746791672110734681729275580381602196445017243910144"),
  797. bigint("842498333348457493583344221469363458551160763204392890034487820288"),
  798. bigint("1684996666696914987166688442938726917102321526408785780068975640576"),
  799. bigint("3369993333393829974333376885877453834204643052817571560137951281152"),
  800. bigint("6739986666787659948666753771754907668409286105635143120275902562304"),
  801. bigint("13479973333575319897333507543509815336818572211270286240551805124608"),
  802. bigint("26959946667150639794667015087019630673637144422540572481103610249216"),
  803. bigint("53919893334301279589334030174039261347274288845081144962207220498432"),
  804. bigint("107839786668602559178668060348078522694548577690162289924414440996864"),
  805. bigint("215679573337205118357336120696157045389097155380324579848828881993728"),
  806. bigint("431359146674410236714672241392314090778194310760649159697657763987456"),
  807. bigint("862718293348820473429344482784628181556388621521298319395315527974912"),
  808. bigint("1725436586697640946858688965569256363112777243042596638790631055949824"),
  809. bigint("3450873173395281893717377931138512726225554486085193277581262111899648"),
  810. bigint("6901746346790563787434755862277025452451108972170386555162524223799296"),
  811. bigint("13803492693581127574869511724554050904902217944340773110325048447598592"),
  812. bigint("27606985387162255149739023449108101809804435888681546220650096895197184"),
  813. bigint("55213970774324510299478046898216203619608871777363092441300193790394368"),
  814. bigint("110427941548649020598956093796432407239217743554726184882600387580788736"),
  815. bigint("220855883097298041197912187592864814478435487109452369765200775161577472"),
  816. bigint("441711766194596082395824375185729628956870974218904739530401550323154944"),
  817. bigint("883423532389192164791648750371459257913741948437809479060803100646309888"),
  818. bigint("1766847064778384329583297500742918515827483896875618958121606201292619776"),
  819. bigint("3533694129556768659166595001485837031654967793751237916243212402585239552"),
  820. bigint("7067388259113537318333190002971674063309935587502475832486424805170479104"),
  821. bigint("14134776518227074636666380005943348126619871175004951664972849610340958208"),
  822. bigint("28269553036454149273332760011886696253239742350009903329945699220681916416"),
  823. bigint("56539106072908298546665520023773392506479484700019806659891398441363832832"),
  824. bigint("113078212145816597093331040047546785012958969400039613319782796882727665664"),
  825. bigint("226156424291633194186662080095093570025917938800079226639565593765455331328"),
  826. bigint("452312848583266388373324160190187140051835877600158453279131187530910662656"),
  827. bigint("904625697166532776746648320380374280103671755200316906558262375061821325312"),
  828. bigint("1809251394333065553493296640760748560207343510400633813116524750123642650624"),
  829. bigint("3618502788666131106986593281521497120414687020801267626233049500247285301248"),
  830. bigint("7237005577332262213973186563042994240829374041602535252466099000494570602496"),
  831. bigint("14474011154664524427946373126085988481658748083205070504932198000989141204992"),
  832. bigint("28948022309329048855892746252171976963317496166410141009864396001978282409984"),
  833. bigint("57896044618658097711785492504343953926634992332820282019728792003956564819968"),
  834. bigint("115792089237316195423570985008687907853269984665640564039457584007913129639936"),
  835. }
  836.  
  837. powersTwo[0] = bigint("1")
  838.  
  839. local bigZero = bigint(0)
  840. local bigOne = bigint(1)
  841.  
  842. function numberToBytes(num, bits, byteSize)
  843. if bits > #powersTwo then
  844. error("Too many bits. Must be <= " .. #powersTwo .. ".")
  845. end
  846.  
  847. num = bigint(num)
  848.  
  849. local resultBits = {}
  850. resultBits[1] = {}
  851. for i = bits - 1, 0, -1 do
  852. local expVal = powersTwo[i]
  853. local resultant = num - expVal
  854. if expVal <= resultant then
  855. -- Invalid data!
  856. return nil
  857. end
  858.  
  859. if resultant < bigZero then
  860. -- A zero bit
  861. if #(resultBits[#resultBits]) >= byteSize then
  862. table.insert(resultBits, {0})
  863. else
  864. table.insert(resultBits[#resultBits], 0)
  865. end
  866. else
  867. -- A one bit
  868. num = resultant
  869. if #(resultBits[#resultBits]) >= byteSize then
  870. table.insert(resultBits, {1})
  871. else
  872. table.insert(resultBits[#resultBits], 1)
  873. end
  874. end
  875.  
  876. if num == bigint(0) then
  877. break
  878. end
  879. end
  880.  
  881. local results = {}
  882. for _, binarySeq in pairs(resultBits) do
  883. local thisResult = 0
  884. for k, bin in pairs(binarySeq) do
  885. if bin == 1 then
  886. thisResult = thisResult + 2^(byteSize - k)
  887. end
  888. end
  889. table.insert(results, thisResult)
  890. end
  891.  
  892. return results
  893. end
  894.  
  895. function bytesToNumber(bytes, bits, byteSize)
  896. if bits > #powersTwo then
  897. error("Too many bits. Must be <= " .. #powersTwo .. ".")
  898. end
  899.  
  900. if #bytes > bits/byteSize then
  901. error("Too many bytes to store into the number of bits available. Must be <= " ..
  902. bits/byteSize .. ".")
  903. end
  904.  
  905. local binary = {}
  906. for _, byte in pairs(bytes) do
  907. for i = byteSize - 1, 0, -1 do
  908. if byte - (2 ^ i) < 0 then
  909. table.insert(binary, 0)
  910. else
  911. table.insert(binary, 1)
  912. byte = byte - (2 ^ i)
  913. end
  914. end
  915. end
  916.  
  917. local num = bigint(0)
  918. for i = 1, #binary do
  919. if binary[i] == 1 then
  920. num = num + powersTwo[bits - i]
  921. end
  922. end
  923.  
  924. return tostring(num)
  925. end
  926.  
  927. function encodeBigNumbers(numbers)
  928. for k, v in pairs(numbers) do
  929. numbers[k] = tostring(v)
  930. end
  931. return numbers
  932. end
  933.  
  934. function stringToBytes(str)
  935. local result = {}
  936. for i = 1, #str do
  937. table.insert(result, string.byte(str, i))
  938. end
  939. return result
  940. end
  941.  
  942. function bytesToString(bytes)
  943. local str = ""
  944. for _, v in pairs(bytes) do
  945. str = str .. string.char(v)
  946. end
  947. return str
  948. end
  949.  
  950. function modexp(base, exponent, modulus)
  951. local r = 1
  952.  
  953. while true do
  954. if exponent % 2 == bigOne then
  955. r = r * base % modulus
  956. end
  957. exponent = exponent / 2
  958.  
  959. if exponent == bigZero then
  960. break
  961. end
  962. base = base * base % modulus
  963. end
  964.  
  965. return r
  966. end
  967.  
  968. function crypt(key, number)
  969. local exp
  970. if key.public then
  971. exp = bigint(key.public)
  972. else
  973. exp = bigint(key.private)
  974. end
  975.  
  976. return tostring(modexp(bigint(number), exp, bigint(key.shared)))
  977. end
Add Comment
Please, Sign In to add comment