Вверх ↑
Пакеты 
HiAsm4
Windows 
Компоненты 
Инcтpумeнты 
Криптография 
Статьи - Примеры

Примеры
[color=#800000]Примеры работы с компонентами криптографии[/color]
  В данном разделе рассмотрим основные концепции шифрования данных при помощи компонентов криптографии
  Начнем с самого простого способа шифрования — симметричного шифрования
[color=#000080]Пример симметричного шифрования (Encrypt_Decrypt)[/color]

Add(MainForm,2953706,126,259)
{
Width=365
Height=225
Caption="Encrypt_Decrypt Data"
Position=1
}
Add(Label,13557379,49,231)
{
Left=5
Top=12
Width=81
Height=17
Font=[MS Sans Serif,8,1,0,1]
Caption="External Key:"
AutoSize=1
Alignment=1
}
Add(Edit,4117780,210,140)
{
Left=90
Top=10
Width=255
Font=[MS Sans Serif,8,1,0,204]
Cursor=1
WinStyle=2
Text="project_hiasm"
}
Add(Label,1928280,56,238)
{
Left=5
Top=37
Width=81
Height=17
Font=[MS Sans Serif,8,1,0,1]
Caption="Data:"
AutoSize=1
Alignment=1
}
Add(Edit,4281602,161,140)
{
Left=90
Top=35
Width=255
Font=[MS Sans Serif,8,1,0,204]
Cursor=1
WinStyle=2
Text="Hello!!! World"
}
Add(Label,8844794,62,245)
{
Left=5
Top=62
Width=81
Height=17
Font=[MS Sans Serif,8,1,0,1]
Caption="Encrypt Data:"
AutoSize=1
Alignment=1
}
Add(Button,14383413,126,217)
{
Left=150
Top=85
Width=70
Font=[MS Sans Serif,8,1,0,1]
TabOrder=-1
Caption="Encrypt"
link(onClick,6333038:doEnCrypt,[])
}
Add(FileStream,5091686,581,203)
{
FileName="crypt_project.rc4"
Mode=1
AutoCopy=0
Point(doCopyFromStream)
}
Add(StreamConvertor,4792398,532,217)
{
Mode=7
link(onResult,5091686:doCopyFromStream,[])
}
Add(Edit,2238004,483,357)
{
Left=90
Top=110
Width=255
Font=[Courier New,8,0,0,204]
Cursor=1
TabOrder=-1
WinStyle=2
Text=""
ReadOnly=0
}
Add(Label,11542815,70,252)
{
Left=5
Top=112
Width=81
Height=17
Font=[MS Sans Serif,8,1,0,1]
Caption="Encrypt Data:"
AutoSize=1
Alignment=1
}
Add(Label,16255131,76,259)
{
Left=5
Top=137
Width=81
Height=17
Font=[MS Sans Serif,8,1,0,1]
Caption="Decrypt Data:"
AutoSize=1
Alignment=1
}
Add(Edit,8331896,532,308)
{
Left=90
Top=135
Width=255
Font=[Courier New,8,0,0,204]
Cursor=1
TabOrder=-1
WinStyle=2
Text=""
ReadOnly=0
}
Add(Button,15489552,126,308)
{
Left=150
Top=160
Width=70
Font=[MS Sans Serif,8,1,0,1]
TabOrder=-1
Caption="Decrypt"
link(onClick,16650960:doEvent1,[])
}
Add(StreamConvertor,1636,252,308)
{
Mode=6
link(onResult,8197233:doSearch,[])
}
Add(FileStream,11110613,203,308)
{
FileName="crypt_project.rc4"
link(onLoad,1636:doConvert,[])
}
Add(Hub,9860667,350,308)
{
link(onEvent1,11801657:doReplace,[])
link(onEvent2,3503958:doTrim,[(376,321)(376,363)])
}
Add(GetDataEx,16166021,210,175)
{
link(Data,4117780:Text,[])
}
Add(FormatStr,14679024,434,217)
{
DataCount=1
Mask="-----BEGIN DATA-----\r\n%1\r\n-----END DATA-----"
link(onFString,4792398:doConvert,[])
}
Add(MultiElement,9306811,252,217)
{
@Hint=#13:Str -> Base64|
link(onEvent1,7028978:doEvent1,[])
AddHint(37,-32,79,13,@Hint)
}
BEGIN_SDK
Add(EditMulti,15700352,21,21)
{
EventCount=1
WorkCount=1
Width=328
Height=221
VOffset=21
link(doWork1,5609255:doCharset,[])
}
Add(Memory,13733457,98,42)
{
link(onData,10859049:doLength,[(140,48)(140,34)(86,34)(86,125)])
}
Add(Length,10859049,98,119)
{
link(onLength,11434037:doFor,[])
link(Str,4897077:Var2,[])
}
Add(For,11434037,147,119)
{
Start=1
Step=64
InData=0
link(onEvent,10749079:doCopy,[])
link(onStop,7070829:doTrim,[(194,132)(194,195)])
}
Add(Copy,10749079,203,119)
{
Count=64
link(onCopy,11002321:doStrCatDlm,[])
link(Str,4897077:Var3,[(209,96)])
}
Add(GetDataEx,4897077,98,91)
{
link(Data,13733457:Value,[])
}
Add(StrCatDelim,11002321,259,119)
{
Delimiter="\r\n"
Point(doClear)
link(Str1,3351435:Var3,[(265,107)(300,107)(300,166)])
}
Add(Trim,7070829,259,189)
{
Char="\r\n"
Mode=3
link(onTrim,4413279:doEvent1,[])
link(Text,3351435:Var2,[])
}
Add(Hub,4413279,308,189)
{
link(onEvent1,15700352:onEvent1,[(331,195)(331,48)])
link(onEvent2,11002321:doClear,[(331,202)(331,234)(247,234)(247,132)])
}
Add(GetDataEx,3351435,259,161)
{
link(Data,11002321:Result,[])
}
Add(Charset,5609255,42,42)
{
Type=5
link(onCharset,13733457:doValue,[])
}
END_SDK
Add(Edit,12405560,530,258)
{
Left=90
Top=60
Width=255
Font=[Courier New,8,0,0,204]
Cursor=1
TabOrder=-1
WinStyle=2
Text=""
ReadOnly=0
}
Add(Hub,7028978,350,217)
{
link(onEvent1,14679024:doString,[])
link(onEvent2,12405560:doText,[(393,230)(393,264)])
}
Add(Trim,3503958,434,357)
{
Char="\r\n"
Mode=3
link(onTrim,2238004:doText,[])
}
Add(BlockFind,8197233,301,308)
{
IncludeBlock=1
Delete=0
StartBlock="-----BEGIN DATA-----"
EndBlock="-----END DATA-----"
link(onSearch,9860667:doEvent1,[])
}
Add(Charset,13966134,434,308)
{
Type=4
link(onCharset,8724897:doDeCrypt,[])
}
Add(Replace,11801657,385,308)
{
SubStr="\r\n"
link(onReplace,13966134:doCharset,[])
}
Add(Hub,16650960,175,308)
{
link(onEvent1,11110613:doOpen,[])
link(onEvent2,11110613:doClose,[])
}
Add(EnCrypt,6333038,203,217)
{
Mode=1
link(onEnCrypt,9306811:doWork1,[])
link(Data,4281602:Text,[(209,195)(167,195)])
link(Key,16166021:Var2,[])
}
Add(DeCrypt,8724897,483,308)
{
Mode=1
link(onDeCrypt,8331896:doText,[])
link(Key,16166021:Var3,[(496,180)])
}

  При нажатии на кнопку Encrypt создается файл crypt_project.rc4, представляющий собой, шифрованную алгоритмом RC4 (потоковый шифр) и превращенную в текстовый формат Base64, строку Hello!!! World при помощи симметричного ключа — project_hiasm. Проверить расшифровку можно, нажав на кнопку Decrypt, файл будет прочитан и расшифрован. Это самый простой способ шифрования и самый незащищенный, поэтому дальше будем рассматривать более сложные способы шифрования, а именно — симметрично-асимметричный способ.

  Как нам уже известно, то для осуществления асимметричного шифрования необходимо иметь два ключа (ключевую пару) — закрытый ключ, который останется у нас и открытый ключ, который мы должны будем передать отправителю. Рассмотрим пример, как нам получить ключевую пару и отдельно открытый ключ. Отдельно получить закрытый ключ не получится, да он нам отдельно и не нужен, Если есть ключевая пара, то из нее закрытый ключ выберется тогда, когда он будет необходим.
[color=#000080]Пример генерации ключевой пары и открытого ключа (GenKeyPairs)[/color]

Add(MainForm,2953706,329,119)
{
Width=485
Height=410
Caption="GenKeyPairs"
Position=1
link(onCreate,15419547:doData,[])
}
Add(GenKeyPairs,7527656,224,238)
{
Point(doGenerateMode)
link(onResult,7596516:doSeparateMT,[])
}
Add(Memo,1783972,525,217)
{
Left=5
Top=5
Width=460
Height=195
Font=[Courier New,8,0,0,204]
TabOrder=-1
WinStyle=2
ReadOnly=0
}
Add(Memo,8334407,525,315)
{
Left=5
Top=225
Width=460
Height=70
Font=[Courier New,8,0,0,204]
TabOrder=-1
WinStyle=2
ReadOnly=0
}
Add(Label,11766587,259,119)
{
Left=200
Top=205
Width=85
Font=[MS Sans Serif,8,1,0,1]
Caption="KeyPair"
AutoSize=1
Alignment=2
}
Add(Label,15828431,266,126)
{
Left=200
Top=300
Width=85
Height=17
Font=[MS Sans Serif,8,1,0,1]
Caption="PublicKey"
AutoSize=1
Alignment=2
}
Add(Button,4807131,133,238)
{
Left=280
Top=345
Width=185
Height=21
Font=[MS Sans Serif,8,1,0,1]
TabOrder=-1
Caption="GenKeyPair"
link(onClick,7527656:doGenKeyPair,[])
}
Add(Hub,9631313,427,238)
{
link(onEvent1,1783972:doText,[])
link(onEvent2,14679024:doString,[(455,251)(455,279)])
}
Add(Hub,10874847,427,336)
{
link(onEvent1,8334407:doText,[])
link(onEvent2,14741656:doString,[(455,349)(455,377)])
}
Add(MT_MultiData,7596516,273,238)
{
link(onData1,14863464:doEnCrypt,[])
link(onData2,10789613:doWork1,[(317,251)(317,342)])
}
Add(Label,11158422,273,133)
{
Left=10
Top=322
Width=85
Height=17
Font=[MS Sans Serif,8,1,0,1]
Caption="PassKeyPair:"
AutoSize=1
Alignment=1
}
Add(Edit,2682454,336,175)
{
Left=105
Top=320
Width=360
Font=[MS Sans Serif,8,1,0,204]
WinStyle=2
Text="project_hiasm"
}
Add(FileStream,14988446,609,259)
{
Mode=1
AutoCopy=0
Point(doCopyFromStream)
link(FileName,1764584:String,[])
}
Add(FileStream,6992841,581,357)
{
Mode=1
AutoCopy=0
Point(doCopyFromStream)
link(FileName,2608489:String,[])
}
Add(StreamConvertor,7879394,525,273)
{
Mode=7
link(onResult,14988446:doCopyFromStream,[])
}
Add(StreamConvertor,14198454,525,371)
{
Mode=7
link(onResult,6992841:doCopyFromStream,[])
}
Add(FormatStr,14679024,469,273)
{
DataCount=1
Mask="-----BEGIN KEYPAIR-----\r\n%1\r\n-----END KEYPAIR-----"
link(onFString,7879394:doConvert,[])
}
Add(FormatStr,14741656,469,371)
{
DataCount=1
Mask="-----BEGIN PUBLICKEY-----\r\n%1\r\n-----END PUBLICKEY-----"
link(onFString,14198454:doConvert,[])
}
Add(MultiElement,9306811,378,238)
{
@Hint=#13:Str -> Base64|
link(onEvent1,9631313:doEvent1,[])
AddHint(37,-32,79,13,@Hint)
}
BEGIN_SDK
Add(EditMulti,15700352,21,21)
{
EventCount=1
WorkCount=1
Width=328
Height=221
VOffset=21
link(doWork1,5609255:doCharset,[])
}
Add(Memory,13733457,98,42)
{
link(onData,10859049:doLength,[(140,48)(140,34)(86,34)(86,125)])
}
Add(Length,10859049,98,119)
{
link(onLength,11434037:doFor,[])
link(Str,4897077:Var2,[])
}
Add(For,11434037,147,119)
{
Start=1
Step=64
InData=0
link(onEvent,10749079:doCopy,[])
link(onStop,7070829:doTrim,[(194,132)(194,195)])
}
Add(Copy,10749079,203,119)
{
Count=64
link(onCopy,11002321:doStrCatDlm,[])
link(Str,4897077:Var3,[(209,96)])
}
Add(GetDataEx,4897077,98,91)
{
link(Data,13733457:Value,[])
}
Add(StrCatDelim,11002321,259,119)
{
Delimiter="\r\n"
Point(doClear)
link(Str1,3351435:Var3,[(265,107)(300,107)(300,166)])
}
Add(Trim,7070829,259,189)
{
Char="\r\n"
Mode=3
link(onTrim,4413279:doEvent1,[])
link(Text,3351435:Var2,[])
}
Add(Hub,4413279,308,189)
{
link(onEvent1,15700352:onEvent1,[(331,195)(331,48)])
link(onEvent2,11002321:doClear,[(331,202)(331,234)(247,234)(247,132)])
}
Add(GetDataEx,3351435,259,161)
{
link(Data,11002321:Result,[])
}
Add(Charset,5609255,42,42)
{
Type=5
link(onCharset,13733457:doValue,[])
}
END_SDK
Add(MultiElement,10789613,378,336)
{
@Hint=#13:Str -> Base64|
link(onEvent1,10874847:doEvent1,[])
AddHint(37,-29,79,13,@Hint)
}
BEGIN_SDK
Add(EditMulti,7118002,21,21)
{
EventCount=1
WorkCount=1
Width=328
Height=221
VOffset=21
link(doWork1,1034590:doCharset,[])
}
Add(Memory,204288,98,42)
{
link(onData,3671834:doLength,[(140,48)(140,34)(86,34)(86,125)])
}
Add(Length,3671834,98,119)
{
link(onLength,708993:doFor,[])
link(Str,13278847:Var2,[])
}
Add(For,708993,147,119)
{
Start=1
Step=64
InData=0
link(onEvent,10585589:doCopy,[])
link(onStop,8186701:doTrim,[(194,132)(194,195)])
}
Add(Copy,10585589,203,119)
{
Count=64
link(onCopy,3736710:doStrCatDlm,[])
link(Str,13278847:Var3,[(209,96)])
}
Add(GetDataEx,13278847,98,91)
{
link(Data,204288:Value,[])
}
Add(StrCatDelim,3736710,259,119)
{
Delimiter="\r\n"
Point(doClear)
link(Str1,16380385:Var3,[(265,107)(300,107)(300,166)])
}
Add(Trim,8186701,259,189)
{
Char="\r\n"
Mode=3
link(onTrim,7374949:doEvent1,[])
link(Text,16380385:Var2,[])
}
Add(Hub,7374949,308,189)
{
link(onEvent1,7118002:onEvent1,[(331,195)(331,48)])
link(onEvent2,3736710:doClear,[(331,202)(331,234)(247,234)(247,132)])
}
Add(GetDataEx,16380385,259,161)
{
link(Data,3736710:Result,[])
}
Add(Charset,1034590,42,42)
{
Type=5
link(onCharset,204288:doValue,[])
}
END_SDK
Add(ComboBox,2947032,427,91)
{
Left=105
Top=345
Width=165
Height=21
Font=[MS Sans Serif,8,1,0,1]
Strings=#11:KEYEXCHANGE|9:SIGNATURE|
ReadOnly=0
Point(onSelect)
Point(doSelect)
link(onClick,3998797:doWork2,[])
link(onSelect,3998797:doWork3,[(480,111)])
}
Add(DoData,15419547,378,133)
{
Data=Integer(0)
link(onEventData,2947032:doSelect,[])
}
Add(HubEx,3998797,476,98)
{
link(onEvent,2343403:doEvent1,[])
}
Add(StrList,1764584,588,63)
{
Strings=#22:crypt_project_exch.kpr|22:crypt_project_sign.kpr|
Point(doGetString)
Point(onGetString)
Point(String)
}
Add(Hub,2343403,504,98)
{
OutCount=3
link(onEvent1,7527656:doGenerateMode,[(535,104)(535,79)(207,79)(207,258)])
link(onEvent2,1764584:doGetString,[])
link(onEvent3,2608489:doGetString,[(535,118)(535,181)])
}
Add(StrList,2608489,560,133)
{
Strings=#22:crypt_project_exch.kpb|22:crypt_project_sign.kpb|
Point(doGetString)
Point(onGetString)
Point(String)
}
Add(EnCrypt,14863464,329,238)
{
Mode=4
link(onEnCrypt,9306811:doWork1,[])
link(Key,2682454:Text,[])
}

  При нажатии на кнопку GenKeyPair и выбрав перед этим режим KEYEXCHANGE для создания в будущем ключа обмена, генерируется ключевая пара, которая шифруется алгоритмом 3DES168 (на ваше усмотрение можно выбрать любой другой алгоритм шифрования) и, после преобразованимя в тестовый формато Base64, записывается в файл crypt_project_exch.kpr, и отдельно открытый ключ, который также текстовым форматом Base64 записывается в файл, но уже в другой — crypt_project_exch.kpb.
  Пока мы не создаем контейнеров и храним ключевую пару в файле, в зашифрованном виде. Из нее мы всегда сможем извлечь, при необходимости, открытый ключ. Покажем на примере, как можно извлечь из файла ключевой пары открытый ключ
[color=#000080]Пример извлечения открытого ключа из файла ключевой пары (ExtractPublicKey)[/color]

Add(MainForm,2953706,504,182)
{
Width=485
Height=190
Caption="ExtractPublicKey"
Position=1
link(onCreate,15419547:doData,[])
}
Add(GenKeyPairs,7527656,455,315)
{
link(onGetPublicKey,9306811:doWork1,[])
}
Add(Memo,8334407,651,301)
{
Left=5
Top=5
Width=460
Height=70
Font=[Courier New,8,0,0,204]
WinStyle=2
}
Add(Label,15828431,497,133)
{
Left=180
Top=80
Width=125
Height=17
Font=[MS Sans Serif,8,1,0,1]
Caption="PublicKey"
AutoSize=1
Alignment=2
}
Add(Button,4807131,84,322)
{
Left=280
Top=125
Width=185
Font=[MS Sans Serif,8,1,0,1]
TabOrder=-1
Caption="ExtractPublicKey"
link(onClick,15604023:doEvent1,[])
}
Add(Hub,10874847,560,322)
{
link(onEvent1,8334407:doText,[])
link(onEvent2,14741656:doString,[(588,335)(588,377)])
}
Add(Label,11158422,504,140)
{
Left=10
Top=102
Width=85
Height=17
Font=[MS Sans Serif,8,1,0,1]
Caption="PassKeyPair:"
AutoSize=1
Alignment=1
}
Add(Edit,2682454,413,252)
{
Left=105
Top=100
Width=360
Font=[MS Sans Serif,8,1,0,1]
WinStyle=2
Text="project_hiasm"
}
Add(FileStream,14988446,161,322)
{
link(onLoad,7879394:doConvert,[])
link(FileName,10707962:GetData,[])
}
Add(FileStream,6992841,700,357)
{
Mode=1
AutoCopy=0
Point(doCopyFromStream)
link(FileName,9657054:Var2,[])
}
Add(StreamConvertor,7879394,210,322)
{
Mode=6
link(onResult,8197233:doSearch,[])
}
Add(StreamConvertor,14198454,651,371)
{
Mode=7
link(onResult,6992841:doCopyFromStream,[])
}
Add(BlockFind,8197233,259,322)
{
IncludeBlock=1
Delete=0
StartBlock="-----BEGIN KEYPAIR-----"
EndBlock="-----END KEYPAIR-----"
link(onSearch,11801657:doReplace,[])
}
Add(Charset,13966134,357,322)
{
Type=4
link(onCharset,9349136:doDeCrypt,[])
}
Add(Replace,11801657,308,322)
{
SubStr="\r\n"
link(onReplace,13966134:doCharset,[])
}
Add(MultiElement,9306811,504,322)
{
@Hint=#13:Str -> Base64|
link(onEvent1,10874847:doEvent1,[])
AddHint(37,-32,79,13,@Hint)
}
BEGIN_SDK
Add(EditMulti,15700352,21,21)
{
EventCount=1
WorkCount=1
Width=328
Height=221
VOffset=21
link(doWork1,5609255:doCharset,[])
}
Add(Memory,13733457,98,42)
{
link(onData,10859049:doLength,[(140,48)(140,34)(86,34)(86,125)])
}
Add(Length,10859049,98,119)
{
link(onLength,11434037:doFor,[])
link(Str,4897077:Var2,[])
}
Add(For,11434037,147,119)
{
Start=1
Step=64
InData=0
link(onEvent,10749079:doCopy,[])
link(onStop,7070829:doTrim,[(194,132)(194,195)])
}
Add(Copy,10749079,203,119)
{
Count=64
link(onCopy,11002321:doStrCatDlm,[])
link(Str,4897077:Var3,[(209,96)])
}
Add(GetDataEx,4897077,98,91)
{
link(Data,13733457:Value,[])
}
Add(StrCatDelim,11002321,259,119)
{
Delimiter="\r\n"
Point(doClear)
link(Str1,3351435:Var3,[(265,107)(300,107)(300,166)])
}
Add(Trim,7070829,259,189)
{
Char="\r\n"
Mode=3
link(onTrim,4413279:doEvent1,[])
link(Text,3351435:Var2,[])
}
Add(Hub,4413279,308,189)
{
link(onEvent1,15700352:onEvent1,[(331,195)(331,48)])
link(onEvent2,11002321:doClear,[(331,202)(331,234)(247,234)(247,132)])
}
Add(GetDataEx,3351435,259,161)
{
link(Data,11002321:Result,[])
}
Add(Charset,5609255,42,42)
{
Type=5
link(onCharset,13733457:doValue,[])
}
END_SDK
Add(FormatStr,14741656,602,371)
{
DataCount=1
Mask="-----BEGIN PUBLICKEY-----\r\n%1\r\n-----END PUBLICKEY-----"
link(onFString,14198454:doConvert,[])
}
Add(ComboBox,2947032,602,154)
{
Left=105
Top=125
Width=165
Height=21
Font=[MS Sans Serif,8,1,0,1]
Strings=#11:KEYEXCHANGE|9:SIGNATURE|
ReadOnly=0
Point(onSelect)
Point(doSelect)
link(onClick,3998797:doWork2,[])
link(onSelect,3998797:doWork3,[(662,174)])
}
Add(DoData,15419547,553,196)
{
Data=Integer(0)
link(onEventData,2947032:doSelect,[])
}
Add(HubEx,3998797,658,161)
{
link(onEvent,2608489:doGetString,[])
}
Add(StrList,2608489,679,119)
{
Strings=#24:crypt_project_exch_1.kpb|24:crypt_project_sign_1.kpb|
Point(doGetString)
Point(onGetString)
Point(String)
}
Add(EventFromData,10707962,161,252)
{
link(onEvent,2802954:doPart,[])
}
Add(FilePartElm,2802954,210,252)
{
Mode=2
link(onPart,8560887:doReplace,[])
link(FileName,9657054:Var1,[(216,236)])
}
Add(GetDataEx,9657054,700,231)
{
link(Data,2608489:String,[])
}
Add(Replace,8560887,259,252)
{
SubStr="_1"
link(onReplace,11840973:doStrCat,[])
}
Add(StrCat,11840973,308,252)
{
Str2=".kpr"
link(onStrCat,10707962:doData,[(352,258)(352,246)(149,246)(149,258)])
}
Add(Hub,15604023,133,322)
{
link(onEvent1,14988446:doOpen,[])
link(onEvent2,14988446:doClose,[])
}
Add(DeCrypt,9349136,406,322)
{
Mode=4
link(onDeCrypt,7527656:doGetPublicKey,[])
link(Key,2682454:Text,[])
}

  При нажатии не кнопку ExtractPublicKey и выбрав перед этим режим KEYEXCHANGE (в данном случае, мы пытаемся извлечь открытый ключ для получения ключа обмена), на выходе получим файл crypt_project_exch_1.kpb в текстовом формате Base64. Если мы теперь сравним файл crypt_project_exch.kpb из примера GenKeyPairs и полученный файл crypt_project_esch_1.kpb, то увидим, что они совершенно идентичны. В дальнейшем, мы не будем использовать файл crypt_project_exch_1.kpb, так что можно спокойно его удалить, он нам был нужен только для примера.

  Мы создали открытый ключ и переслали его отправителю. Получив открытый ключ, отправитель шифрует свое сообщение разовым (можно и постоянным, на ваше усмотрение) сессионным ключом по симметричному алгоритму. Почему шифруется именно по семмтричному алгоритму, дело в том, что асимметричный алгоритм очень ресуросоемкий и шифровать большое количество данных будет очень накладно по времени. И вот именно для ускорения шифрования был придуман симметрично-ассиметричный алгоритм. Зашифровав свои данные, отправитель получает ключ обмена на основании открытого ключа, который представляет собой зашифрованный асимметричным алгоритмом сессионный ключ. Покажем на примере, как производится операция симметрично-асимметричного шифрования
[color=#000080]Пример симметрично-асимметричного шифрования данных (Asymmetric_Encrypt)[/color]

Add(MainForm,2953706,147,203)
{
Width=485
Height=330
Caption="Asimmetric_Encrypt"
Position=1
}
Add(Label,1928280,77,182)
{
Left=10
Top=242
Width=85
Height=17
Font=[MS Sans Serif,8,1,0,1]
Caption="Data:"
AutoSize=1
Alignment=1
}
Add(Edit,4281602,497,147)
{
Left=105
Top=240
Width=360
Font=[MS Sans Serif,8,1,0,204]
Cursor=1
WinStyle=2
Text="Hello!!! World"
}
Add(Button,14383413,21,259)
{
Left=140
Top=265
Width=205
Font=[MS Sans Serif,8,1,0,1]
TabOrder=-1
Caption="Encrypt"
link(onClick,16036320:doEvent1,[])
}
Add(FileStream,11110613,98,259)
{
FileName="crypt_project_exch.kpb"
link(onLoad,7879394:doConvert,[])
}
Add(Hub,9860667,245,259)
{
link(onEvent1,11801657:doReplace,[])
link(onEvent2,3503958:doTrim,[(273,272)(273,328)])
}
Add(Memo,1007621,336,301)
{
Left=5
Top=5
Width=460
Height=70
Font=[Courier New,8,0,0,204]
TabOrder=-1
WinStyle=2
ReadOnly=0
}
Add(Label,3175927,84,189)
{
Left=180
Top=80
Width=125
Height=17
Font=[MS Sans Serif,8,1,0,1]
Caption="ExchangePublicKey"
AutoSize=1
Alignment=2
}
Add(ExportSessionKey,15562714,385,259)
{
Point(onError)
link(onResult,1817146:doSeparateMT,[])
}
Add(Memo,9632686,679,245)
{
Left=5
Top=100
Width=460
Height=70
Font=[Courier New,8,0,0,204]
TabOrder=-1
WinStyle=2
ReadOnly=0
}
Add(Label,11196659,91,196)
{
Left=180
Top=175
Width=125
Height=17
Font=[MS Sans Serif,8,1,0,1]
Caption="ExchangeKey"
AutoSize=1
Alignment=2
}
Add(MT_MultiData,1817146,434,259)
{
link(onData1,7471774:doEnCrypt,[(482,265)(482,209)])
link(onData2,9306811:doWork1,[])
}
Add(Edit,4166333,770,203)
{
Left=5
Top=195
Width=460
Font=[Courier New,8,0,0,204]
Cursor=1
TabOrder=-1
WinStyle=2
Text=""
ReadOnly=0
}
Add(Label,12584683,98,203)
{
Left=200
Top=220
Width=85
Height=17
Font=[MS Sans Serif,8,1,0,1]
Caption="Encrypt Data"
AutoSize=1
Alignment=2
}
Add(Hub,6547766,637,266)
{
link(onEvent1,9632686:doText,[])
link(onEvent2,8862912:doString,[(667,279)(667,307)])
}
Add(FileStream,4158961,819,287)
{
FileName="crypt_project_exch.xch"
Mode=1
AutoCopy=0
Point(doCopyFromStream)
}
Add(Memory,3852489,721,203)
{
link(onData,4166333:doText,[])
}
Add(FormatStr,8862912,721,301)
{
Mask="-----BEGIN DATA-----\r\n%1\r\n-----END DATA-----\r\n-----BEGIN EXCHANGEKEY-----\r\n%2\r\n-----END EXCHANGEKEY-----"
link(onFString,13231083:doConvert,[])
link(Str1,3852489:Value,[])
}
Add(StreamConvertor,13231083,770,301)
{
Mode=7
link(onResult,4158961:doCopyFromStream,[])
}
Add(MultiElement,1585989,546,203)
{
@Hint=#13:Str -> Base64|
link(onEvent1,3852489:doValue,[])
AddHint(37,-32,79,13,@Hint)
}
BEGIN_SDK
Add(EditMulti,3209756,21,21)
{
EventCount=1
WorkCount=1
Width=328
Height=221
VOffset=21
link(doWork1,5609255:doCharset,[])
}
Add(Memory,11517248,98,42)
{
link(onData,9560137:doLength,[(140,48)(140,34)(86,34)(86,125)])
}
Add(Length,9560137,98,119)
{
link(onLength,10321946:doFor,[])
link(Str,1502681:Var2,[])
}
Add(For,10321946,147,119)
{
Start=1
Step=64
InData=0
link(onEvent,3203684:doCopy,[])
link(onStop,8857207:doTrim,[(194,132)(194,195)])
}
Add(Copy,3203684,203,119)
{
Count=64
link(onCopy,5297976:doStrCatDlm,[])
link(Str,1502681:Var3,[(209,96)])
}
Add(GetDataEx,1502681,98,91)
{
link(Data,11517248:Value,[])
}
Add(StrCatDelim,5297976,259,119)
{
Delimiter="\r\n"
Point(doClear)
link(Str1,13813073:Var3,[(265,107)(300,107)(300,166)])
}
Add(Trim,8857207,259,189)
{
Char="\r\n"
Mode=3
link(onTrim,5375141:doEvent1,[])
link(Text,13813073:Var2,[])
}
Add(Hub,5375141,308,189)
{
link(onEvent1,3209756:onEvent1,[(331,195)(331,48)])
link(onEvent2,5297976:doClear,[(331,202)(331,234)(247,234)(247,132)])
}
Add(GetDataEx,13813073,259,161)
{
link(Data,5297976:Result,[])
}
Add(Charset,5609255,42,42)
{
Type=5
link(onCharset,11517248:doValue,[])
}
END_SDK
Add(MultiElement,9306811,546,266)
{
@Hint=#13:Str -> Base64|
link(onEvent1,6547766:doEvent1,[])
AddHint(37,-32,79,13,@Hint)
}
BEGIN_SDK
Add(EditMulti,15700352,21,21)
{
EventCount=1
WorkCount=1
Width=328
Height=221
VOffset=21
link(doWork1,7803528:doCharset,[])
}
Add(Memory,13733457,98,42)
{
link(onData,10859049:doLength,[(140,48)(140,34)(86,34)(86,125)])
}
Add(Length,10859049,98,119)
{
link(onLength,11434037:doFor,[])
link(Str,4897077:Var2,[])
}
Add(For,11434037,147,119)
{
Start=1
Step=64
InData=0
link(onEvent,10749079:doCopy,[])
link(onStop,7070829:doTrim,[(194,132)(194,195)])
}
Add(Copy,10749079,203,119)
{
Count=64
link(onCopy,11002321:doStrCatDlm,[])
link(Str,4897077:Var3,[(209,96)])
}
Add(GetDataEx,4897077,98,91)
{
link(Data,13733457:Value,[])
}
Add(StrCatDelim,11002321,259,119)
{
Delimiter="\r\n"
Point(doClear)
link(Str1,3351435:Var3,[(265,107)(300,107)(300,166)])
}
Add(Trim,7070829,259,189)
{
Char="\r\n"
Mode=3
link(onTrim,4413279:doEvent1,[])
link(Text,3351435:Var2,[])
}
Add(Hub,4413279,308,189)
{
link(onEvent1,15700352:onEvent1,[(331,195)(331,48)])
link(onEvent2,11002321:doClear,[(331,202)(331,234)(247,234)(247,132)])
}
Add(GetDataEx,3351435,259,161)
{
link(Data,11002321:Result,[])
}
Add(Charset,7803528,42,42)
{
Type=5
link(onCharset,13733457:doValue,[])
}
END_SDK
Add(StreamConvertor,7879394,147,259)
{
Mode=6
link(onResult,8197233:doSearch,[])
}
Add(BlockFind,8197233,196,259)
{
IncludeBlock=1
Delete=0
StartBlock="-----BEGIN PUBLICKEY-----"
EndBlock="-----END PUBLICKEY-----"
link(onSearch,9860667:doEvent1,[])
}
Add(Charset,13966134,336,259)
{
Type=4
link(onCharset,15562714:doExportSessionKey,[])
}
Add(Replace,11801657,287,259)
{
SubStr="\r\n"
link(onReplace,13966134:doCharset,[])
}
Add(Trim,3503958,287,322)
{
Char="\r\n"
Mode=3
link(onTrim,1007621:doText,[])
}
Add(Hub,16036320,70,259)
{
link(onEvent1,11110613:doOpen,[])
link(onEvent2,11110613:doClose,[])
}
Add(EnCrypt,7471774,497,203)
{
Mode=4
link(onEnCrypt,1585989:doWork1,[])
link(Data,4281602:Text,[])
}

  При нажатии на кнопку Encrypt на выходе получим текстовый файл crypt_project_exch.xch формата Base64, который будет содержать в себе зашифрованные данные и ключ обмена. Этот файл отправитель пересылает получателю

См. дальше статью Примеры 2
BB-code статьи для вставки
Всего комментариев: 0
(комментарии к статье еще не добавлены)
Комментарий
...