Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # -*- coding: utf-8 -*-
- __author__ = 'Dmitry'
- import random
- def input_data():
- key = 'qwertyyyyyyyyy'
- file = open('./crypt','r')
- return key,file
- class crypt_alg():
- def str2bit(self):
- bin_list = []
- key,txt_file = input_data()
- for txt_str in txt_file:
- bin_str = (''.join(map(lambda x:"{0:0>{1}}".format(bin(ord(x))[2:], 16), txt_str)))
- bin_list.append(bin_str)
- return bin_list
- def key_gen(self):
- get_key,file_txt = input_data()
- if len(get_key) > 8:
- RndSeed = 0
- for num_charr, charr in enumerate(get_key):
- RndSeed = RndSeed ^ (ord(charr) << ((8*num_charr)%64))
- random.seed(RndSeed)
- key = 0
- for i in xrange(8):
- key = (key<<32)^random.randrange(0,2<<32,1)
- file_txt.close()
- return key&~(1<<256)
- else:
- file_txt.close()
- return 'Слишком простой пароль'
- def crypt_decrypt(self):
- bit_list_crypt = []
- crypt_alg().key_gen()
- session_keys = []
- for i in xrange(32):
- if i < 24:
- session_keys.append((crypt_alg().key_gen()>>((32*i)%256))&0xffffffff)
- else:
- session_keys.append((crypt_alg().key_gen()>>(256-((32*i)%256)))&0xffffffff)
- N5 = 0x01010101
- N6 = 0x01010103
- S_blox = [[ 4, 10, 9, 2, 13, 8, 0, 14, 6, 11, 1, 12, 7, 15, 5, 3],
- [14, 11, 4, 12, 6, 13, 15, 10, 2, 3, 8, 1, 0, 7, 5, 9],
- [ 5, 8, 1, 13, 10, 3, 4, 2, 14, 15, 12, 7, 6, 0, 9, 11],
- [ 7, 13, 10, 1, 0, 8, 9, 15, 14, 4, 6, 12, 11, 2, 5, 3],
- [ 6, 12, 7, 1, 5, 15, 13, 8, 4, 10, 9, 14, 0, 3, 11, 2],
- [ 4, 11, 10, 0, 7, 2, 1, 13, 3, 6, 8, 5, 9, 12, 15, 14],
- [13, 11, 4, 1, 3, 15, 5, 9, 0, 10, 14, 7, 6, 8, 2, 12],
- [ 1, 15, 13, 0, 5, 7, 10, 4, 9, 2, 3, 14, 6, 11, 8, 12]]
- bits_list=[]
- tmp_str = ''
- count = int()
- for bin_item in ''.join(crypt_alg().str2bit()):
- count += 1 #Устанавливаем счетчик для определения 64го элемента
- tmp_str += bin_item
- b_blocks = count%64 #Определяем 64й бит методом деления счетчика на 64 и проверки на остаток
- if b_blocks == 0: #Если остаток = 0, то добавляем строку из 64 элементов в список
- bits_list.append(tmp_str)
- tmp_str = ''
- while len(tmp_str) != 64:
- tmp_str = '0' + tmp_str #Заполняем нулями до 64 бит
- bits_list.append(tmp_str) #Добавляем остаток в список
- tmp_str = ''
- sync_post = '111100000100101110111011000010011011101000111111110111001000010'
- N1 = int(sync_post[:32],2) # синхропосылка
- N2 = int(sync_post[32:],2) # синхропосылка
- #print N1,N2,session_keys[0]
- for i in xrange(32): #Начало РПЗ
- summ1 = (N1+session_keys[i])%1<<32
- sb = 0
- for j in xrange(8):
- S=S_blox[j][(summ1>>(28-j*4)) & 0xF]
- sb |= S<<(28-j*4)
- shl = ((sb<<11) | (sb>>32-11)) & 0xFFFFFFFF #shl = (sb<<11) | (sb>>32-11)
- summ2 = shl ^ N2
- if i != 31:
- N2 = N1
- N1 = summ2
- else:
- N2=summ2 #Конец РПЗ
- for item in bits_list:
- N3 = N1
- N4 = N2
- #N3 = N3 + N5
- N3 = (N3 + N5) % (1<<32)
- #N4 = N4 + N6
- N4 = (N4 + N6) % 0xFFFFFFFF
- N1 = N3
- N2 = N4
- for i in xrange(32): #Начало РПЗ
- summ1 = (N1+session_keys[i])%1<<32
- sb = 0
- for j in xrange(8):
- S=S_blox[j][(summ1>>(28-j*4)) & 0xF]
- sb |= S<<(28-j*4)
- shl = ((sb<<11) | (sb>>32-11)) & 0xFFFFFFFF #shl = (sb<<11) | (sb>>32-11)
- summ2 = shl ^ N2
- if i != 31:
- N2 = N1
- N1 = summ2
- else:
- N2 = summ2 #Конец РПЗ
- #bit_list_crypt.append(bin(int(item,2)^(N1<<32|N2))[2:])
- bit_list_crypt.append(bin(int(item,2)^((N1<<32)|N2))[2:])
- return bit_list_crypt
- def output_data():
- datamas = crypt_alg().crypt_decrypt()
- str_list=[]
- for item in datamas:
- str_list.append(''.join([chr(int(item[16*i:(i+1)*16],2)&0xFF) for i in xrange(len(item)/16)]))
- file = open('./crypt','w')
- file.write(''.join(str_list))
- return ''.join(str_list)
- if __name__ == '__main__':
- print output_data()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement