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

Примеры 2
[color=#800000]Примеры работы с компонентами криптографии (продолжение)[/color]
  В конце предыдущего раздела мы зашифровали данные и получили ключ обмена в файле crypt_project_exch.xch. Теперь, осталось прочитать эти данные
[color=#000080]Пример расшифровки данных при помощи полученного ключа обмена (Asymmetric_Decrypt)[/color]

Add(MainForm,2953706,167,231)
{
Width=485
Height=480
Caption="Asimmetric_Decrypt"
Position=1
}
Add(Label,13557379,98,203)
{
Left=10
Top=367
Width=85
Height=17
Font=[MS Sans Serif,8,1,0,1]
Caption="PassKeyPair:"
AutoSize=1
Alignment=1
}
Add(Edit,4117780,539,273)
{
Left=105
Top=365
Width=360
Font=[MS Sans Serif,8,1,0,204]
Cursor=1
TabOrder=-1
WinStyle=2
Text="project_hiasm"
ReadOnly=0
}
Add(Label,1928280,105,210)
{
Left=200
Top=30
Width=85
Height=17
Font=[MS Sans Serif,8,1,0,1]
Caption="Encrypt Data"
AutoSize=1
Alignment=2
}
Add(Edit,4281602,483,189)
{
Left=5
Top=5
Width=460
Font=[Courier New,8,0,0,204]
Cursor=1
TabOrder=-1
WinStyle=2
Text=""
ReadOnly=0
}
Add(Button,14383413,99,147)
{
Left=140
Top=415
Width=205
Font=[MS Sans Serif,8,1,0,1]
TabOrder=-1
Caption="Decrypt"
link(onClick,12190824:doEvent1,[])
}
Add(FileStream,11110613,168,147)
{
FileName="crypt_project_exch.xch"
link(onLoad,7879394:doConvert,[])
}
Add(Hub,9860667,392,147)
{
link(onEvent1,11801657:doReplace,[])
link(onEvent2,3503958:doTrim,[(420,160)(420,195)])
}
Add(Memo,1007621,483,378)
{
Left=5
Top=145
Width=460
Height=195
Font=[Courier New,8,0,0,204]
TabOrder=-1
WinStyle=2
ReadOnly=0
}
Add(Label,3175927,112,217)
{
Left=180
Top=345
Width=125
Height=17
Font=[MS Sans Serif,8,1,0,1]
Caption="ExchangeKeyPair"
AutoSize=1
Alignment=2
}
Add(Memo,9632686,483,273)
{
Left=5
Top=50
Width=460
Height=70
Font=[Courier New,8,0,0,204]
TabOrder=-1
WinStyle=2
ReadOnly=0
}
Add(Label,11196659,119,224)
{
Left=200
Top=125
Width=85
Height=17
Font=[MS Sans Serif,8,1,0,1]
Caption="ExchangeKey"
AutoSize=1
Alignment=2
}
Add(Edit,4166333,679,336)
{
Left=104
Top=390
Width=360
Font=[Courier New,8,0,0,204]
Cursor=1
TabOrder=-1
WinStyle=2
Text=""
ReadOnly=0
}
Add(Label,12584683,125,231)
{
Left=10
Top=392
Width=85
Height=17
Font=[MS Sans Serif,8,1,0,1]
Caption="Decrypt Data:"
AutoSize=1
Alignment=1
}
Add(StreamConvertor,7879394,217,147)
{
Mode=6
link(onResult,8197233:doSearch,[])
}
Add(BlockFind,8197233,266,147)
{
IncludeBlock=1
Delete=0
StartBlock="-----BEGIN DATA-----"
EndBlock="-----END DATA-----"
link(onSearch,9860667:doEvent1,[])
link(onEndSearch,2536333:doSearch,[(314,160)(314,237)])
}
Add(Charset,13966134,483,147)
{
Type=4
link(onCharset,11725839:doValue,[])
}
Add(Replace,11801657,434,147)
{
SubStr="\r\n"
link(onReplace,13966134:doCharset,[])
}
Add(Trim,3503958,434,189)
{
Char="\r\n"
Mode=3
link(onTrim,4281602:doText,[])
}
Add(BlockFind,15027045,266,336)
{
IncludeBlock=1
Delete=0
StartBlock="-----BEGIN KEYPAIR-----"
EndBlock="-----END KEYPAIR-----"
link(onSearch,6561939:doEvent1,[])
}
Add(BlockFind,2536333,329,231)
{
IncludeBlock=1
Delete=0
StartBlock="-----BEGIN EXCHANGEKEY-----"
EndBlock="-----END EXCHANGEKEY-----"
link(onSearch,3118857:doEvent1,[])
link(onEndSearch,14482980:doEvent1,[(373,244)(373,134)(88,134)(88,342)])
}
Add(Trim,15255387,434,294)
{
Char="\r\n"
Mode=3
link(onTrim,9632686:doText,[])
}
Add(Hub,3118857,392,231)
{
link(onEvent1,1224225:doReplace,[])
link(onEvent2,15255387:doTrim,[(420,244)(420,300)])
}
Add(Charset,2197237,483,231)
{
Type=4
link(onCharset,14178722:doValue,[])
}
Add(Replace,1224225,434,231)
{
SubStr="\r\n"
link(onReplace,2197237:doCharset,[])
}
Add(Replace,2496483,434,336)
{
SubStr="\r\n"
link(onReplace,6759720:doCharset,[])
}
Add(Trim,325151,434,399)
{
Char="\r\n"
Mode=3
link(onTrim,1007621:doText,[])
}
Add(Hub,6561939,392,336)
{
link(onEvent1,2496483:doReplace,[])
link(onEvent2,325151:doTrim,[(420,349)(420,405)])
}
Add(Charset,6759720,483,336)
{
Type=4
link(onCharset,1872864:doDeCrypt,[])
}
Add(FileStream,2232499,168,336)
{
FileName="crypt_project_exch.kpr"
link(onLoad,10746019:doConvert,[])
}
Add(StreamConvertor,10746019,217,336)
{
Mode=6
link(onResult,15027045:doSearch,[])
}
Add(ImportSessionKey,7519595,581,336)
{
link(onResult,10100616:doDeCrypt,[])
link(ExchangeKey,14178722:Value,[])
}
Add(Memory,11725839,630,147)
{
}
Add(Memory,14178722,588,231)
{
}
Add(Hub,12190824,140,147)
{
link(onEvent1,11110613:doOpen,[])
link(onEvent2,11110613:doClose,[])
}
Add(Hub,14482980,140,336)
{
link(onEvent1,2232499:doOpen,[])
link(onEvent2,2232499:doClose,[])
}
Add(DeCrypt,1872864,532,336)
{
Mode=4
link(onDeCrypt,7519595:doImportSessionKey,[])
link(Key,4117780:Text,[])
}
Add(DeCrypt,10100616,630,336)
{
Mode=4
link(onDeCrypt,4166333:doText,[])
link(DataCrypt,11725839:Value,[])
}

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

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

Add(MainForm,2953706,98,252)
{
Width=485
Height=505
Caption="SignedPublicKey"
Position=1
}
Add(Memo,8334407,763,161)
{
Left=5
Top=225
Width=460
Height=70
Font=[Courier New,8,0,0,204]
TabOrder=-1
WinStyle=2
ReadOnly=0
}
Add(Label,15828431,21,231)
{
Left=180
Top=300
Width=125
Height=17
Font=[MS Sans Serif,8,1,0,1]
Caption="ExchangePublicKey"
AutoSize=1
Alignment=2
}
Add(Button,4807131,21,182)
{
Left=140
Top=440
Width=205
Font=[MS Sans Serif,8,1,0,1]
TabOrder=-1
Caption="SignedPublicKey"
link(onClick,13112867:doEvent1,[])
}
Add(Label,11158422,28,238)
{
Left=10
Top=417
Width=85
Height=17
Font=[MS Sans Serif,8,1,0,1]
Caption="PassKeyPair:"
AutoSize=1
Alignment=2
}
Add(Edit,2682454,539,238)
{
Left=105
Top=415
Width=360
Font=[MS Sans Serif,8,1,0,1]
WinStyle=2
Text="project_hiasm"
}
Add(FileStream,14988446,266,308)
{
FileName="crypt_project_sign.kpr"
link(onLoad,7879394:doConvert,[])
}
Add(FileStream,6992841,861,343)
{
FileName="crypt_project_exch.kpb"
Mode=1
AutoCopy=0
Point(doCopyFromStream)
}
Add(StreamConvertor,7879394,308,308)
{
Mode=6
link(onResult,8197233:doSearch,[])
}
Add(StreamConvertor,14198454,812,357)
{
Mode=7
link(onResult,6992841:doCopyFromStream,[])
}
Add(BlockFind,8197233,350,308)
{
IncludeBlock=1
Delete=0
StartBlock="-----BEGIN KEYPAIR-----"
EndBlock="-----END KEYPAIR-----"
link(onSearch,12700311:doEvent1,[])
}
Add(Charset,13966134,483,308)
{
Type=4
link(onCharset,576429:doDeCrypt,[])
}
Add(Replace,11801657,434,308)
{
SubStr="\r\n"
link(onReplace,13966134:doCharset,[])
}
Add(MultiElement,9306811,630,182)
{
@Hint=#13:Str -> Base64|
link(onEvent1,3221844:doEvent1,[])
AddHint(47,-45,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,763,357)
{
Mask="-----BEGIN PUBLICKEY-----\r\n%1\r\n-----END PUBLICKEY-----\r\n-----BEGIN SIGNATURE-----\r\n%2\r\n-----END SIGNATURE-----"
link(onFString,14198454:doConvert,[])
link(Str1,10924359:Value,[])
}
Add(Memo,2059456,483,350)
{
Left=5
Top=5
Width=460
Height=195
Font=[Courier New,8,0,0,204]
TabOrder=-1
WinStyle=2
ReadOnly=0
}
Add(Label,14155798,35,245)
{
Left=180
Top=205
Width=125
Height=17
Font=[MS Sans Serif,8,1,0,1]
Caption="SignatureKeyPair"
AutoSize=1
Alignment=2
}
Add(Trim,3503958,434,371)
{
Char="\r\n"
Mode=3
link(onTrim,2059456:doText,[])
}
Add(Hub,12700311,399,308)
{
link(onEvent1,11801657:doReplace,[])
link(onEvent2,3503958:doTrim,[(423,321)(423,377)])
}
Add(CreateSignature,13207688,581,308)
{
link(onResult,10595219:doWork1,[])
link(Data,16777202:PublicKey,[])
}
Add(Memo,6868481,735,287)
{
Left=5
Top=320
Width=460
Height=70
Font=[Courier New,8,0,0,204]
TabOrder=-1
WinStyle=2
ReadOnly=0
}
Add(Label,9805035,42,252)
{
Left=200
Top=395
Width=85
Height=17
Font=[MS Sans Serif,8,1,0,1]
Caption="Signature"
AutoSize=1
Alignment=2
}
Add(MultiElement,10595219,630,308)
{
@Hint=#13:Str -> Base64|
link(onEvent1,11041800:doEvent1,[])
AddHint(47,-47,79,13,@Hint)
}
BEGIN_SDK
Add(EditMulti,6636431,21,21)
{
EventCount=1
WorkCount=1
Width=328
Height=221
VOffset=21
link(doWork1,8610657:doCharset,[])
}
Add(Memory,15549663,98,42)
{
link(onData,7307334:doLength,[(140,48)(140,34)(86,34)(86,125)])
}
Add(Length,7307334,98,119)
{
link(onLength,1769837:doFor,[])
link(Str,9442221:Var2,[])
}
Add(For,1769837,147,119)
{
Start=1
Step=64
InData=0
link(onEvent,11063265:doCopy,[])
link(onStop,4574954:doTrim,[(194,132)(194,195)])
}
Add(Copy,11063265,203,119)
{
Count=64
link(onCopy,9412668:doStrCatDlm,[])
link(Str,9442221:Var3,[(209,96)])
}
Add(GetDataEx,9442221,98,91)
{
link(Data,15549663:Value,[])
}
Add(StrCatDelim,9412668,259,119)
{
Delimiter="\r\n"
Point(doClear)
link(Str1,9982289:Var3,[(265,107)(300,107)(300,166)])
}
Add(Trim,4574954,259,189)
{
Char="\r\n"
Mode=3
link(onTrim,4224965:doEvent1,[])
link(Text,9982289:Var2,[])
}
Add(Hub,4224965,308,189)
{
link(onEvent1,6636431:onEvent1,[(331,195)(331,48)])
link(onEvent2,9412668:doClear,[(331,202)(331,234)(247,234)(247,132)])
}
Add(GetDataEx,9982289,259,161)
{
link(Data,9412668:Result,[])
}
Add(Charset,8610657,42,42)
{
Type=5
link(onCharset,15549663:doValue,[])
}
END_SDK
Add(Hub,3221844,686,182)
{
link(onEvent1,8334407:doText,[])
link(onEvent2,10924359:doValue,[(723,195)(723,223)])
}
Add(Memory,10924359,763,217)
{
}
Add(Hub,11041800,679,308)
{
link(onEvent1,6868481:doText,[])
link(onEvent2,14741656:doString,[(717,321)(717,363)])
}
Add(FileStream,5987249,98,182)
{
FileName="crypt_project_exch.kpr"
link(onLoad,10263353:doConvert,[])
}
Add(StreamConvertor,10263353,140,182)
{
Mode=6
link(onResult,1000566:doSearch,[])
}
Add(BlockFind,1000566,182,182)
{
IncludeBlock=1
Delete=0
StartBlock="-----BEGIN KEYPAIR-----"
EndBlock="-----END KEYPAIR-----"
link(onSearch,1855283:doReplace,[])
link(onEndSearch,16400878:doEvent1,[(226,195)(226,314)])
}
Add(Charset,13579891,287,182)
{
Type=4
link(onCharset,12220126:doDeCrypt,[])
}
Add(Replace,1855283,238,182)
{
SubStr="\r\n"
link(onReplace,13579891:doCharset,[])
}
Add(GetDataEx,831305,539,280)
{
link(Data,2682454:Text,[])
}
Add(GenKeyPairs,16777202,574,175)
{
link(onGetPublicKey,9306811:doWork1,[])
}
Add(Hub,16400878,238,308)
{
link(onEvent1,14988446:doOpen,[])
link(onEvent2,14988446:doClose,[])
}
Add(Hub,13112867,70,182)
{
link(onEvent1,5987249:doOpen,[])
link(onEvent2,5987249:doClose,[])
}
Add(DeCrypt,12220126,336,182)
{
Mode=4
link(onDeCrypt,16777202:doGetPublicKey,[])
link(Key,831305:Var1,[(349,170)(445,170)(445,285)])
}
Add(DeCrypt,576429,532,308)
{
Mode=4
link(onDeCrypt,13207688:doCreateSignature,[])
link(Key,831305:Var2,[])
}

  При нажатии на кнопку SignedPublicKey из файла ключевой пары обмена crypt_project_exch.kpr экспортируется открытый ключ и подписывается закрытым ключом электронной цифровой подписи из файла crypt_project_sign.kpr. На выходе получаем файл crypt_project_exch.kpb, который содержит в себе открытый ключ обмена и электронную цифровую подпись к нему. Отправитель получает от получателя подписанный ключ обмена, и теперь ему необходимо проверить подлинность полученного открытого ключа. Покажем на примере, как это можно реализовать
[color=#000080]Пример проверки подлинности электронной цифровой подписи (VerifySignature)[/color]

Add(MainForm,2953706,119,91)
{
Width=485
Height=380
Caption="VerifySignature"
Position=1
}
Add(Memo,8334407,357,189)
{
Left=5
Top=5
Width=460
Height=70
Font=[Courier New,8,0,0,204]
TabOrder=-1
WinStyle=2
ReadOnly=0
}
Add(Label,15828431,28,77)
{
Left=180
Top=80
Width=125
Height=17
Font=[MS Sans Serif,8,1,0,1]
Caption="SignaturePublicKey"
AutoSize=1
Alignment=2
}
Add(Button,4807131,42,147)
{
Left=135
Top=315
Width=205
Font=[MS Sans Serif,8,1,0,1]
TabOrder=-1
Caption="VerifySignature"
link(onClick,11456225:doEvent1,[])
}
Add(FileStream,14988446,119,147)
{
FileName="crypt_project_sign.kpb"
link(onLoad,7879394:doConvert,[])
}
Add(FileStream,6992841,308,252)
{
FileName="crypt_project_exch.kpb"
link(onLoad,13579512:doConvert,[])
}
Add(StreamConvertor,7879394,168,147)
{
Mode=6
link(onResult,8197233:doSearch,[])
}
Add(BlockFind,8197233,217,147)
{
IncludeBlock=1
Delete=0
StartBlock="-----BEGIN PUBLICKEY-----"
EndBlock="-----END PUBLICKEY-----"
link(onSearch,12700311:doEvent1,[])
link(onEndSearch,3893825:doEvent1,[(261,160)(261,258)])
}
Add(Charset,13966134,357,147)
{
Type=4
link(onCharset,10924359:doValue,[])
}
Add(Replace,11801657,308,147)
{
SubStr="\r\n"
link(onReplace,13966134:doCharset,[])
}
Add(Trim,3503958,308,210)
{
Char="\r\n"
Mode=3
link(onTrim,8334407:doText,[])
}
Add(Hub,12700311,273,147)
{
link(onEvent1,11801657:doReplace,[])
link(onEvent2,3503958:doTrim,[(297,160)(297,216)])
}
Add(Memo,6868481,574,294)
{
Top=195
Width=460
Height=70
Font=[Courier New,8,0,0,204]
TabOrder=-1
WinStyle=2
ReadOnly=0
}
Add(Label,9805035,35,84)
{
Left=195
Top=270
Width=85
Height=17
Font=[MS Sans Serif,8,1,0,1]
Caption="Signature"
AutoSize=1
Alignment=2
}
Add(Memory,10924359,686,147)
{
}
Add(Edit,14352365,777,322)
{
Left=135
Top=290
Width=205
Font=[Courier New,8,0,0,204]
Cursor=1
TabOrder=-1
WinStyle=2
Text=""
Alignment=2
ReadOnly=0
}
Add(StreamConvertor,13579512,357,252)
{
Mode=6
link(onResult,15498242:doSearch,[])
}
Add(BlockFind,15498242,406,252)
{
IncludeBlock=1
Delete=0
StartBlock="-----BEGIN SIGNATURE-----"
EndBlock="-----END SIGNATURE-----"
link(onSearch,16267585:doEvent1,[])
link(onEndSearch,409554:doSearch,[(452,265)(452,363)])
}
Add(Replace,12149849,525,252)
{
SubStr="\r\n"
link(onReplace,1512287:doCharset,[])
}
Add(Trim,10819519,525,315)
{
Char="\r\n"
Mode=3
link(onTrim,6868481:doText,[])
}
Add(Hub,16267585,483,252)
{
link(onEvent1,12149849:doReplace,[])
link(onEvent2,10819519:doTrim,[(511,265)(511,321)])
}
Add(Charset,1512287,574,252)
{
Type=4
link(onCharset,9959472:doValue,[])
}
Add(VerifySignature,9273522,679,357)
{
link(onResult,9218933:doGetString,[])
link(PublicKey,10924359:Value,[])
link(Signature,9959472:Value,[])
}
Add(Memory,9959472,693,252)
{
}
Add(Memo,198907,623,399)
{
Left=5
Top=100
Width=460
Height=70
Font=[Courier New,8,0,0,204]
TabOrder=-1
WinStyle=2
ReadOnly=0
}
Add(Label,6509974,42,91)
{
Left=180
Top=175
Width=125
Height=17
Font=[MS Sans Serif,8,1,0,1]
Caption="ExchangePublicKey"
AutoSize=1
Alignment=2
}
Add(BlockFind,409554,469,357)
{
IncludeBlock=1
Delete=0
StartBlock="-----BEGIN PUBLICKEY-----"
EndBlock="-----END PUBLICKEY-----"
link(onSearch,7799660:doEvent1,[])
}
Add(Replace,14859010,574,357)
{
SubStr="\r\n"
link(onReplace,9660268:doCharset,[])
}
Add(Trim,5815043,574,420)
{
Char="\r\n"
Mode=3
link(onTrim,198907:doText,[])
}
Add(Hub,7799660,532,357)
{
link(onEvent1,14859010:doReplace,[])
link(onEvent2,5815043:doTrim,[(560,370)(560,426)])
}
Add(Charset,9660268,623,357)
{
Type=4
link(onCharset,9273522:doVerifySignature,[])
}
Add(StrList,9218933,728,315)
{
Strings=#5:Purge|5:Valid|
Point(onGetString)
Point(doGetString)
link(onGetString,14352365:doText,[])
}
Add(Hub,3893825,273,252)
{
link(onEvent1,6992841:doOpen,[])
link(onEvent2,6992841:doClose,[])
}
Add(Hub,11456225,91,147)
{
link(onEvent1,14988446:doOpen,[])
link(onEvent2,14988446:doClose,[])
}

  При нажатии на кнопку VerifySignature, открывается полученный файл crypt_project_exch.kpb и, при помощи экспортированного из файла crypt_project_sign.kpb открытого ключа электронной цифровой подписи, проверяется подлинность открытого ключа обмена. В окошке аутентичности получаем — Valid, если ключ подлинный, или Purge, если ключ поддельный

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