Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2002.03.07;
Скачать: [xml.tar.bz2];

Вниз

Зашифровать строку   Найти похожие ветки 

 
Елена   (2002-02-18 07:45) [0]

Подскажите, пожалуйста, какой-нибудь несложный алгоритм шифрования строки.
Заранее благодарна.


 
MrBeer   (2002-02-18 08:05) [1]

TEA - Tiny Encryption Algorithm
http://vader.brad.ac.uk/tea/tea.shtml

best regards.


 
Елена   (2002-02-18 08:26) [2]

Там все на Си :(


 
MrBeer   (2002-02-18 08:26) [3]

esli ti ne v silah perevesti 3 strochki na C... nu znaesh...

best regards.


 
MBo   (2002-02-18 08:30) [4]

в текстовый файл сохранять надо?
если нет, может подойти простейшее xor-шифрование
for i:=1 to length(s) do
s[i]:=chr(ord(s[i]) xor ord(passw[1+(i mod length(passw))]));
одно и то же для шифрования/расшифровки
при этом в строке могут получиться непечатные символы (<#32)



 
MrBeer   (2002-02-18 08:34) [5]

2 MBo:

nda kriptostoikostj prosto "blesk". TEA - 3 stroki encrypt, 3 decrypt. Po idee stoikostj na urovne IDEA, kljuch 128bit.

best regards.


 
MBo   (2002-02-18 08:36) [6]

>MrBeer
так и цель неясна - вдруг и этого хватит


 
Елена   (2002-02-18 08:40) [7]

2 MrBeer

Учитесь отвечать у MBo ©


 
MrBeer   (2002-02-18 08:42) [8]

2 MBo:

Nu v principe da, tolko shifracija xor-om malo spasjot...

2 Елена:

Esli C ne nravitsja, tam estj esho versii na assembler-e

best regards.


 
Елена   (2002-02-18 08:45) [9]

2 MrBeer

Может мне еще перейти на программирование в машинных кодах?


 
MBo   (2002-02-18 08:48) [10]

>Елена
>Учитесь отвечать
некорректно.

Надо более полно ставить вопрос - решение зависит от этого
В каком-то случае сойдет и тот примитив, который я указал, но это, во первых, "от дурака", во вторых, не подлежит записи в текстовый файл - могут появиться, например символы #10, #13 - нежеланные переводы строк и соответственно неверная расшифровка.
Для исключения этого можно записывать строку в filestream - сначала длину, потом данные


 
MrBeer   (2002-02-18 08:49) [11]

2 Елена:

ochen izvinajusj chto sdelal glupostj otvetiv na vopros.

best regards.


 
Елена   (2002-02-18 09:02) [12]

MBo, у меня что-то не получается :(

procedure TForm1.Button1Click(Sender: TObject);
const
passw="2002";
var
i: integer;
s: string;
begin
s:=Edit1.Text;
for i:=1 to length(s) do
s[i]:=chr(ord(s[i]) xor ord(passw[1+(i mod length(passw))]));
Edit2.Text:=s;
end;

Задаю строку и получается какая-то ерунда :(


 
MBo   (2002-02-18 09:27) [13]

эта ерунда - зашифрованная строка, в которой могут быть любые символы от #0 до #255


 
Фэ   (2002-02-18 10:11) [14]

Для кодирования бинарных файлов существуют uuencode и mime64.
Строки с CR+LF можно рассматривать как частный случай.


 
Елена   (2002-02-18 10:31) [15]

Я ввожу 123456789, а возвращается -


 
22606   (2002-02-18 10:47) [16]

To MBo ©: девушка Вас, я так понял, как раз похвалила и поставила в пример, а Вы приняли ее похвалу неправильно.

MrBeer ©: вместо пререканий взяли-бы и перевели эти 3 строки в код Делфи. Или Вы откликнулись на вопрос, для того, чтобы покрасоваться знаниями языков.
И зря Вы так критикуете этот алгоритм. Я уверен, что Елена не проектирует новую систему криптозащиты, а для 95 % обычных пользователей этот алгоритм будет неразрешим. Да и, по-большому счету, при достаточной длине ключа (равной, например, длине шифруемого текста) не расшифруете его и Вы.






 
MrBeer   (2002-02-18 10:54) [17]

2 22606:

Ljudi slishkom chasto hotjat vsjo gotovoe na bljudechke s goluboi kojomochkoi, nado bi i samim porabotatj.

"для 95 % обычных пользователей этот алгоритм будет неразрешим"

"Obichnie" polzovateli ne zanimajutsja lomaniem algoritmov, dlja etovo nahodjatsja ljudi namnogo bolee prodvinutie... Hotja v Vashih slovah mozhet bitj dolja pravdi, t.k. Елена vsjo esho ne skazala zachem eto nuzhno.

Best regards.


 
Елена   (2002-02-18 10:59) [18]

Олег, Вы совершенно правы, я не планирую создать новую систему криптозащиты.

MrBeer, я прошу прощения, если обидела Вас.


 
[NIKEL]   (2002-02-18 11:01) [19]

первое что на ум пришло :)
сложение каждого символа строки с ключом по операции исключающее ИЛИ, чтоб раскодировать надо сделать тоже самое с закадированной стракой с тем же ключом и тебе вернётся исходная строка
можно реализовать так :


AnsiString Code() AnsiString s, char Key)
{
for(int i = 1;i <= s.Lenght(); i++)
s[i] = s[i] ^ Key;//или так можно записать s[i] ^= Key
return s;
}



 
22606   (2002-02-18 11:32) [20]

To Елена:
Наши с Вами пути раньше не пересекались в Интернете ?
Или Вы просто узнали мое имя в анкете ?

To MrBeer ©: Неужели Вы сами никогда не хотели очень быстро получить конкретный ответ на свой вопрос. Или Вы предпочитаете встрявать в длительные диспуты для решения пустячного вопроса ?
Меня всегда такие ответы наталкивают на мысль, что человек не может промолчать, что он что-то знает, но говорить этого не хочет. Типа: а я вот знаю и этот алгоритм и Си и Ассемблер, но не скажу, так как жаба давит, но похвастаться хочется, ну разве что если меня очень попросят (а я еще поламаюсь), похвалят, тогда сделаю широкий жест и поделюсь частью своих знаний, но не всеми, пусть человек еще помучается.
Извините, утрирую, но очень часто так бывает. Даже просто в жизни.


 
SDS   (2002-02-18 11:32) [21]

to [NIKEL] - Опять C (даже по - мойму C++ - если я не путаю CBuilder там класс AnsiString) :)
to Елена
Вы на них внимания не обращайте, для большинства программистов девушка и программирование это нечто из области фантастики, прошу за нас всех скопом прощения, вот процедур строки готовые и на паскале, надеюсь подойдет, если, что пишите на "мыло", я тут в последнее время не часто бываю :)
Расшифровка

