Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.12.2013, 16:57   #1
munthrekosh
Пользователь
 
Аватар для munthrekosh
 
Регистрация: 12.11.2011
Сообщений: 80
Печаль Шифрование ГОСТ 28147-89 в Delphi. Написал, но не работает

ГОСТ 28147.
Код плох, но должен работать. Не могу понять, что не так. Алгоритму верно, а синтаксические ошибки я не замечаю. Может вы увидите
(Рас)Шифрование одной процедурой. Меняется в зависимости от nz ((T)F-(р)ш).
Код:
procedure TForm1.BEncryptClick(Sender: TObject);
var
  MasterKey, Key, InText, OutText, LText, HText,
  binKey, buf: string;
  i, j, k, LMK, LIT, S1, S2, S3, S4, S5: Integer;
begin
  MasterKey:= LEMasterKey.Text;
  InText:= REInText.Text;
  LMK:= Length(MasterKey);
  LIT:= Length(InText);
  {убрал для компактности. [MasterKey]=32, а [InText] кратен 8}
  OutText:= '';
  i:=1;
  while i<=LIT do
    begin
      LText:= decTObin(Ord(InText[i+4]),8)+decTObin(Ord(InText[i+5]),8)+decTObin(Ord(InText[i+6]),8)+decTObin(Ord(InText[i+7]),8);
      //младшая часть блока
      HText:= decTObin(Ord(InText[i]),8)+decTObin(Ord(InText[i+1]),8)+decTObin(Ord(InText[i+2]),8)+decTObin(Ord(InText[i+3]),8);
      //старшая часть блока
      for j:= 0 to 31 do  //32 два раунда ш/р
        begin
          Key:= opKey(j, LMK, MasterKey);
          binKey:= decTObin(Ord(Key[1]),8)+decTObin(Ord(Key[2]),8)+decTObin(Ord(Key[3]),8)+decTObin(Ord(Key[4]),8);
//получаем а затем переводим в бинарный вид Кi
          buf:= LText;
          LText:= sum32(binKey, LText); //сум по 2^32
          for k:= 1 to 8 do //проходим 8 S-боксов
            begin
              S1:= binTOdec(Copy(LText,32-4*k+1,4),4);
              LText:= Copy(LText, 1, 4*(8-k))+decTObin(S[k, S1],4)+Copy(LText, 4*(8-k)+5, 4*(k-1));
//заменяем k-ый блок на блок из S-бокса
            end;
          LText:= Copy(LText, 12, 21)+Copy(LText, 1, 11); //цикл сдвиг влево на 11
          LText:= myXOR(LText, HText);
          HText:= buf;
        end;
      S2:= binTOdec(copy(HText,1,8), 8);
      S3:= binTOdec(copy(HText,9,8), 8);
      S4:= binTOdec(copy(HText,17,8), 8);
      S5:= binTOdec(copy(HText,25,8), 8);
      {получаем номера символов из HText}
      OutText:= OutText+chr(S2)+chr(S3)+chr(S4)+chr(S5);
      {для LText убрал для компактности}
      {8х}Inc(i);
      //вперед на 8 символов
    end;
  REOutText.Text:= OutText;
  nz:= False;
end;
Код:
function TForm1.binTOdec(K: string; SizeS: Integer): integer;
var
  c: string;
  i: integer;
begin
  i:=1;
  while (K[i]='0')and(i<SizeS) do
    begin
      K:=Copy(K, i, SizeS-i);
      inc(i);
    end;
  Result:= 0;
  for i:= 1 to Length(K) do
    begin
      c:= FloatToStr((power(2, (Length(K)-i))*(StrToInt(AnsiMidStr(K, i, 1)))));
      Result:= Result + StrToInt(c);
    end;
end;

function TForm1.decTObin(i, SizeS: integer): string;
var
  d, m: integer;
  r: string;
begin
  if i>1
    then
      begin
        repeat
          d:= i div 2;
          m:= i mod 2;
          r:= r + IntToStr(m);
          i:= d;
        until d = 1;
        Result:= '1' + AnsiReverseString(r);
      end
    else
      if i=0
        then Result:='0'
        else Result:='1';
  while Length(Result)<SizeS do
    Result:= '0'+Result;
