Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

шифрация данных в текстовом файле [D4, D6, WinXP]


olevacho_ ©   (2005-06-28 15:15:00) 

Нужно добавить в прогу возможность сохранять данные в текстовом файле но зашифрованными. Потом считывать эти данные другой прогой с алгоритмом расшифровки. Как это сделать практически?


TStas   (2005-06-29 19:36:00) [1]

const
 keyText=а по этой строчке все и шифруем, она может быть любой;
 extABC='abcdefghijklmnopqrstuvwxyzàáâãä叿çèéêëì&# 237;îïðñòóôõö÷øùüûúýþÿABCDEFGH IJKLMNOPQRSTUVWXYZÀÁÂÃÄŨÆÇÈÉÊËÌÍÎÏ ÐÑÒÓÔÕÖרÙÜÛÚÝÞß`~!@#$%^&*()_+|-=\/{}[]< >?;:"¹ '+#39#13#10#9; //На месте слетевших символово были русские буквы в обоих регистрах и прочие кириллические символы, это расширеннй алфавит.
У вчерашних функций есть маленький недостаток - может в кодированном тексте образоваться EOF, здесь недостаток устранен, все, кстати, проверял и все работает

function GetSymNum(C:Char):Byte; //Возвращает порядковый номер символа в расширенном алфавите
var i:Byte;
begin
Result:=0;
for i:=1 to Length(extABC) do
 begin
 if c=extABC[i] then
   begin
   Result:=i;
   exit;
   end;
 end;
end;

function encode(str:String):String;
var
 s1:String;
 i, ln, extLn, n:Integer;
 b:Byte;
begin
extLn:=Length(extABC);
ln:=Length(str);
n:=ln div Length(keyText)+1;
s1:='';
for i:=1 to n do s1:=s1+keyText;
SetLength(s1, ln); //Повторяет, если надо шифрующую строку до длинны той, которую шифруем
Result:='';
for i:=1 to ln do
 begin
 b:=(GetSymNum(str[i])+GetSymNum(s1[i])) mod extLn; //Складывает номера символов в расширенном алфавите, и берем по мод алфавита
 Result:=Result+extABC[b];
 end;
end;

function decode(str:String):String; //
var
 s1:String;
 i, ln, n, b, extLn:Integer;

begin
extLn:=Length(extABC);
ln:=Length(str);
n:=ln div Length(keyText)+1;
s1:='';
for i:=1 to n do s1:=s1+keyText;
SetLength(s1, ln); //То же самое
Result:='';
for i:=1 to ln do
 begin
 b:=(GetSymNum(str[i])-GetSymNum(s1[i])); //А здесь вычитаем
 if b


gydvin   (2005-06-28 23:13:00) [2]

Anatoly Podgoretsky ©   (28.06.05 20:12) [10]
Вопрос не столько про шифрование, а про текстовый файл, который должен остаться текстовым.


А в чем проблемы, закидываешь строку получаешь стороку пишешь в файл, читаешь из файла опять прогоняешь функцией получаешь искомое.
и опять же функция требует дороботки. чтобы невыскочило запределы 1-255, а также, как и в выше преведенных примерах чтобы при кодировании символы не менялись на знаки каретки #13#10 это в том случае если файл многострочный.


Starcom   (2005-06-28 21:39:00) [3]

TStas ©   (28.06.05 20:46) [14]

К сожалению слетела коддировка.

А ещё раз нелзя написать, без слёта.

Пояснения мне тоже важны!

С Уважением Starcom! 8-(


TStas   (2005-06-28 20:46:00) [4]

К сожалению слетела коддировка. Краткое пояснение, это, правда, чуть проще, чем по книге. Расширенным алфавитом для простоты считаем #0..#255.
keyText - строка, по которой шифруем. Выбирается по вкусу.
В функции encode повторяем ее необходимое число раз и пишем над шифруемой строкой. Складывает их "номера в расширенном" алфавите, т. есть ord. Если результат больше 255, берем по модулю 255. Получится некая строка.
Расшифровывается точно так же, только не складывается, а вычитается.

То есть взяли текст - получила текст. Сломать пароль весьма сложно.


TStas   (2005-06-28 20:40:00) [5]

const
 keyText='âîò ïî ýòîé ñòðî÷êå è øèôðóåòñÿ âñå';

function encode(str:String):String; //Øèôðóåò ñòðîêó
var
 s1:String;
 i, ln, n:Integer;
 b:Byte;
begin
ln:=Length(str);
n:=ln div Length(keyText)+1; //Ñêîëüêî ðàç íóæíî ïîñòîðèòü øèôðóþùóþ ñòðîêó
s1:=''; //Ñòðîêà, ïîâòîðÿþùàÿ øèôðóþùóþ, íî íóæíîé äëèííû
for i:=1 to n do s1:=s1+keyText;
SetLength(s1, ln); //Äåëàþ íóæíîé äëèííû ñòðîêó
Result:='';
for i:=1 to ln do
 begin
 b:=(Ord(str[i])+Ord(s1[i])) mod 255; //Ñêëàäûâàþ "íîìåðà â ðàñøèðåííîì àëôàâèòå" è áåðó ïî mod 255
 Result:=Result+Char(b);
 end;
end;

function decode(str:String):String; //Ðàñøèôðîâûâàåò ñòðîêó
var
 s1:String;
 i, ln, n, b:Integer;

begin
ln:=Length(str);
n:=ln div Length(keyText)+1; //Ñêîëüêî ðàç íóæíî ïîñòîðèòü øèôðóþùóþ ñòðîêó (êëþ÷)
s1:=''; //Ñòðîêà, ïîâòîðÿþùàÿ øèôðóþùóþ, íî íóæíîé äëèííû
for i:=1 to n do s1:=s1+keyText;
SetLength(s1, ln); //Äåëàþ íóæíîé äëèííû ñòðîêó
Result:='';
for i:=1 to ln do
 begin
 b:=(Ord(str[i])-Ord(s1[i])); //Âû÷èòàþ "íîìåðà â ðàñøèðåííîì àëôàâèòå"
 if b


uny   (2005-06-28 20:26:00) [6]

>текстовый
а точно - на выходе шифратора получается некий текст, будто даже художественный - рассказ какой нибудь(как спам странички в интернет). читаешь - бред, но читается - слова, предложения, а расшифруешь - какая то информация. так и называется - генератор бреда, только не расшифровывается...


Radgar   (2005-06-28 20:17:00) [7]

Есть такой "алгоритм"

Сначало идет какой либо текст, потом цифры типа ##-##-## (#-цифра). Первая цифра означает предложение, вторая - слово, третья - буква.


Anatoly Podgoretsky   (2005-06-28 20:12:00) [8]

gydvin   (28.06.05 19:13) [6]
Вопрос не столько про шифрование, а про текстовыйфайл, который должен остаться текстовым.


Starcom   (2005-06-28 20:02:00) [9]

TStas ©   (28.06.05 19:58) [8]

Интересует ... Плиз!

С уважением starcom! :7)


TStas   (2005-06-28 19:58:00) [10]

Есть такой алгоритм шифрования "по книге". Он не такой сложный на самом деле. Переводит текст в текст. Сломать его какими-то простыми способами невозможно. Нужно только написать две функции - расшифровка и шифрования. Притом они пишутся один раз и навсегда, меняется только текст "книга" по которой шифруют. Если это интересует, могу его описать


gydvin   (2005-06-28 19:20:00) [11]

Но сам этот код всетаки работает нестабильно. Надо ключ подбирать. Это которая key связано это с тем что код изменяемого в данный момент символа в этом коде может выскочить за пределы 1-256, но если поставить проверку на это дело так довольнотаки ничего.


gydvin   (2005-06-28 19:13:00) [12]

Вот попробуй

Вот ужасно простой пример XOR шифрования - работает без глюков.

function kode(k,t:string):string;
   var key, text, longkey, result : string;

i : integer;
toto, c : char;
begin

text:=t;
key:=k;
for i := 0 to (length(text) div length(key)) do
longkey := longkey + key;

for i := 1 to length(text) do begin
toto := chr((ord(text[i]) XOR ord(longkey[i]))); // XOR алгоритм
result := result + toto;
end;
end;  

вызов
s:=kode(#1#2#3,'Mama')


iskatel   (2005-06-28 15:40:00) [13]

PS как впрочем и для остальных, на вкладке indy misc


iskatel   (2005-06-28 15:37:00) [14]

еще легче бинарник записывается в текст спец созданными для этого алгоритмами UU, MIME, Base64 , для MIME даже компонент стандартный есть )))


Erik1   (2005-06-28 15:37:00) [15]

А что делает текстовой фаил, текстовым? Можеш просто заархивировать с паролем или использовать спецальные библиотеки для шифрования.


uny   (2005-06-28 15:35:00) [16]

бинарник легко записывается в текстовый файл, если каждый байт записывать двумя - используя 16-ричное представление, т.е. 0..f
255=ff, в виндовс калькуляторе тип hex


TUser   (2005-06-28 15:19:00) [17]

Нормальные способы шифрования сделают из текста бинарник. А тебе придется использовать к-л шифры замены и/или подстановки, что легко ломается.


Наверх

Титульная страница Поиск, карта сайта Написать письмо