function Decrypt(const s : string; Key : word) : string;
var
i : integer;
c1, c2 : word;

begin
c1 := $DA4D;
c2 := $15B1;
Result := s;
for i := 1 to length(S) do begin
Result[i] := char(byte(s[i]) xor (Key shr 8));
Key := (byte(s[i]) + Key) * c1 + c2;
end;
end;

Шифровка

function Encrypt(const s : string; Key : word) : string;
var
i : integer;
c1, c2 : word;

begin
c1 := $DA4D;
c2 := $15B1;
Result := S;
for i := 1 to length(s) do begin
Result[i] := char(byte(s[i]) xor (Key shr 8));
Key := (byte(Result[i]) + Key) * c1 + c2;
end;
end;



 
[NIKEL]   (2002-02-18 11:46) [22]


2 SDS слишком громоздко :) девушка попрасила лёгкий алгоритм :)
вот он - лёгкий :) одна функция и шифрует и дешифрует
а на счет Билдера - тот же Дельфи тока С++ :) и переписать функцию не составит проблем на Дельфи и обратно :)


 
Елена   (2002-02-18 11:47) [23]

Олег и Дмитрий
Спасибо!!!


 
SDS   (2002-02-18 12:17) [24]

to [NIKEL]
Ну, наверное, для тебя и может для Вашего покорного слуги да, не составит, но для человека который C/C++ даже в глаза не видел это будет несколько сложней :)
to Елена
Если спасибо для Дмитрия это для меня (я тоже Дмитрий), тогда не за что, всегда рад помочь :)


 
Елена   (2002-02-18 12:24) [25]

SDS, да для Вас!


 
22606   (2002-02-18 12:30) [26]

To [NIKEL] ©: Легкий скорее всего подразумевался легкореализуемый, а не имеющий меньшее число строк кода.

TO Елена: Позволю себе добавить к коду Дмитрия пару советов.
1. i лучше объявить как LongInt (текст может быть большой)

var I: LongInt;

2. значениям c1 и с2 лучше присвоить свои значения, их можно объявить как константы и вынести за пределы самих функций (не упоминать как var в каждой).
Например:

const
C1 = 2222; // здесь нужно подставить свои значения
C2 = 3333; // здесь нужно подставить свои значения


