Найти - Пользователи
Полная версия: Программа долго выполняется (программа - реализация схемы Фейстеля)
Начало » Python для новичков » Программа долго выполняется (программа - реализация схемы Фейстеля)
1
kei91
Доброго времени суток!
Собственно надо реализовать сеть Фейстеля, вот что я написала:
def F(l, key):
	return (l*l + l*key + key*key)
word = raw_input('>> ')
l = []
r = []
for i in range(0, 4):
	l.append(ord(word[i]))
for i in range(4, 8):
	r.append(ord(word[i]))
print l
print r
L0 = l[0] ^ (l[1] << 8) ^ (l[2] << 16) ^ (l[3] << 24)
R0 = r[0] ^ (r[1] << 8) ^ (r[2] << 16) ^ (r[3] << 24)
L = []
R = []
L.append(L0)
R.append(R0)
#print L0, R0
for i in range(0, 32):	
	R.append(L[i]) 
	L.append(R[i] ^ F(L[i], i)) 
for i in range(31, -1, -1):
	L[i] = R[i + 1]
	R[i] = L[i + 1] ^ F(R[i + 1], 1)
print "END"
for j in range(0, 4):
	l[j] = L[0] % 256
	L[0] = L[0] >> 8
for j in range(0, 4):
	r[j] = R[0] % 256
	R[0] = R[0] >> 8
	
print l, r
Но программа очень долго выполняется, около 20 минут ждала, но программа так и не завершилась.
Вот код той же программы, но на C++ (все работает, выполняется быстро):
#include <iostream>
using namespace std;
int F(int num, int key) {
	return (num*num + num*key + key*key);
}
int main() {
	cout << "Input to crypt: " << endl;
	char c[8];
	cin >> c;
	int l[4], r[4];
	for (int i = 0; i < 4; i++) {
		l[i] = c[i];
		r[i] = c[i + 4];
	}
	int L0 = l[0] ^ (l[1] << 8) ^ (l[2] << 16) ^ (l[3] << 24);
	int R0 = r[0] ^ (r[1] << 8) ^ (r[2] << 16) ^ (r[3] << 24);
	int L[32], R[32];
	L[0] = L0;
	R[0] = R0;
	for (int i = 0; i < 32; i++) {
		R[i + 1] = L[i];
		L[i + 1] = R[i] ^ F(L[i], i);
	}
	cout << "crypt: " << L[31] << R[31] << endl;
	for (int i = 31; i >= 0; i--) {
		L[i] = R[i + 1];
		R[i] = L[i + 1] ^ F(R[i + 1], i);
	}
	for (int i = 0; i < 4; i++) {
		l[i] = L[0] % 256;
		L[0] = L[0] >> 8;
	}
	for (int i = 0; i < 4; i++) {
		r[i] = R[0] % 256;
		R[0] = R[0] >> 8;
	}
	char finish[8];
	for (int i = 0; i < 4; i++) { finish[i] = l[i]; }
	for (int i = 0; i < 4; i++) { finish[i + 4] = r[i]; }
	cout << "decrypt: " << finish;
	return 0;
}
На python'e я сравнительно недавно, поэтому даже не знаю в какую сторону смотреть.
Заранее спасибо.
py.user.next
def F(l, key):
    return (l * l + l * key + key * key) % 2 ** 32
kei91
py.user.next
def F(l, key):
    return (l * l + l * key + key * key) % 2 ** 32
Спасибо! Код выполняется
Но если вас не затруднит, объясните почему надо возвращать остаток от деления на 2 ** 32 ?
И почему на C++ обходимся без этого?
py.user.next
kei91
И почему на C++ обходимся без этого?
на C++ надо использовать unsigned long (или там uint32_t), так как переполнение знаковых целочисленных типов не определено

kei91
объясните почему надо возвращать остаток от деления на 2 ** 32 ?
потому что при блочном шифре, сколько подаётся на вход, столько и выдаётся на выходе
функция используется для преобразования частей подаваемого блока
2 ** 32 - это количество чисел, которые могут быть представлены четырьмя байтами
операция остатка от деления оставит в результате число, которое не превышает четырёх байт

в C++ в целочисленном типе помещается число, размер которого в байтах ты можешь узнать через sizeof(int)
в Python в целочисленном типе помещается число любого размера, так как для хранения используется длинная арифметика
odnochlen
Вообще двоичная арифметика в динамических языках ОЧЕНЬ медленная, от 100 до 10000 раз медленнее, чем в статических языках (C / java / C#) и питон тут не исключение.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB