![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
шифрация данных в текстовом файле [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]Нормальные способы шифрования сделают из текста бинарник. А тебе придется использовать к-л шифры замены и/или подстановки, что легко ломается.