Advertisement
Guest User

Untitled

a guest
Apr 12th, 2023
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 11.21 KB | Source Code | 0 0
  1. --  _VERSION     = "md5.lua 1.1.0",
  2. --  _DESCRIPTION = "MD5 computation in Lua (5.1-3, LuaJIT)",
  3. --  _URL         = "https://github.com/kikito/md5.lua",
  4.  
  5. local md5 = {}
  6.  
  7. -- bit lib implementions
  8.  
  9. local char, byte, format, rep, sub = string.char, string.byte, string.format, string.rep, string.sub
  10. local bit_or, bit_and, bit_not, bit_xor, bit_rshift, bit_lshift
  11.  
  12. local function tbl2number(tbl)
  13.   local result = 0
  14.   local power = 1
  15.   for i = 1, #tbl do
  16.     result = result + tbl[i] * power
  17.     power = power * 2
  18.   end
  19.   return result
  20. end
  21.  
  22. local function expand(t1, t2)
  23.   local big, small = t1, t2
  24.   if(#big < #small) then
  25.     big, small = small, big
  26.   end
  27.   -- expand small
  28.   for i = #small + 1, #big do
  29.     small[i] = 0
  30.   end
  31. end
  32.  
  33. local to_bits -- needs to be declared before bit_not
  34.  
  35. bit_not = function(n)
  36.   local tbl = to_bits(n)
  37.   local size = math.max(#tbl, 32)
  38.   for i = 1, size do
  39.     if(tbl[i] == 1) then
  40.       tbl[i] = 0
  41.     else
  42.       tbl[i] = 1
  43.     end
  44.   end
  45.   return tbl2number(tbl)
  46. end
  47.  
  48. -- defined as local above
  49. to_bits = function (n)
  50.   if(n < 0) then
  51.     -- negative
  52.     return to_bits(bit_not(math.abs(n)) + 1)
  53.   end
  54.   -- to bits table
  55.   local tbl = {}
  56.   local cnt = 1
  57.   local last
  58.   while n > 0 do
  59.     last      = n % 2
  60.     tbl[cnt]  = last
  61.     n         = (n-last)/2
  62.     cnt       = cnt + 1
  63.   end
  64.  
  65.   return tbl
  66. end
  67.  
  68. bit_or = function(m, n)
  69.   local tbl_m = to_bits(m)
  70.   local tbl_n = to_bits(n)
  71.   expand(tbl_m, tbl_n)
  72.  
  73.   local tbl = {}
  74.   for i = 1, #tbl_m do
  75.     if(tbl_m[i]== 0 and tbl_n[i] == 0) then
  76.       tbl[i] = 0
  77.     else
  78.       tbl[i] = 1
  79.     end
  80.   end
  81.  
  82.   return tbl2number(tbl)
  83. end
  84.  
  85. bit_and = function(m, n)
  86.   local tbl_m = to_bits(m)
  87.   local tbl_n = to_bits(n)
  88.   expand(tbl_m, tbl_n)
  89.  
  90.   local tbl = {}
  91.   for i = 1, #tbl_m do
  92.     if(tbl_m[i]== 0 or tbl_n[i] == 0) then
  93.       tbl[i] = 0
  94.     else
  95.       tbl[i] = 1
  96.     end
  97.   end
  98.  
  99.   return tbl2number(tbl)
  100. end
  101.  
  102. bit_xor = function(m, n)
  103.   local tbl_m = to_bits(m)
  104.   local tbl_n = to_bits(n)
  105.   expand(tbl_m, tbl_n)
  106.  
  107.   local tbl = {}
  108.   for i = 1, #tbl_m do
  109.     if(tbl_m[i] ~= tbl_n[i]) then
  110.       tbl[i] = 1
  111.     else
  112.       tbl[i] = 0
  113.     end
  114.   end
  115.  
  116.   return tbl2number(tbl)
  117. end
  118.  
  119. bit_rshift = function(n, bits)
  120.   local high_bit = 0
  121.   if(n < 0) then
  122.     -- negative
  123.     n = bit_not(math.abs(n)) + 1
  124.     high_bit = 0x80000000
  125.   end
  126.  
  127.   local floor = math.floor
  128.  
  129.   for i=1, bits do
  130.     n = n/2
  131.     n = bit_or(floor(n), high_bit)
  132.   end
  133.   return floor(n)
  134. end
  135.  
  136. bit_lshift = function(n, bits)
  137.   if(n < 0) then
  138.     -- negative
  139.     n = bit_not(math.abs(n)) + 1
  140.   end
  141.  
  142.   for i=1, bits do
  143.     n = n*2
  144.   end
  145.   return bit_and(n, 0xFFFFFFFF)
  146. end
  147.  
  148. -- convert little-endian 32-bit int to a 4-char string
  149. local lei2str
  150. -- function is defined this way to allow full jit compilation (removing UCLO instruction in LuaJIT)
  151. lei2str = function (i)
  152.   local f=function (s) return char( bit_and( bit_rshift(i, s), 255)) end
  153.   return f(0)..f(8)..f(16)..f(24)
  154. end
  155.  
  156. -- convert raw string to big-endian int
  157. local function str2bei(s)
  158.   local v=0
  159.   for i=1, #s do
  160.     v = v * 256 + byte(s, i)
  161.   end
  162.   return v
  163. end
  164.  
  165. -- convert raw string to little-endian int
  166. local str2lei
  167.  
  168. str2lei = function(s)
  169.   local v=0
  170.   for i = #s,1,-1 do
  171.     v = v*256 + byte(s, i)
  172.   end
  173.   return v
  174.   end
  175.  
  176. -- cut up a string in little-endian ints of given size
  177. local function cut_le_str(s)
  178.   return {
  179.     str2lei(sub(s, 1, 4)),
  180.     str2lei(sub(s, 5, 8)),
  181.     str2lei(sub(s, 9, 12)),
  182.     str2lei(sub(s, 13, 16)),
  183.     str2lei(sub(s, 17, 20)),
  184.     str2lei(sub(s, 21, 24)),
  185.     str2lei(sub(s, 25, 28)),
  186.     str2lei(sub(s, 29, 32)),
  187.     str2lei(sub(s, 33, 36)),
  188.     str2lei(sub(s, 37, 40)),
  189.     str2lei(sub(s, 41, 44)),
  190.     str2lei(sub(s, 45, 48)),
  191.     str2lei(sub(s, 49, 52)),
  192.     str2lei(sub(s, 53, 56)),
  193.     str2lei(sub(s, 57, 60)),
  194.     str2lei(sub(s, 61, 64)),
  195.   }
  196. end
  197.  
  198. -- An MD5 mplementation in Lua, requires bitlib (hacked to use LuaBit from above, ugh)
  199. -- 10/02/2001 [email protected]
  200.  
  201. local CONSTS = {
  202.   0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee,
  203.   0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501,
  204.   0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be,
  205.   0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821,
  206.   0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa,
  207.   0xd62f105d, 0x02441453, 0xd8a1e681, 0xe7d3fbc8,
  208.   0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed,
  209.   0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a,
  210.   0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c,
  211.   0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70,
  212.   0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x04881d05,
  213.   0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665,
  214.   0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039,
  215.   0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1,
  216.   0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1,
  217.   0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391,
  218.   0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476
  219. }
  220.  
  221. local f=function (x,y,z) return bit_or(bit_and(x,y),bit_and(-x-1,z)) end
  222. local g=function (x,y,z) return bit_or(bit_and(x,z),bit_and(y,-z-1)) end
  223. local h=function (x,y,z) return bit_xor(x,bit_xor(y,z)) end
  224. local i=function (x,y,z) return bit_xor(y,bit_or(x,-z-1)) end
  225. local z=function (ff,a,b,c,d,x,s,ac)
  226.   a=bit_and(a+ff(b,c,d)+x+ac,0xFFFFFFFF)
  227.   -- be *very* careful that left shift does not cause rounding!
  228.   return bit_or(bit_lshift(bit_and(a,bit_rshift(0xFFFFFFFF,s)),s),bit_rshift(a,32-s))+b
  229. end
  230.  
  231. local function transform(A,B,C,D,X)
  232.   local a,b,c,d=A,B,C,D
  233.   local t=CONSTS
  234.  
  235.   a=z(f,a,b,c,d,X[ 0], 7,t[ 1])
  236.   d=z(f,d,a,b,c,X[ 1],12,t[ 2])
  237.   c=z(f,c,d,a,b,X[ 2],17,t[ 3])
  238.   b=z(f,b,c,d,a,X[ 3],22,t[ 4])
  239.   a=z(f,a,b,c,d,X[ 4], 7,t[ 5])
  240.   d=z(f,d,a,b,c,X[ 5],12,t[ 6])
  241.   c=z(f,c,d,a,b,X[ 6],17,t[ 7])
  242.   b=z(f,b,c,d,a,X[ 7],22,t[ 8])
  243.   a=z(f,a,b,c,d,X[ 8], 7,t[ 9])
  244.   d=z(f,d,a,b,c,X[ 9],12,t[10])
  245.   c=z(f,c,d,a,b,X[10],17,t[11])
  246.   b=z(f,b,c,d,a,X[11],22,t[12])
  247.   a=z(f,a,b,c,d,X[12], 7,t[13])
  248.   d=z(f,d,a,b,c,X[13],12,t[14])
  249.   c=z(f,c,d,a,b,X[14],17,t[15])
  250.   b=z(f,b,c,d,a,X[15],22,t[16])
  251.  
  252.   a=z(g,a,b,c,d,X[ 1], 5,t[17])
  253.   d=z(g,d,a,b,c,X[ 6], 9,t[18])
  254.   c=z(g,c,d,a,b,X[11],14,t[19])
  255.   b=z(g,b,c,d,a,X[ 0],20,t[20])
  256.   a=z(g,a,b,c,d,X[ 5], 5,t[21])
  257.   d=z(g,d,a,b,c,X[10], 9,t[22])
  258.   c=z(g,c,d,a,b,X[15],14,t[23])
  259.   b=z(g,b,c,d,a,X[ 4],20,t[24])
  260.   a=z(g,a,b,c,d,X[ 9], 5,t[25])
  261.   d=z(g,d,a,b,c,X[14], 9,t[26])
  262.   c=z(g,c,d,a,b,X[ 3],14,t[27])
  263.   b=z(g,b,c,d,a,X[ 8],20,t[28])
  264.   a=z(g,a,b,c,d,X[13], 5,t[29])
  265.   d=z(g,d,a,b,c,X[ 2], 9,t[30])
  266.   c=z(g,c,d,a,b,X[ 7],14,t[31])
  267.   b=z(g,b,c,d,a,X[12],20,t[32])
  268.  
  269.   a=z(h,a,b,c,d,X[ 5], 4,t[33])
  270.   d=z(h,d,a,b,c,X[ 8],11,t[34])
  271.   c=z(h,c,d,a,b,X[11],16,t[35])
  272.   b=z(h,b,c,d,a,X[14],23,t[36])
  273.   a=z(h,a,b,c,d,X[ 1], 4,t[37])
  274.   d=z(h,d,a,b,c,X[ 4],11,t[38])
  275.   c=z(h,c,d,a,b,X[ 7],16,t[39])
  276.   b=z(h,b,c,d,a,X[10],23,t[40])
  277.   a=z(h,a,b,c,d,X[13], 4,t[41])
  278.   d=z(h,d,a,b,c,X[ 0],11,t[42])
  279.   c=z(h,c,d,a,b,X[ 3],16,t[43])
  280.   b=z(h,b,c,d,a,X[ 6],23,t[44])
  281.   a=z(h,a,b,c,d,X[ 9], 4,t[45])
  282.   d=z(h,d,a,b,c,X[12],11,t[46])
  283.   c=z(h,c,d,a,b,X[15],16,t[47])
  284.   b=z(h,b,c,d,a,X[ 2],23,t[48])
  285.  
  286.   a=z(i,a,b,c,d,X[ 0], 6,t[49])
  287.   d=z(i,d,a,b,c,X[ 7],10,t[50])
  288.   c=z(i,c,d,a,b,X[14],15,t[51])
  289.   b=z(i,b,c,d,a,X[ 5],21,t[52])
  290.   a=z(i,a,b,c,d,X[12], 6,t[53])
  291.   d=z(i,d,a,b,c,X[ 3],10,t[54])
  292.   c=z(i,c,d,a,b,X[10],15,t[55])
  293.   b=z(i,b,c,d,a,X[ 1],21,t[56])
  294.   a=z(i,a,b,c,d,X[ 8], 6,t[57])
  295.   d=z(i,d,a,b,c,X[15],10,t[58])
  296.   c=z(i,c,d,a,b,X[ 6],15,t[59])
  297.   b=z(i,b,c,d,a,X[13],21,t[60])
  298.   a=z(i,a,b,c,d,X[ 4], 6,t[61])
  299.   d=z(i,d,a,b,c,X[11],10,t[62])
  300.   c=z(i,c,d,a,b,X[ 2],15,t[63])
  301.   b=z(i,b,c,d,a,X[ 9],21,t[64])
  302.  
  303.   return bit_and(A+a,0xFFFFFFFF),bit_and(B+b,0xFFFFFFFF),
  304.          bit_and(C+c,0xFFFFFFFF),bit_and(D+d,0xFFFFFFFF)
  305. end
  306.  
  307. ----------------------------------------------------------------
  308.  
  309. local function md5_update(self, s)
  310.   self.pos = self.pos + #s
  311.   s = self.buf .. s
  312.   for ii = 1, #s - 63, 64 do
  313.     local X = cut_le_str(sub(s,ii,ii+63))
  314.     assert(#X == 16)
  315.     X[0] = table.remove(X,1) -- zero based!
  316.     self.a,self.b,self.c,self.d = transform(self.a,self.b,self.c,self.d,X)
  317.   end
  318.   self.buf = sub(s, math.floor(#s/64)*64 + 1, #s)
  319.   return self
  320. end
  321.  
  322. local function md5_finish(self)
  323.   local msgLen = self.pos
  324.   local padLen = 56 - msgLen % 64
  325.  
  326.   if msgLen % 64 > 56 then padLen = padLen + 64 end
  327.  
  328.   if padLen == 0 then padLen = 64 end
  329.  
  330.   local s = char(128) .. rep(char(0),padLen-1) .. lei2str(bit_and(8*msgLen, 0xFFFFFFFF)) .. lei2str(math.floor(msgLen/0x20000000))
  331.   md5_update(self, s)
  332.  
  333.   assert(self.pos % 64 == 0)
  334.   return lei2str(self.a) .. lei2str(self.b) .. lei2str(self.c) .. lei2str(self.d)
  335. end
  336.  
  337. ----------------------------------------------------------------
  338.  
  339. function md5.new()
  340.   return { a = CONSTS[65], b = CONSTS[66], c = CONSTS[67], d = CONSTS[68],
  341.            pos = 0,
  342.            buf = '',
  343.            update = md5_update,
  344.            finish = md5_finish }
  345. end
  346.  
  347. function md5.tohex(s)
  348.   return format("%08x%08x%08x%08x", str2bei(sub(s, 1, 4)), str2bei(sub(s, 5, 8)), str2bei(sub(s, 9, 12)), str2bei(sub(s, 13, 16)))
  349. end
  350.  
  351. function md5.sum(s)
  352.   return md5.new():update(s):finish()
  353. end
  354.  
  355. function md5.sumhexa(s)
  356.   return md5.tohex(md5.sum(s))
  357. end
  358.  
  359. --------------------------------------------------------------------------------
  360.  
  361. local hours = 10
  362. local minutes = 16
  363. local secretSalt = "SecretSaltString"
  364. local nickname = "MyNick"
  365.  
  366. function getHashes(nickname, hours, minutes, salt)
  367.     -- Считаем время на одну минуту назад
  368.     local prevHours = hours
  369.     local prevMinutes = minutes
  370.     if minutes == 0 then
  371.         prevMinutes = 59
  372.         if hours == 0 then
  373.             prevHours = 23
  374.         else
  375.             prevHours = hours - 1
  376.         end
  377.     else
  378.         prevMinutes = minutes - 1
  379.     end
  380.     -- Вычисляем первый хеш, без него можно набрутить простой SecretSaltString
  381.     local saltMsg1 = string.format("H%sM%sS%s", hours, minutes, salt)
  382.     local saltMsg2 = string.format("H%sM%sS%s", prevHours, prevMinutes, salt)
  383.     local saltHash1 = md5.sumhexa(saltMsg1)
  384.     local saltHash2 = md5.sumhexa(saltMsg2)
  385.     -- Вычисляем второй хеш
  386.     local msg1 = nickname .. saltHash1
  387.     local msg2 = nickname .. saltHash2
  388.     local hash1 = md5.sum(msg1)
  389.     local hash2 = md5.sum(msg2)
  390.     -- Берем первые четыре байта каждого хеша и переводим в число
  391.     local hash1byte1 = hash1:byte(1)
  392.     local hash1byte2 = hash1:byte(2)
  393.     local hash1byte3 = hash1:byte(3)
  394.     local hash1byte4 = hash1:byte(4)
  395.     local hash2byte1 = hash2:byte(1)
  396.     local hash2byte2 = hash2:byte(2)
  397.     local hash2byte3 = hash2:byte(3)
  398.     local hash2byte4 = hash2:byte(4)
  399.     local hash1number = (hash1byte1*(2^24)) + (hash1byte2*(2^16)) + (hash1byte3*(2^8)) + hash1byte4
  400.     local hash2number = (hash2byte1*(2^24)) + (hash2byte2*(2^16)) + (hash2byte3*(2^8)) + hash2byte4
  401.     -- Берем младшие 6 чисел каждого хеша
  402.     local hash1 = hash1number % 1000000
  403.     local hash2 = hash2number % 1000000
  404.     return hash1, hash2
  405. end
  406.  
  407. local hash, prevHash = getHashes(nickname, hours, minutes, secretSalt)
  408. print(hash, prevHash)
  409. minutes = minutes + 1
  410. hash, prevHash = getHashes(nickname, hours, minutes, secretSalt)
  411. print(hash, prevHash)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement