![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Зашифровать строку [D5, Win95/98, WinME, NT4, Win2k, WinXP]
Елена © (2002-02-18 07:45:00)Подскажите, пожалуйста, какой-нибудь несложный алгоритм шифрования строки.
Заранее благодарна.
MIA (2002-02-20 11:39:00) [1]Самое простое
for i:=1 to length(st_init) do
st_fin:=st_fin+chr(255-ord(st_init[i]));
Ещё более надёжная, но более громоздко и также очень простая
Создать множество из 255 символов в произвольном порядке (известном только вам)
И в итоговую строку ставить прототип из этого множества.
И т.д. и т.п.
MBo (2002-02-18 13:35:00) [2]а, уже написали
>22606
>приняли неправильно
Правильно я понял - MrBeer дал дельный совет, и не его вина, если он не был воспринят из-за трудности реализации. Ну ладно, все кончилось миром.
Елена (2002-02-18 13:31:00) [3]Все сохранила в отдельной папочке :o)
MBo (2002-02-18 13:28:00) [4]избавление от непечатных типа 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;
22606 (2002-02-18 12:30:00) [5]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. Спасибо и Вам за Ваше Спасибо. :-)
Елена (2002-02-18 12:24:00) [6]SDS, да для Вас!
SDS (2002-02-18 12:17:00) [7]to [NIKEL]
Ну, наверное, для тебя и может для Вашего покорного слуги да, не составит, но для человека который C/C++ даже в глаза не видел это будет несколько сложней :)
to Елена
Если спасибо для Дмитрия это для меня (я тоже Дмитрий), тогда не за что, всегда рад помочь :)
Елена (2002-02-18 11:47:00) [8]Олег и Дмитрий
Спасибо!!!
[NIKEL] (2002-02-18 11:46:00) [9]
2 SDS слишком громоздко :) девушка попрасила лёгкий алгоритм :)
вот он - лёгкий :) одна функция и шифрует и дешифрует
а на счет Билдера - тот же Дельфи тока С++ :) и переписать функцию не составит проблем на Дельфи и обратно :)
SDS (2002-02-18 11:32:00) [10]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;
22606 (2002-02-18 11:32:00) [11]To Елена:
Наши с Вами пути раньше не пересекались в Интернете ?
Или Вы просто узнали мое имя в анкете ?
To MrBeer ©: Неужели Вы сами никогда не хотели очень быстро получить конкретный ответ на свой вопрос. Или Вы предпочитаете встрявать в длительные диспуты для решения пустячного вопроса ?
Меня всегда такие ответы наталкивают на мысль, что человек не может промолчать, что он что-то знает, но говорить этого не хочет. Типа: а я вот знаю и этот алгоритм и Си и Ассемблер, но не скажу, так как жаба давит, но похвастаться хочется, ну разве что если меня очень попросят (а я еще поламаюсь), похвалят, тогда сделаю широкий жест и поделюсь частью своих знаний, но не всеми, пусть человек еще помучается.
Извините, утрирую, но очень часто так бывает. Даже просто в жизни.
[NIKEL] (2002-02-18 11:01:00) [12]первое что на ум пришло :)
сложение каждого символа строки с ключом по операции исключающее ИЛИ, чтоб раскодировать надо сделать тоже самое с закадированной стракой с тем же ключом и тебе вернётся исходная строка
можно реализовать так :
AnsiString Code() AnsiString s, char Key)
{
for(int i = 1;i <= s.Lenght(); i++)
s[i] = s[i] ^ Key;//или так можно записать s[i] ^= Key
return s;
}
Елена (2002-02-18 10:59:00) [13]Олег, Вы совершенно правы, я не планирую создать новую систему криптозащиты.
MrBeer, я прошу прощения, если обидела Вас.
MrBeer (2002-02-18 10:54:00) [14]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.
22606 (2002-02-18 10:47:00) [15]To MBo ©: девушка Вас, я так понял, как раз похвалила и поставила в пример, а Вы приняли ее похвалу неправильно.
MrBeer ©: вместо пререканий взяли-бы и перевели эти 3 строки в код Делфи. Или Вы откликнулись на вопрос, для того, чтобы покрасоваться знаниями языков.
И зря Вы так критикуете этот алгоритм. Я уверен, что Елена не проектирует новую систему криптозащиты, а для 95 % обычныхпользователей этот алгоритм будет неразрешим. Да и, по-большому счету, при достаточной длине ключа (равной, например, длине шифруемого текста) не расшифруете его и Вы.
Елена (2002-02-18 10:31:00) [16]Я ввожу 123456789, а возвращается -
Фэ (2002-02-18 10:11:00) [17]Для кодирования бинарных файлов существуют uuencode и mime64.
Строки с CR+LF можно рассматривать как частный случай.
MBo (2002-02-18 09:27:00) [18]эта ерунда - зашифрованная строка, в которой могут быть любые символы от #0 до #255
Елена (2002-02-18 09:02:00) [19]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;
Задаю строку и получается какая-то ерунда :(
MrBeer (2002-02-18 08:49:00) [20]2 Елена:
ochen izvinajusj chto sdelal glupostj otvetiv na vopros.
best regards.