Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Базы данных и репортинг > Проблемы в шифровании записи


Автор: Centurion 25.9.2010, 21:28
Здравствуйте уважаемые знатоки, некоторое время назад столкнулся с интересной функцией криптографии 90-х годов, написана она была на Clipper е, суть этой функции состояла в расшифровке полей БД (.dbf файлов) которые содержали цифры с плавающей точкой (Float). Но в шифрованном виде они выглядели как набор юникод символов (String). 
На языке Дельфи функция расшифровывания данных выглядет так:


Код

type
  PRec1 = ^TRec1;
  TRec1 = array [1..7] of char;
...
function TForm1.StUniToStr(s: string): string;
var  v: Variant; a: string; i: integer;
begin
  v:=0;
  for i:=1 to 6 do
  begin
    a:=copy(s,i,1);
    if (a<>'')and(a<>#0) then
      case i of
        1..4: v:=v+Ord(a[1])*IntPower(256,i-1);
           5: v:=v+(Ord(a[1])-32)/100;
           6: v:=v+Ord(a[1])*1000000000;
      end;
  end;
  v:=Trim(v);
  result:=v;
end;


Эта функция работает корректно и нареканий к ней нет. 
Так вот, после того как расшифровав данные и поработав с цифрами и когда время дошло до залива цифр обратно в базу данных (в .dbf файл) с предварительным шифрованием пришлось написать данную функцию (StrToUnik) шифрования, руководствуясь функцией выше:

Код

function TForm1.StrToUnik(s: string):TRec1;
var  a,f,a1:Variant; r:TRec1; i:integer;
begin
  a:=trim(s);
  f:=Round(frac(a)*100);
  a:=Trunc(a);
  if a>1000000000 then
  begin
    a1:=a div 1000000000;
    a:=a mod 1000000000;
  end
  else
    a1:=0;

  FillChar(r,7,0);
  r[1]:=chr(byte(a mod 256));
  i:=2;
  while (a div 256)>0 do
  begin
    a:=a div 256;
    r[i]:=chr(byte(a mod 256));
    inc(i);
  end;
  if f>0 then
    r[5]:=chr(byte(f+32));
  if a1>0 then
    r[6]:=chr(byte(a1));

  result:=r;
end;


Но почему-то шифрует она криво, а именно около 40% данных при открытии с клиентской программой выводятся не верно.
Пожалуйста, если это Вас не затруднит просмотрите функцию StrToUnik, может я чего-то там пропустил?
ps. Клиентские программы для работы с БД написаны на языке Clipper и работают на ДОСе, вносить изменения к ним или в структуру БД нельзя, а эти функции я хотел бы использовать для пакетной обработки и ввода в данных. 
За ранее спасибо!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)