3. Если Вы собираетесь где-то сохранять зашифрованное значение, не забывайте, как правильно предупреждал MBo ©, что там могут быть непечатаемые символы (с кодом до 32) и последующее считывание может вернуть другой результат.
Для предотвращения этого, зашифрованный результат можно сохранить, преобразовав его в шестнадцатиричное представление.
А при считывании преобразовать обратно.
Например функциями

(*************************************************************
Asc2Hex( <String>) - Конвертирует строку, возвр 16-ричное
представление (длина в 2 раза больше)
**************************************************************)
function Asc2Hex(sStroka:String): String;
var i:integer;
begin
Result:="";
for i:=1 to length(sStroka) do
Result := Result+IntToHex(Byte(sStroka[i]),2);
end;

(***************************************************************
Hex2Asc( <String>) - РасКонвертирует строку, конверт ранее Asc2Hex
в обычный формат (длина в 2 раза меньше)
***************************************************************)
function Hex2Asc(sStroka:String): String;
var i:integer;
begin
Result:="";
for i:=0 to (length(sStroka) div 2)-1 do
Result := Result+Char(StrToIntDef("$"+copy(sStroka,i*2+1,2),0));
end;



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

4. Спасибо и Вам за Ваше Спасибо. :-)


 
MBo   (2002-02-18 13:28) [27]

избавление от непечатных типа uuencode
строка удлиняется в 4/3 раза

procedure encryptxor(s,pass:string;var s1:string);
var i,j,k:integer;
begin
if (length(s)=0) or (length(pass)=0) then exit;
for i:=1 to length(s) do
s[i]:=chr(ord(s[i]) xor ord(pass[1+(i mod length(pass))]));
case length(s) mod 3 of
1: s:=s+#255#255;
2: s:=s+#255;
end;
s1:="";
for i:=1 to length(s) div 3 do begin
j:=(ord(s[3*i-2]) and 252) shr 2;
s1:=s1+chr(j+48);
j:=(ord(s[3*i-2]) and 3) shl 4;
k:=(ord(s[3*i-1]) and 240) shr 4;
s1:=s1+chr((j or k)+48);
j:=(ord(s[3*i-1]) and 15) shl 2;
k:=(ord(s[3*i]) and 192) shr 6;
s1:=s1+chr((j or k)+48);
k:=(ord(s[3*i]) and 63);
s1:=s1+chr(k+48);
end;
end;

procedure decryptxor(s,pass:string;var s1:string);
var i,j,k:integer;
begin
if (length(s)=0) or (length(pass)=0) then exit;
s1:="";
for i:=1 to length(s) div 4 do begin
k:=(ord(s[4*i-3])-48) shl 2;
j:=((ord(s[4*i-2])-48) and 48) shr 4;
s1:=s1+chr(k or j);
k:=((ord(s[4*i-2])-48) and 15) shl 4;
j:=((ord(s[4*i-1])-48) and 60) shr 2;
s1:=s1+chr(k or j);
k:=((ord(s[4*i-1])-48) and 3) shl 6;
j:=(ord(s[4*i])-48);
s1:=s1+chr(k or j);
end;
while s1[length(s1)]=#255 do delete(s1,length(s1),1);
for i:=1 to length(s1) do
s1[i]:=chr(ord(s1[i]) xor ord(pass[1+(i mod length(pass))]));
end;


 
Елена   (2002-02-18 13:31) [28]

Все сохранила в отдельной папочке :o)


 
MBo   (2002-02-18 13:35) [29]

а, уже написали

>22606
>приняли неправильно
Правильно я понял - MrBeer дал дельный совет, и не его вина, если он не был воспринят из-за трудности реализации. Ну ладно, все кончилось миром.


 
MIA   (2002-02-20 11:39) [30]

Самое простое
for i:=1 to length(st_init) do
st_fin:=st_fin+chr(255-ord(st_init[i]));

Ещё более надёжная, но более громоздко и также очень простая
Создать множество из 255 символов в произвольном порядке (известном только вам)
И в итоговую строку ставить прототип из этого множества.
И т.д. и т.п.



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2002.03.07;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.52 MB
Время: 0.006 c
3-19106
klnyaz17
2002-02-08 15:07
2002.03.07
Где просмотреть поле значения которого представляют собой HTML страницы?


1-19141
Sergy
2002-02-18 12:15
2002.03.07
Определить подстроку в строке


1-19123
Andreyka
2002-02-20 19:58
2002.03.07
Вопросец про кнопки


14-19319
Aledo
2002-01-21 20:31
2002.03.07
Телеработа


1-19250
plash07
2002-02-19 17:44
2002.03.07
Как правильно перенести код из VB в Delphi?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский