Собственно надо реализовать сеть Фейстеля, вот что я написала:
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
Вот код той же программы, но на 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; }
Заранее спасибо.
