Форум сайта python.su
0
Короче задачка состоит в построении таблиц для линейного криптоанализа. Фактически я все сделал, кроме самого главного подсчета линейного статистического аналога Q (элементы массива Q).Проблема либо в логике либо в синтаксисе. Кто не в теме или забыл, объясню просто, как считается каждый линейный статистический аналог Q
ВАЖНО!Все числа альфа, бэтта, Вход и Выход - это двоичные числа (но для удобства написании программы я работал в десятичной системе счисления, которой ИМИТИРОВАЛ двоичные числа)
Берется альфа (A) и вход (с), если в альфе(A) есть 1цы, то из Входа © берутся с этих же позиций цифры, которые ксорятся между собой:
Например(3 примера):
1) A=0101 Вход = 0000 Результат1 1 = 0 XOR 0 =0
2) A=0101 Вход = 0100 Результат1 2 = 1 XOR 0 =1
3) A=0101 Вход = 1111 Результат1 3= 1 XOR 1 =0
ДАЛЕЕ
тоже самое проделываем с бэттой (B) и Выходом(g) (ну только в БЭТТЕ И В ВЫХОДЕ 3 цифры в числе) и записываем полученное число в Результат2
Например:
1) B=011 Выход = 001 Результат2 1 = 0 XOR 1 =0
2) B=001 Выход = 111 Результат2 2 = 1 = 1
В ИТОГЕ
Q1=Результат1 1 XOR Результат2 1=0 XOR 0 = 0
Q2=Результат1 2 XOR Результат2 2=1 XOR 1 = 0
Тоесть получить в идеале нужно 15 таблиц Q, размером 16 на 15, НО я упростил пока немного задачу и нужно ВЕРНО построить таблицу только для B=001.
ПРИМЕР того что должно получится посмотрите пожалуйста в прикрепленном файле
ВСЕ массивы альфы, бэтты, Входа, Выхода построены ВЕРНО, проблемный кусок кода я выделил
a = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]#вспомогательный массив b = [[0] for i in range(16)]#вспомогательный массив c = [[0] for i in range(16)]#вход g = [[0] for i in range(16)]#выход B = [[0] for i in range(15)]#бэтта A = [[0] for i in range(15)]#альфа Q = [[0] for i in range(15)]#самое главное hel = [['Вход'],['Выход'],['Q']*15]#вспомогательный массив print('_______') #ВСЕ ЧТО НИЖЕ ПРАВИЛЬНО for i in range (16):#1-2 пункт b[i]=bin(a[i]) for i in range (16): c[i]=str(b[i]) d = len(str(b[i])) if d == 3: g[i] = [0,0,int(c[i][2])] c[i] = [0,0,0,int(c[i][2])] if d == 4: g[i] = [0,int(c[i][2]),int(c[i][3])] c[i] = [0,0,int(c[i][2]),int(c[i][3])] if d == 5: g[i] = [int(c[i][2]),int(c[i][3]),int(c[i][4])] c[i] = [0,int(c[i][2]),int(c[i][3]),int(c[i][4])] if d == 6: g[i] = [int(c[i][3]),int(c[i][4]),int(c[i][5])] c[i] = [int(c[i][2]),int(c[i][3]),int(c[i][4]),int(c[i][5])] B[i-1]=g[i] A[i-1]=c[i]#1-2 пункт g = [g[1],g[5],g[1],g[4],g[2],g[6],g[6],g[3],g[4],g[5],g[6],g[7],g[2],g[2],g[3],g[7]] x1=0 x2=0 y1=0 y2=0 #ВСЕ ЧТО ВЫШЕ ПРАВИЛЬНО #ПРОБЛЕМНЫЙ КУСОК КОДА НИЖЕ for i in range (16): for j in range (15): for s in range (3): if A[j][s] == 1 and A[j][s]==c[i][s]: x1=x1+1 if (x1%2)==0: x2 = 0 else: x2 = 1 else: x2 = 0 x1 = 0 for t in range (2): if B[0][t]==1 and B[0][t]==g[i][t]: y1=y1+1 if (y1%2)==0: y2 = 0 else: y2 = 1 else: y2 = 0 y1 = 0 Q1[i][j] = x2^y2 #ПРОБЛЕМНЫЙ КУСОК КОДА ВЫШЕ #Ниже вывод информации print ('A =') for j in range (15): print(A[j]) for z in range (1): print ('B =',B[z])# for i in range (16): print (c[i],g[i],Q[i]) print('_______')#(5 пункт)
Отредактировано omon3 (Июль 30, 2015 20:03:18)
Прикреплённый файлы:
аналог.txt (5,0 KБ)
Офлайн
88
Зевните где-нибудь двоеточие - увидите как выглядит синтаксическая ошибка. Логику разбирать пока некогда.
Офлайн
0
Какой то бред происходит с циклами
for s in range (3):
и
for t in range (2):
ОНИ ПОЧЕМУ ТО СЧИТАЮТ t и s только ДО 1 и 2 соответственно, ВМЕСТО положенных 2 и 3. Из-за этого и не работает нормально.
Подскажите причину??
#ПРОБЛЕМНЫЙ КУСОК КОДА НИЖЕ for i in range (16): for j in range (15): for s in range (3): if A[j][s] == 1 and A[j][s]==c[i][s]: x1=x1+1 if (x1%2)==0: x2 = 0 else: x2 = 1 else: x2 = 0 for t in range (2): if B[0][t]==1 and B[0][t]==g[i][s]: y1=y1+1 if (y1%2)==0: y2 = 0 else: y2 = 1 else: y2 = 0 Q1[i][j] = x2^y2 #ПРОБЛЕМНЫЙ КУСОК КОДА ВЫШЕ
Офлайн
568
omon3Это кто ж вам так положил то?
ОНИ ПОЧЕМУ ТО СЧИТАЮТ t и s только ДО 1 и 2 соответственно, ВМЕСТО положенных 2 и 3.
Офлайн
0
FishHookпонял)) затупил
Офлайн
0
появился ещё один затуп:
a=[0,1,1,1] b=[0,1,1,0] x=0 for i in range (4): if b[i]==1 and b[i]==a[i]: x=x+1 if (x%2)>0: x1=1 print(x,x1)
Офлайн
88
omon3Может быть там не 2?
Ведь целочисленное деление 2х на 2 ЭТО НУЛЬ
Офлайн
0
для этого я вывожу и x и x1
print(x,x1)
Офлайн
88
omon3Для которой итерации?
для этого я вывожу и x и x1
Офлайн
0
Хотя вы правы, x%2 это 0, я понял свою ошибку
Я не дописал
else:
x1=0
Офлайн