Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблемы в шифровании записи, Функция шифровки данных 
:(
    Опции темы
Centurion
Дата 25.9.2010, 21:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 27.7.2006

Репутация: нет
Всего: нет



Здравствуйте уважаемые знатоки, некоторое время назад столкнулся с интересной функцией криптографии 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 и работают на ДОСе, вносить изменения к ним или в структуру БД нельзя, а эти функции я хотел бы использовать для пакетной обработки и ввода в данных. 
За ранее спасибо!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Обязательно указание:

1. Базы данных (Paradox, Oracle и т.п.)

2. Способа доступа (ADO, BDE и т.д.)


  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • Вопросы по SQL и вопросы по базам данных не связанные с Дельфи задавать здесь

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема »


 




[ Время генерации скрипта: 0.0586 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.