#!/usr/bin/env ruby seed = '31416406127362175889' user = 'jmerchat' pass = 'foobar' passh = '81A8E60EBBA84D55DFADA361F73B0A8937F0B11A' hash = 'ugACQkL4CKlnCZo44zVHNQJYFid1giy1MBEME0pglhzgwxctODvJgOMrKZD6uDBO7%2F1BaiIfwR0h6vieLcMODxm5fd63M9gQhs%2BnEgWfuA%3D%3D' require 'enumerator' require 'cgi' require 'digest/sha1' require 'zlib' def sha1(str) Digest::SHA1::hexdigest(str) end def crc32(str) '%x' % Zlib.crc32(str) end # cree une table de permutation def mktable(seed) arr = [*0..255] j = 0 256.times { |k| j += arr[k] + seed[k % seed.length] j &= 255 arr[j], arr[k] = arr[k], arr[j] } arr end # xore chaque octet de authstr avec un nombre calcule a partir # de la table de permutation, refait une inversion dans la table a # chaque iteration def foo(authstr, passh) shuf = mktable(passh) k = 0 # authstr must not exceed 255 chars authstr.unpack('C*').to_enum(:each_with_index).map { |c, i| i += 1 k += shuf[i] k &= 255 shuf[i], shuf[k] = shuf[k], shuf[i] shuf[(shuf[i] + shuf[k]) & 255] ^ c }.pack('C*') end def mkauth(randseed, user, passh) # passh = sha1(pass) authstr = randseed + ':' + user + ':' + sha1(passh) # rajoute le crc de ce qui precede authstr += ':' + crc32(authstr) foo(authstr, passh) end # base64 encode la chaine puts CGI.escape([mkauth(seed, user, passh)].pack('m').chomp) puts hash foobared = CGI.unescape(hash).unpack('m').first notbared = seed + ':' + user + ':' p foo(CGI.unescape(hash).unpack('m').first, passh) #p notbared.unpack('C*').zip(foobared.unpack('C*')).map { |a, b| a ^ b }