end;
Код:
function TForm1.myXOR(s1, s2: string): string;
var
  i: Integer;
begin
  Result:= s1;
  for i:= 1 to 32 do
    if s1[i]<>s2[i]
      then Result[i]:='1'
      else Result[i]:='0';
end;

function TForm1.sum32(A, B: string): string;
var
  i: Integer;
  carry: Char;
begin
  Result:=A;
  carry:= '0';
  for i:= 1 to 32 do
    if ((A[i]='0')and(B[i]='1')and(carry='1')) or
       ((A[i]='1')and(B[i]='0')and(carry='1')) or
       ((A[i]='1')and(B[i]='1')and(carry='0'))
      then
        begin
          Result[i]:='0';
          carry:='1';
        end
      else
        if ((A[i]='1')and(B[i]='1')and(carry='1'))
          then
            begin
              Result[i]:='1';
              carry:='1';
            end
          else
            if ((A[i]='0')and(B[i]='0')and(carry='0'))
              then
                begin
                  Result[i]:='0';
                  carry:='0';
                end
              else
                begin
                  Result[i]:='1';
                  carry:='0';
                end;
end;
Код:
function TForm1.opKey(j, LMK: Integer; MasterKey: string): string;
begin
  if nz
    then
      if j<8
        then Result:= MasterKey[(j mod 8)*4+1]+MasterKey[(j mod 8)*4+2]+MasterKey[(j mod 8)*4+3]+MasterKey[(j mod 8)*4+4]
        else Result:= MasterKey[LMK-(j mod 8)*4-3]+MasterKey[LMK-(j mod 8)*4-2]+MasterKey[LMK-(j mod 8)*4-1]+MasterKey[LMK-(j mod 8)*4]
    else
      if j>24
        then Result:= MasterKey[LMK-(j mod 8)*4-3]+MasterKey[LMK-(j mod 8)*4-2]+MasterKey[LMK-(j mod 8)*4-1]+MasterKey[LMK-(j mod 8)*4]
        else Result:= MasterKey[(j mod 8)*4+1]+MasterKey[(j mod 8)*4+2]+MasterKey[(j mod 8)*4+3]+MasterKey[(j mod 8)*4+4];
end;
Ш.Р.Ю.-программист! йопта!!!
munthrekosh вне форума Ответить с цитированием
Старый 22.12.2013, 08:19   #2
Larboss
Недо
Участник клуба
 
Регистрация: 11.08.2011
Сообщений: 1,394
По умолчанию

Цитата:
Написал, но не работает
Подробней с этого момента. Что значит "не работает"? Результат не выводится, не соответствует ожиданию, ничего не происходит?

И, если можно, проект архивом скиньте. Попробую проверить в чем дело.
С помощью программирования можно разбогатеть и изменить мир к лучшему (с) Бьерн Страуструп
Larboss вне форума Ответить с цитированием
Старый 22.12.2013, 16:06   #3
munthrekosh
Пользователь
 
Аватар для munthrekosh
 
Регистрация: 12.11.2011
Сообщений: 80
По умолчанию

Не работает он в том смысле, что при расшифровке зашифрованного сообщения выводит не исходный текст, а абракадабру.

По вашей просьбе прикрепил исходники.
Вложения
Тип файла: rar Gost.rar (11.9 Кб, 70 просмотров)
Ш.Р.Ю.-программист! йопта!!!
munthrekosh вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с ГОСТ 28147-89 (симетричное шифрование) MNaz C# (си шарп) 1 12.01.2013 22:35
ГОСТ 28147-89 VaDim12 Фриланс 5 15.11.2012 20:28
нужны исходники гост 28147-89 indarium Общие вопросы Delphi 1 14.11.2012 16:14
возможна ли реализация ГОСТ 28147-89 на языке java? werder Общие вопросы по Java, Java SE, Kotlin 2 25.11.2010 13:03