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

Вниз

Проведите ликбез по криптографии, пожалуйста   Найти похожие ветки 

 
miwa ©   (2004-06-01 15:08) [0]

а то вижу, что реализую маленькую идею только став большим специалистом :о))
Имеется:
куча пользователей с паролями в открытом виде в базе interbase.
Надо:
зашифровать к чертям все пароли желательно без возможности восстановления. Ну, и потом при аутентификации пользователя шифровать полученный пароль и сверять с зашифрованным в базе.
Соотвественно подскажите, полжалуйста, где найти либо UDF, либо компоненты; доку, желательно попроще, без математики (я же не собираюсь реализовывать все эти алгоритмы...).


 
Layner ©   (2004-06-01 15:12) [1]

ну вот например шифрование

C1 = 14343;   //это для шифрования/дешифрования
C2 = 34567;   //ключи


function Encrypt(const S: String; Key: Word): String;
var
  I: Integer;
begin
 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;


function Decrypt(const S: String; Key: Word): String;
var
  I: Integer;
begin
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;


Автор - Анатолий Подгорецкий. У него на сайте вроде нашел. За что ему спасибо.


 
miwa ©   (2004-06-01 15:19) [2]

Мне почему-то кажется, что криптостойкость таких паролей будет невелика :о). Правда, оспаривать АП не буду :о)), но все же. Есть ли возможность подключить сюда да тот же DES?


 
nikkie ©   (2004-06-01 15:19) [3]

>зашифровать к чертям все пароли желательно без возможности восстановления.
это тебе хеши нужны

компоненты:
LockBox
http://www.turbopower.com/
или
DCPcrypt
http://www.cityinthesky.co.uk/delphi.html


 
Vlad ©   (2004-06-01 15:20) [4]


> miwa ©   (01.06.04 15:08)  


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

Используй хэш-функции, тогда никто не расшифрует
В сети полно исходников валяется. Возьми какой нибудь популярный алгоритм, MD5 или SHA и пользуйся.


 
default ©   (2004-06-01 15:29) [5]

можешь CRC32 использовать и размер данных описыв-их зашифр-ый пароль будет 4 байта, а не длина пароля


 
Рамиль ©   (2004-06-01 15:29) [6]

Лучше так:


const
 Delta=$9E3779B9; //константа алгоритма TEA

type
 TKey = array[0..3] of LongWord;   //128-ми битный ключ
 TBlock = array[0..1] of LongWord; //64-х битный блок

var
 FKey: TKey;

function XORBlocks(var Block1, Block2: TBlock): TBlock;
begin
 Result[0] := Block1[0] xor Block2[0];
 Result[1] := Block1[1] xor Block2[1];
end;

function ConcatBlocks(var Block1, Block2: TBlock): TKey;
begin
 Result[0] := Block1[0];
 Result[1] := Block1[1];
 Result[2] := Block2[0];
 Result[3] := Block2[1];
end;

procedure EnCryptBlock(var Block: TBlock);
var
 i, Sum: Longword;
begin
 Sum := 0;
 for i := 0 to 31 do
 begin
   inc(Sum, Delta);
   inc(Block[0],((Block[1] shl 4) + FKey[0]) xor (Block[1] + Sum) xor ((Block[1] shr 5) + FKey[1]));
   inc(Block[1],((Block[0] shl 4) + FKey[2]) xor (Block[0] + Sum) xor ((Block[0] shr 5) + FKey[3]));
 end;
end;

procedure HashPassword(Password: string);
var
 H, G, Temp, Psw: TBlock;
 Stream: TMemoryStream;
 i, AddCount: integer;
 Buf: array[0..7] of char;
begin
 FillChar(H, SizeOf(H), 0);
 G := H;
 FillChar(Buf, SizeOf(Buf), 0);
 Stream := TMemoryStream.Create;
 try
   Stream.Write(PChar(Password)^, SizeOf(Char) * Length(Password));
   SetString(Password, PChar(StringOfChar(#0, Length(Password))), Length(Password));
   AddCount := (8 - Stream.Size mod 8) mod 8;
   if Stream.Size = 0 then AddCount := 8;
   Stream.Write(Buf, AddCount);
   Stream.Position := 0;
   //хеш-алгоритм "Tandem DM"
   for i := 1 to Stream.Size div 8 do
   begin
     Stream.Read(Psw, 8);
     Temp := H;
     FKey := ConcatBlocks(G, Psw);
     EnCryptBlock(Temp);
     H := XORBlocks(H, Temp);
     FKey := ConcatBlocks(Psw, Temp);
     Temp := G;
     EnCryptBlock(Temp);
     G := XORBlocks(G, Temp);
     FillChar(Temp, 8, 0);
     Stream.Position := Stream.Position - 8;
     Stream.Write(Temp, 8);
   end;
   FKey := ConcatBlocks(G, H);
 finally
   Stream.Free;
 end;
end;


Это часть модуля шифрования по алгоритму TEA, но так как распространение и использование средств шифрования без лицензии ФАПСИ запрещено, выкладываю только хеширование пароля:)
После вызова HashPassword в FKEY будет хеш пароля размером 128 бит.


 
__   (2004-06-01 15:33) [7]

http://delphibase.endimus.com/?action=viewtopic&topic=mathcode

http://delphibase.endimus.com/?action=viewtopic&topic=strcode


 
miwa ©   (2004-06-01 16:47) [8]


>  [3] nikkie ©   (01.06.04 15:19)
> это тебе хеши нужны
> компоненты:

Правда, да только хеши-то все время разные, значит простым сравнением их не идентифицируешь. Вот почему я о UDF спрашивал: есть такая (такие?), которые хеши сравнивать будут? Беда в том, что проверка из-под шелла или из базы должна идти. Поэтому-то и вопросс возник. Поэтому же и в "Потрепаться", а не в "Базах" или "Основной".
Тоесть, кроме как 4 Vlad:
> Возьми какой нибудь популярный алгоритм, MD5 или SHA и пользуйся
больше ничего не проканает?


 
miwa ©   (2004-06-01 16:47) [9]


>  [3] nikkie ©   (01.06.04 15:19)
> это тебе хеши нужны
> компоненты:

Правда, да только хеши-то все время разные, значит простым сравнением их не идентифицируешь. Вот почему я о UDF спрашивал: есть такая (такие?), которые хеши сравнивать будут? Беда в том, что проверка из-под шелла или из базы должна идти. Поэтому-то и вопросс возник. Поэтому же и в "Потрепаться", а не в "Базах" или "Основной".
Тоесть, кроме как 4 Vlad:
> Возьми какой нибудь популярный алгоритм, MD5 или SHA и пользуйся
больше ничего не проканает?


 
__   (2004-06-01 16:50) [10]

Брюс Шнайфер "Прикладная криптография. 2-е издание. Протоколы, алгоритмы и исходные тексты на языке С"

Там есть пример: DES, IDEA и ещё парочки.


 
Layner ©   (2004-06-01 16:51) [11]

использование средств шифрования без лицензии ФАПСИ запрещено, выкладываю только хеширование пароля:)

Да уж чего такого страшного, если и весь тут опубликуется? Сам наверное тоже на форуме каком нибудь нашел :) не ФАПСИ же дала.


 
Рамиль ©   (2004-06-01 16:54) [12]


> да только хеши-то все время разные,

Как это разные? Где ты в алгоритме получения хеша random видел?

> больше ничего не проканает?

чем тебе не нравится мой пример? Полностью рабочий.


 
nikkie ©   (2004-06-01 16:56) [13]

>Правда, да только хеши-то все время разные
с чего бы это?

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


 
miwa ©   (2004-06-01 20:06) [14]

Может что-то не то говорю, но все же.
В этом компоненте, например,

>  [3] nikkie ©   (01.06.04 15:19)
> компоненты:
> LockBox
> http://www.turbopower.com/

в демке каждый раз когда жмешь "Decode" получаешь различный результат (для DES). Потому и подумал, что хеш все время разный.

> приложение, работающее с базой будет хеш вычислять. в чем
> проблема?

Приложение-то shell"авый скрипт, а я и дельфи-то толком не знаю. Ничего, подучусь ;о)).
Всем спасибо. Буду что-то сам писать на основе [6],[7].


 
Dok_3D ©   (2004-06-01 20:23) [15]

Ну до чего народ сложный ...:)) Сам проблемы придумывает, сам же их и решает ...

2 miwa  
Не читай все это. Используй CryptoApi от Microsoft. Выбирай любой понравившийся тебе криптопровайдер - и вперед.


 
nikkie ©   (2004-06-01 21:19) [16]

>Сам проблемы придумывает, сам же их и решает ...
я тоже самое могу сказать про
>Используй CryptoApi от Microsoft.
:)



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

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

Наверх





Память: 0.5 MB
Время: 0.03 c
14-1086109285
VeTaL
2004-06-01 21:01
2004.06.20
Удаление файла


14-1086096813
Flyer
2004-06-01 17:33
2004.06.20
Помогите с дипломной


6-1082971824
Dmitriy_R
2004-04-26 13:30
2004.06.20
Помогите с сокетом разобраться


1-1086233758
rtf
2004-06-03 07:35
2004.06.20
Как узнать количество дней между двумя датами?


3-1085526186
Игорь
2004-05-26 03:03
2004.06.20
Помогите разобраться с SQL запросом. Спасибо





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский