![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Регистрация: 28.05.2011
Сообщений: 9
|
![]()
function EBlock(var Block):Boolean;
var BBlock:TBlock absolute Block; i:integer; t,u,v,temp:longword; begin inc(BBlock[2],s[0]); B:=B+s[0]; inc(BBlock[4],s[1]); D:=D+s[1]; inc(BBlock[6],s[2]); F:=F+s[2]; for i:=1 to ROUNDSr do//2 begin t:=goL((B*(2*B+1)), lgw); u:=goL((D*(2*D+1)), lgw); v:=goL((F*(2*F+1)), lgw); A:=goL((A xor t),u)+s[2*i]; C:=goL((C xor u),v)+s[2*i+1]; E:=goL((E xor v),t)+s[2*i+2]; temp:=A; A:=B; B:=C; C:=D; D:=E; E:=F; F:=temp; end; A:=A+s[2*ROUNDSr+1];//2 C:=C+s[2*ROUNDSr+2];//3 E:=E+s[2*ROUNDSr+3];//4 BBlock[1]:=A; BBlock[3]:=C; BBlock[5]:=E; Result:=true; end; function DBlock(var Block): Boolean; var BBlock:TBlock absolute Block; i: integer; t,u,v,temp: LongWord; begin BBlock[5]:=BBlock[5]-s[2*ROUNDSr+3]; E:=E-s[2*ROUNDSr+3]; //4 BBlock[3]:=BBlock[3]-s[2*ROUNDSr+2]; C:=C-s[2*ROUNDSr+2]; //3 BBlock[1]:=BBlock[1]-s[2*ROUNDSr+1]; A:=A-s[2*ROUNDSr+1]; //2 for i:=ROUNDSr downto 1 do //2 begin temp:=F; F:=E; E:=D; D:=C; C:=B; B:=A; A:=temp; v:=goL((F*(2*F+1)), lgw); u:=goL((D*(2*D+1)), lgw); t:=goL((B*(2*B+1)), lgw); E:=goR((E-s[2*i+2]), t)xor v; C:=goR((C-s[2*i+1]), v)xor u; A:=goR((A-s[2*i]), u)xor t; end; F:=F-s[2]; D:=D-s[1]; B:=B-s[0]; BBlock[6]:=F; BBlock[4]:=D; BBlock[2]:=B; Result:=true; end; Симметричный блочный шифр, не правильно расшифровывает файл, не могу понять где ошибка...goL, goR - функции сдвига влево, вправо |
![]() |
![]() |
![]() |
#2 |
Регистрация: 28.05.2011
Сообщений: 9
|
![]()
Немного поковырялся, исправил, но все равно не расшифровывает(((
исправленный код: function EBlock(var Block):Boolean; var BBlock:TBlock absolute Block; i:integer; t,u,v,temp:longword; begin inc(BBlock[2],s[0]); B:=B+s[0];// команды делают одно и то же inc(BBlock[4],s[1]); D:=D+s[1]; inc(BBlock[6],s[2]); F:=F+s[2]; for i:=1 to ROUNDSr do//2 begin t:=(B*(2*B+1))shl lgw; u:=(D*(2*D+1))shl lgw; v:=(F*(2*F+1))shl lgw; A:=((A xor t)shl u)+s[2*i-2];//чтоб не выйти за пределы массива C:=((C xor u)shl v)+s[2*i-1]; E:=((E xor v)shl t)+s[2*i]; temp:=A; A:=B; B:=C; C:=D; D:=E; E:=F; F:=temp; end; A:=A+s[2*ROUNDSr+1];//2 присваиваю последние три значения из массива в C:=C+s[2*ROUNDSr+2];//3 регистры E:=E+s[2*ROUNDSr+3];//4 BBlock[1]:=A;// то же самое BBlock[3]:=C; BBlock[5]:=E; Result:=true; end; function DBlock(var Block): Boolean;// повторяю ЕBlock в обратном порядке var BBlock:TBlock absolute Block; i: integer; t,u,v,temp: LongWord; begin BBlock[5]:=BBlock[5]-s[2*ROUNDSr+3]; E:=E-s[2*ROUNDSr+3]; //4 BBlock[3]:=BBlock[3]-s[2*ROUNDSr+2]; C:=C-s[2*ROUNDSr+2]; //3 BBlock[1]:=BBlock[1]-s[2*ROUNDSr+1]; A:=A-s[2*ROUNDSr+1]; //2 for i:=ROUNDSr downto 1 do //2 begin temp:=F; F:=E; E:=D; D:=C; C:=B; B:=A; A:=temp; v:=((F*(2*F+1))shl lgw); u:=((D*(2*D+1))shl lgw); t:=((B*(2*B+1))shl lgw); E:=((E-s[2*i])shr t)xor v; C:=((C-s[2*i-1])shr v)xor u; A:=((A-s[2*i-2])shr u)xor t; end; F:=F-s[2]; D:=D-s[1]; B:=B-s[0]; BBlock[6]:=F; BBlock[4]:=D; BBlock[2]:=B; Result:=true; end; lgw=5, ROUNDSr-динамическая переменная, A..F=BBlock[1]..BBlock[6](на всякий случай). Если нужно могу скинуть процедуру расширения ключа, там же создается массив s (массив ключей) и присваиваются начальные значения A,B,C,D(A=B,C=D),E=0,F=s[2] |
![]() |
![]() |
![]() |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Криптография | metallist85 | Общие вопросы Delphi | 5 | 28.10.2010 09:30 |
криптография | glupayastudentka | Помощь студентам | 3 | 25.06.2009 05:00 |
криптография | glupayastudentka | Помощь студентам | 0 | 23.06.2009 21:48 |
Криптография | helpme | Помощь студентам | 8 | 10.11.2007 14:43 |