Advertisement
Guest User

Untitled

a guest
Apr 26th, 2011
991
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.16 KB | None | 0 0
  1. # -*- coding: utf-8 -*-
  2. __author__ = 'Dmitry'
  3. import random
  4.  
  5.  
  6. def input_data():
  7.     key = 'qwertyyyyyyyyy'
  8.     file = open('./crypt','r')
  9.     return key,file
  10.  
  11.  
  12. class crypt_alg():
  13.     def str2bit(self):
  14.         bin_list = []
  15.         key,txt_file = input_data()
  16.         for txt_str in txt_file:
  17.             bin_str = (''.join(map(lambda x:"{0:0>{1}}".format(bin(ord(x))[2:], 16), txt_str)))
  18.             bin_list.append(bin_str)
  19.         return bin_list
  20.  
  21.     def key_gen(self):
  22.         get_key,file_txt = input_data()
  23.         if len(get_key) > 8:
  24.             RndSeed = 0
  25.             for num_charr, charr in enumerate(get_key):
  26.                 RndSeed = RndSeed ^ (ord(charr) << ((8*num_charr)%64))
  27.  
  28.             random.seed(RndSeed)
  29.             key = 0
  30.             for i in xrange(8):
  31.                 key = (key<<32)^random.randrange(0,2<<32,1)
  32.             file_txt.close()
  33.             return key&~(1<<256)
  34.         else:
  35.             file_txt.close()
  36.             return 'Слишком простой пароль'
  37.  
  38.     def crypt_decrypt(self):
  39.         bit_list_crypt = []
  40.         crypt_alg().key_gen()
  41.         session_keys = []
  42.         for i in xrange(32):
  43.             if i < 24:
  44.                 session_keys.append((crypt_alg().key_gen()>>((32*i)%256))&0xffffffff)
  45.             else:
  46.                 session_keys.append((crypt_alg().key_gen()>>(256-((32*i)%256)))&0xffffffff)
  47.         N5 = 0x01010101
  48.         N6 = 0x01010103
  49.         S_blox = [[ 4, 10,  9,  2, 13,  8,  0, 14,  6, 11,  1, 12,  7, 15,  5,  3],
  50.             [14, 11,  4, 12,  6, 13, 15, 10,  2,  3,  8,  1,  0,  7,  5,  9],
  51.             [ 5,  8,  1, 13, 10,  3,  4,  2, 14, 15, 12,  7,  6,  0,  9, 11],
  52.             [ 7, 13, 10,  1,  0,  8,  9, 15, 14,  4,  6, 12, 11,  2,  5,  3],
  53.             [ 6, 12,  7,  1,  5, 15, 13,  8,  4, 10,  9, 14,  0,  3, 11,  2],
  54.             [ 4, 11, 10,  0,  7,  2,  1, 13,  3,  6,  8,  5,  9, 12, 15, 14],
  55.             [13, 11,  4,  1,  3, 15,  5,  9,  0, 10, 14,  7,  6,  8,  2, 12],
  56.             [ 1, 15, 13,  0,  5,  7, 10,  4,  9,  2,  3, 14,  6, 11,  8, 12]]
  57.         bits_list=[]
  58.         tmp_str = ''
  59.         count = int()
  60.         for bin_item in ''.join(crypt_alg().str2bit()):
  61.             count += 1                      #Устанавливаем счетчик для определения 64го элемента
  62.             tmp_str += bin_item
  63.             b_blocks = count%64               #Определяем 64й бит методом деления счетчика на 64 и проверки на остаток
  64.             if b_blocks == 0:               #Если остаток = 0, то добавляем строку из 64 элементов в список
  65.                 bits_list.append(tmp_str)
  66.                 tmp_str = ''
  67.         while len(tmp_str) != 64:
  68.             tmp_str = '0' + tmp_str         #Заполняем нулями до 64 бит
  69.         bits_list.append(tmp_str)           #Добавляем остаток в список
  70.         tmp_str = ''
  71.  
  72.         sync_post = '111100000100101110111011000010011011101000111111110111001000010'
  73.  
  74.         N1 = int(sync_post[:32],2)       # синхропосылка
  75.         N2 = int(sync_post[32:],2)       # синхропосылка
  76.         #print N1,N2,session_keys[0]
  77.         for i in xrange(32):            #Начало РПЗ
  78.                 summ1 = (N1+session_keys[i])%1<<32
  79.                 sb = 0
  80.                 for j in xrange(8):
  81.                     S=S_blox[j][(summ1>>(28-j*4)) & 0xF]
  82.                     sb |= S<<(28-j*4)
  83.                 shl = ((sb<<11) | (sb>>32-11)) & 0xFFFFFFFF     #shl = (sb<<11) | (sb>>32-11)
  84.                 summ2 = shl ^ N2
  85.                 if i != 31:
  86.                     N2 = N1
  87.                     N1 = summ2
  88.                 else:
  89.                     N2=summ2                #Конец РПЗ
  90.  
  91.         for item in bits_list:
  92.  
  93.             N3 = N1
  94.             N4 = N2
  95.  
  96.             #N3 = N3 + N5
  97.             N3 = (N3 + N5) % (1<<32)
  98.            
  99.             #N4 = N4 + N6
  100.             N4 = (N4 + N6) % 0xFFFFFFFF
  101.  
  102.             N1 = N3
  103.             N2 = N4        
  104.  
  105.             for i in xrange(32):            #Начало РПЗ
  106.                 summ1 = (N1+session_keys[i])%1<<32
  107.                 sb = 0
  108.                 for j in xrange(8):
  109.                     S=S_blox[j][(summ1>>(28-j*4)) & 0xF]
  110.                     sb |= S<<(28-j*4)
  111.                 shl = ((sb<<11) | (sb>>32-11)) & 0xFFFFFFFF         #shl = (sb<<11) | (sb>>32-11)
  112.                 summ2 = shl ^ N2
  113.                 if i != 31:
  114.                     N2 = N1
  115.                     N1 = summ2
  116.                 else:
  117.                     N2 = summ2                #Конец РПЗ
  118.            
  119.             #bit_list_crypt.append(bin(int(item,2)^(N1<<32|N2))[2:])
  120.             bit_list_crypt.append(bin(int(item,2)^((N1<<32)|N2))[2:])
  121.         return bit_list_crypt
  122.  
  123.  
  124. def output_data():
  125.     datamas = crypt_alg().crypt_decrypt()
  126.     str_list=[]
  127.     for item in datamas:
  128.         str_list.append(''.join([chr(int(item[16*i:(i+1)*16],2)&0xFF) for i in xrange(len(item)/16)]))
  129.     file = open('./crypt','w')
  130.     file.write(''.join(str_list))
  131.     return ''.join(str_list)
  132.  
  133.  
  134. if __name__ == '__main__':
  135.     print output_data()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement