æå·ãšããèšèã®æãåºãæå³ã§ã¯ãæ å ±ã®æ©å¯æ§ãšä¿¡é Œæ§ã確ä¿ããããã®æ¹æ³ã®ç§åŠã§ãã ã€ãŸããèŠç¥ãã¬äººã«ããããŒã¿ã®èªã¿åããäžå¯èœã§ããããšãããã³ç¬¬äžè ã«ããããŒã¿ã®ç§å¯ã®çœ®æãäžå¯èœã§ããããšãä¿èšŒããŸãã éå»4000幎ã«ããããç§åŠè ããšã³ãžãã¢ããã®ä»ã®äººç©ã¯ãçŸåš1å°ã®ã³ã³ãã¥ãŒã¿ãŒã«çœ®ãæããããŠããå€ãã®ç¬åµçãªæå·åããã€ã¹ãšã¡ã«ããºã ãéçºããŠããŸããã ãããã£ãŠãçŸåšã®ããŸããŸãªæå·æ å ±ä¿è·ããŒã«ïŒCIPïŒã¯ãã¹ãŠãããŸããŸãªã¢ã«ãŽãªãºã ã«ãã£ãŠæäŸãããŠããããã®å€ããçºæãããŠããŸãã
泚æã質åïŒ æå·ã®ç¥æµããé ãé¢ããéçºè ã¯ãç¹å®ã®åã¢ããªã±ãŒã·ã§ã³ã®ããŒã¿ãã©ã®ããã«ä¿è·ã§ããŸããïŒ èªåã®ç¬åµçãªæå·åã¢ã«ãŽãªãºã ãèãåºãå¿ èŠããããŸããããããšã誰ããæžããæå·æ å ±ã䜿çšã§ããŸããïŒ å¹žããªããšã«ãè»èŒªãåçºæããå¿ èŠã¯ãããŸããã ããšãã°ãåäžã®ãœãããŠã§ã¢ã€ã³ã¿ãŒãã§ã€ã¹ã§ããMS CryptoAPIã䜿çšã§ããŸãã ããŸããŸãªæå·åæ å ±ã»ãã¥ãªãã£äŒæ¥ïŒæå·åãµãŒãã¹ãããã€ããŒãŸãã¯CSP-æå·åãµãŒãã¹ãããã€ããŒãšãåŒã°ããŸãïŒãç¬èªã®æ¹æ³ã§å®è£ ã§ããåºç¯ãªæå·åæ©èœãšã¢ã«ãŽãªãºã ã«ã€ããŠèª¬æããŸãããåäžã®APIã䜿çšããŠãããã«ã¢ã¯ã»ã¹ããŸãã
ã¢ããªã±ãŒã·ã§ã³ã«æå·åæ©èœãå®è£ ããã«ã¯ã次ã®ããšãè¡ãå¿ èŠããããŸãã
- ãŸãã䜿çšããæå·åä¿è·ã¢ã«ãŽãªãºã ã決å®ããŸãã éžæã¯ãæå·ã®ä¿¡é Œæ§ãäœæ¥ã®é床ãããŒã®é·ãããŸãã¯æè¡çãªã¿ã¹ã¯ã§åçŽã«èŠå®ããããšãã§ããŸãã
- 第äºã«ãã©ã®æå·ãããã€ããŒããã®ã¢ã«ãŽãªãºã ãå®è£ ããèªå®ãããããå®äŸ¡ã§ããããèŠã€ããããšã§ãã
- 3çªç®ã«ãCIPFã®ã©ã€ã»ã³ã¹ããã±ãŒãžã®å¹žããªææè ã«ãªãããµãŒããŒã«ã€ã³ã¹ããŒã«ããŸãã
- 4çªç®ã«ãCIPFé¢æ°ãåŒã³åºããŠã¢ããªã±ãŒã·ã§ã³å ã§åäœã§ããã¢ãžã¥ãŒã«ããœãªã¥ãŒã·ã§ã³ã«èšè¿°ããŸãã
ç§ãèªåã§èšå®ããã¿ã¹ã¯ã¯ããããã®åã¹ããããå®è¡ãããã®çµæãCachéãMS Crypto APIé¢æ°ã«ã¢ã¯ã»ã¹ã§ãããœãªã¥ãŒã·ã§ã³ãååŸããããšã§ããã
ææ¡ãããã¢ãããŒããæ€èšããçµæã次ã®2ã€ã®å€§ããªå©ç¹ãããããšãããããŸãã
- å€é åŒããã€ã¹ã調ã¹ãŠãç¬èªã®æå·åãããã·ã¥ããŸãã¯ããŒã¿çœ²åã¢ã«ãŽãªãºã ãäœæããå¿ èŠã¯ãããŸããã
- å€ãã®æå·æ å ±ä¿è·èšŒææžã¯GOSTã«åŸã£ãŠæ¢ã«èªèšŒãããŠãããå€ãã®é¡§å®¢äŒæ¥ãç¹ã«å·ã®äŒæ¥ã«ãšã£ãŠãããã¯æãéèŠãªèŠä»¶ã®1ã€ã§ãã
ãå°ããªããã€ãã¹ã1ã€ãããŸã-CryptoAPIã¯Windowsã§ã®ã¿åäœããŸãã
é·æã¯ç§ãã¡ã«ã€ã³ã¹ãã¬ãŒã·ã§ã³ãäžããçæã¯å€±æããªãã£ãããCachéDBMSãæäœããããã«CryptoAPIé¢æ°ã䜿çšããã¢ãããŒããèŠã€ãããšããã¿ã¹ã¯ã¯éåžžã«å ·äœçã ãšä»®å®ããŸãã CSPããã§ã«ã€ã³ã¹ããŒã«ããã³æ§æãããŠãããšããŸããCachéããCSPãæäœããæ¹æ³ã¯ïŒ 1ã€ã®ãªãã·ã§ã³ã¯ãCachéã«å®è£ ãããŠããã³ãŒã«ã¢ãŠãã¡ã«ããºã ã䜿çšããããšã§ãã ããã«ã€ããŠããã«èª¬æããŸãã
ã³ãŒã«ã¢ãŠãã¯ãCachéã®DLLããé¢æ°ãåŒã³åºãããã«èšèšãããŠããŸãã å®éãããã¯ãããšãã°C ++ã§ã³ãŒããäœæããDLLã§æ§æããããã決å®ã«äœ¿çšã§ããããšãæå³ããŸãã ãŸãããã®ã¢ãããŒãã«ãããDLLã®äœææã«Windows APIã®ããŸããŸãªæ©èœãç¹ã«CryptoAPIã䜿çšã§ããŸãã
èšç»æ®µéã§ãããã«DLLèªäœïŒISCAPIãšåŒã°ããïŒã ãã§ãªãããã¹ãããã³ãããã°ããŒã«ïŒCryptoConsoleïŒãäœæããããšã«ããŸããã
äžã®å³ã§ã¯ãã°ã©ãã£ã«ã«ã«è¡šç€ºãããŠããŸãã åºæ¬ã¯ã©ã¹CacheCommonïŒC ++ïŒããããŸããããã¯ãæå·ãããã€ããŒã®æ§æãæå·æ å ±ä¿è·ã·ã¹ãã ã®åæåãã³ã³ããã¹ããããŒãããã·ã¥ããŒã¿ã®ååŸãããžã¿ã«çœ²åã®äœæãšæ€èšŒãæå·åããã®ã³ã°ãªã©ãå¯èœã«ããæ©èœãå®è£ ããŠããŸãã ãããã®é¢æ°ã¯ãã¹ãŠããããã°ã³ã³ãœãŒã«ãšã©ã€ãã©ãªã§äžæ§ã«äœ¿çšãããŸãïŒã³ã³ãœãŒã«ãšDLLã¯C ++ã§èšè¿°ãããŠããŸãïŒã Cachéã®DLLã¯ãããã°ãéåžžã«é£ãããããåäžã®åœ¢åŒã®ã¢ã¯ã»ã¹ãç¹å¥ãªåœ¹å²ãæãããŸãããã®ãããéçºããããã°ãããã³ãã¹ãã®äž»ãªè² æ ã¯ã³ã³ãœãŒã«ã«ãããŸãã ãœãªã¥ãŒã·ã§ã³å šäœã®ã³ãŒãã¯å ¬éãããŠããŸã ã ãã¡ãã§èŠã€ããããšãã§ããŸãã
ãµãŒããŒåŽã§ã¯ãCachéã¯iscapi.Signerã¯ã©ã¹ãä»ããŠISCAPI.DLLãšå¯Ÿè©±ããŸã
ã¯ã©ã¹ããã¹ãiscapi.Signer
/// - MS CRYPTO API Class iscapi.Signer Extends %RegisteredObject { /// DLL /// dllPath - ClassMethod LoadDLL(dllPath As %String) As %Status { s result = $$$OK if (dllPath = "") { w "Please set dllPath equal to path to the ISCAPI.dll" q $$$ERROR($$$GeneralError, "No path to iscapi.dll is provided") } try { d $zf(-3, dllPath) } catch (ex) { s result = ex.AsStatus() } if (result=1) {w "DLL from "_dllPath_" was loaded"} else {w "Cannot load DLL from "_dllPath} q result } /// DLL ClassMethod UnloadDLL() { d $zf(-3, "") } /// -. /// provType - (VipNet=2, CryptoPro=75) /// algId - (32798) /// containerName - /// pin - ( , CSP , ) /// providerName - - ClassMethod Init(provType = 75, algId = 32798, containerName As %String, pin As %String = "111111", providerName As %String = "") As %Status { s result = $$$OK try { d $zf(-3, "", "Init", provType, algId, containerName, pin, providerName) } catch (ex) { s result = ex.AsStatus() } if (result=1) {w "CSP was successfully initialized"} else {w "Error during CSP initialization"} q result } /// . /// logFileName - . . /// logLevel - /// 0 - /// 1 - /// 2 - /// logTargets - , /// 0 - /// 1 - /// 2 - /// 3 - ClassMethod InitLogger(logFileName As %String = "c:\iscapi.log", logLevel As %Integer = 2, logTargets As %Integer = 3) As %Status { s result = $$$OK try { d $zf(-3, "", "InitLogger", logFileName, logLevel, logTargets) } catch ex { s result = ex.AsStatus() } if (result=1) {w "Logger was successfully initialized"} else {w "Error during Logger initialization"} q result } /// . /// , . ClassMethod HashData(dataPortion As %String) As %Status { s result = $$$OK try { d $zf(-3, "", "HashData", dataPortion) } catch ex { s result = ex.AsStatus() } q result } /// . ClassMethod HashFile(fileName As %String) As %Status { s result = $$$OK try { d $zf(-3, "", "HashFile", fileName) } catch ex { s result = ex.AsStatus() } q result } /// . /// ClassMethod GetHashValue() As %String { s result = "" try { s result = $zf(-3, "", "GetHashValue", "") } catch ex { w "GHV exception", ! zw ex s result = "" } w "GHV result is:", result, ! q result } ClassMethod ExportUserKey() As %String { s result = "" try { s result = $zf(-3, "", "ExportUserKey", "") } catch ex { s result = "" } q result } /// . /// . ClassMethod SignNewHash(dataPortion As %String) As %String { s result = "" try { s result = $zf(-3, "", "SignNewHash", dataPortion, "") } catch ex { s result = "" } q result } /// . ClassMethod SignCurrentHash() As %String { s result = "" try { s result = $zf(-3, "", "SignCurrentHash", "") } catch ex { s result = "" } w "Signature recieved: ",result,! q result } /// . ClassMethod VerifyHash(hash As %String, sign As %String) As %Boolean { s result = 0 try { s result = $zf(-3, "", "VerifyHash", hash, sign, 0) } catch ex { s result = 0 } q result } ClassMethod VerifyHashByKey(hash As %String, sign As %String, pubKey As %String) As %Boolean { s result = 0 try { s result = $zf(-3, "", "VerifyHashByKey", hash, sign, pubKey, 0) } catch ex { s result = 0 } q result } /// . /// ClassMethod VerifySignature(dataPortion As %String, sign As %String) As %Boolean { s result = 0 try { s result = $zf(-3, "", "VerifySignature", dataPortion, sign, 0) } catch ex { s result = 0 } q result } /// DLL ClassMethod ReleaseAll() As %Status { s result = $$$OK try { d $zf(-3, "", "ReleaseAll") d ..UnloadDLL() } catch ex { s result = ex.AsStatus() } q result } /// HEX /// TODO: rewrite ClassMethod ByteToHex(bString As %String) As %String { s str = "" for i=1:1:$l(bString) { s hex = $zhex($ascii($e(bString, i))) if ($l(hex) = 1) s hex = "0" _ hex s str = str _ hex } q str } ClassMethod HexToString(value As %String) As %String { s str = "" for i=1:2:$l(value) { s hex = $e(value, i, i + 1) s str = str _ $c($zhex(hex)) } q str } /// DLL ClassMethod PrintProviders() As %Status { s result = $$$OK try { d $zf(-3, "", "PrintProviders") } catch ex { s result = ex.AsStatus() } q result } /// ClassMethod Test() { s data = "123!" d ..LoadDLL("C:\ISCAPI.dll") w "DLL loaded", ! d ..InitLogger("c:\iscapiL.txt", 2, 1) w "Logger initialized", ! d ..PrintProviders() d ..Init(75, 32798, "CacheCrypt", "", "Crypto-Pro GOST R 34.10-2001 Cryptographic Service Provider") w "CSP initialized", ! d ..HashData(data) w "Hash created on: ", data, ! s hash = ..GetHashValue() w "Hash received, hash length=", $l(hash), ! w "Hash to base64:", !, $system.Encryption.Base64Encode(hash), ! w "Hash to HEX:", !, ..ByteToHex(hash), ! w "Hash value:", hash, ! s sign = ..SignCurrentHash() w "Hash signed, sign length=", $l(sign), ! w "Sign to base64:", !, $system.Encryption.Base64Encode(sign), ! w "Sign to HEX:", !, ..ByteToHex(sign), ! s vfy = ..VerifyHash(hash, sign) w "Verifying Hash signature result = ", vfy, ! s vfy = ..VerifySignature(data, sign) w "Verifying Signature by input text result = ", vfy, ! w "Exporting User Key...",! s userKey = ..ExportUserKey() w "Size: ", $l(userKey), ! w "UserKeyBytes: ", ..ByteToHex(userKey), ! s vfy = ..VerifyHashByKey(hash, sign, userKey) w "Verifying Hash signature ByKey result = ", vfy, ! d ..ReleaseAll() } }
ã³ãŒã«ã¢ãŠãã¡ã«ããºã ã¯ããã§å®è£ ãããŸããã€ãŸããCachéã¯ã©ã¹ã®ã¡ãœããããDLLã«ååšããCryptoAPIé¢æ°ã«çŽæ¥ã¢ã¯ã»ã¹ã§ããŸãã ã¢ã¯ã»ã¹ã¯ãCachéObject Scriptããiscapi.Signerã¯ã©ã¹ã¡ãœãããåŒã³åºãããšã§å®è£ ãããŸãã ãšããããããã¯åå¿è éçºè ã«ãšã£ãŠæçãªäŸã§ãããCachéã®å€éšã©ã€ãã©ãªãæäœããæ©èœãç解ã§ããŸãã
ããã§ãå®è£ ãããæ©èœã«ã€ããŠããã€ã説æããŸãã ã³ã³ãœãŒã«ã¢ããªã±ãŒã·ã§ã³ïŒCryptoConsole.exeïŒãããã§ãã¯ããã®ãæã䟿å©ã§ãã èµ·åçŽåŸã«ã䜿çšå¯èœãªãã¹ãŠã®ã³ãã³ããšããããåŒã³åºãããé åºã確èªã§ããŸãã é¢æ°ã®ãã©ã¡ãŒã¿ãŒãå ¥åããã«ã¯ãã¹ããŒã¹ã§åºåã£ãŠãªã¹ãããŸãã éåžžãããã€ãã®åèªã§æ§æãããé·ããã©ã¡ãŒã¿ãŒã¯ãåŒçšç¬Šã§å²ãŸããŠããŸãã
ã³ã³ãœãŒã«ã³ãã³ãã¯ã次ã®3ã€ã®ã¿ã€ãã«åé¡ã§ããŸãã
1.ãµãŒãã¹ããŒã
å žåçãªäŸã¯ãããã»ã¹ã§äœ¿çšå¯èœãªãã¹ãŠã®ã³ãã³ãã®ãªã¹ãã衚瀺ããhelpã³ãã³ãã§ãã ãµãŒãã¹ã³ãã³ãã«ã¯ãã·ã¹ãã ã«ã€ã³ã¹ããŒã«ãããŠããæå·åãããã€ããŒã«é¢ããæ å ±ããŠãŒã¶ãŒã«è¡šç€ºããshowProvidersããã³showProvParamsã³ãã³ããå«ãŸããŸãã
2.åæåã³ãã³ã
æå·åãããã€ããŒãæ§æããã³éå§ããã«ã¯ãåæåã³ãã³ããå¿ èŠã§ãã äžè¬ã«ãã³ã³ããã¹ããåæåããã«ã¯ã次ãæå®ããå¿ èŠããããŸãã
- æå·ãããã€ããŒã®ã¿ã€ãçªå·ïŒprovIDã³ãã³ãïŒã ããã¯ã»ãšãã©äœãæå³ããªãæ°å€ã§ãããã·ã¹ãã ãäœæ¥ããCSPãèå¥ããã®ã«åœ¹ç«ã¡ãŸãã
- ã¢ã«ãŽãªãºã çªå·ïŒsignAlgIDã³ãã³ãïŒã äžè¬çã«ãããã€ãã®ã¢ã«ãŽãªãºã ãååšããå¯èœæ§ããããŸãããã®å Žåãããã·ã¥ããã³ããŒã¿çœ²åã¢ã«ãŽãªãºã ãæå®ããããšããå§ãããŸãã
- ããŒã³ã³ããåïŒcontNameã³ãã³ãïŒã
- ããŒã³ã³ããããã®PINïŒcontPINã³ãã³ãïŒã ããŒã³ã³ããã®èšå®ã¯ãæå·åãããã€ããŒã®ã€ã³ã¹ããŒã«ããã³æ§æäžã«è¡ãããŸãã
- 䜿çšãããCSPã®ãã«ããŒã ïŒprovNameã³ãã³ãïŒã éåžžãããã¯é·ãæååã§ãã ã·ã¹ãã ãã©ã®æå·åãããã€ããŒã䜿çšããããç解ããããã«å¿ èŠã§ãããCSPã¿ã€ãã«è¿œå ãããã®ã§ãããããã ãã§ã¯äžæã«èå¥ã§ããŸããã
æå·åã¢ã«ãŽãªãºã ã®ã³ãŒããªã©ãã·ã¹ãã ã«èšå®ã§ããè¿œå ã®ãã©ã¡ãŒã¿ãŒããããŸããããããã®5ã€ã¯CSPã®åæåæåã«å¿ èŠã§ãã
3.æå·åã³ãã³ã
CSPãåæåããããšãæå·åãããã€ããŒã³ã³ããã¹ãïŒaContextã³ãã³ãïŒãååŸããå¿ èŠããããŸãããã®åŸãããã·ã¥ãäœæããããŒã¿ã«çœ²åããæå·åã§ããŸããã€ãŸãããã®ããã±ãŒãžãäœæããããã¹ãŠãå®è¡ã§ããŸãã
äž»ãªããŒã ïŒ
- hashDataãããŒã¿æååãããã·ã¥ããŸã
- hashFileãããŒã¿ãã¡ã€ã«ãããã·ã¥ããŸã
- signCurrentHashãçŸåšã®èšç®ãããããã·ã¥ã«çœ²åãã
- signNewHashãã·ã¹ãã ã«æ°ããããã·ã¥ãäœæããŠçœ²åããŸã
- verifyHashã眲åäžèŽããã·ã¥ãæ€èšŒããŸã
- verifySignatureã眲åãå ã®ããŒã¿ãšäžèŽããããšãæ€èšŒããŸã
- encryptDataãæååã®ããŒã¿ãæå·åããŸã
- decryptDataã以åã«æå·åãããããŒã¿ã埩å·åããŸãã
ã³ãã³ãã®ãªã¹ãã¯ãå®éã«ã¯ããã§ç€ºãããã®ãããã¯ããã«åºãã§ãã ãããŠãã€ã³ãã¯ãã¢ããªã±ãŒã·ã§ã³ãåžžã«éçºäžã§ãããšããããšã ãã§ã¯ãããŸããã ãããã°ãšãã¹ããè¡ãå Žåãããã€ãã®é¢é£ããã·ãŒãžã£ãé çªã«åŒã³åºããæçµçµæã確èªããããã³ãŒãã§äºåå®çŸ©ãããå€ã§CSPãåæåããäžæã¹ã¯ãªããé¢æ°ãäœæãããšéåžžã«æçã§ãã
ååãšããŠããããã®é¢æ°ãããã¥ã¡ã³ãåãããããšã¯ãã£ãã«ãããŸããããã¢ããªã±ãŒã·ã§ã³ã³ãŒããèŠããšå°è±¡çã§ãã
æ°ããé¢æ°ãè¿œå ããå Žåã¯ããŸãCacheCommonã§ããããå®è£ ããã³ã³ãœãŒã«ã¢ããªã±ãŒã·ã§ã³ã䜿çšããŠãã¹ããã次ã«DLLã«è¿œå ããæåŸã«iscapi.Signerãä»ããŠãããã®é¢æ°ãžã®ã¢ã¯ã»ã¹ãéããŸãã ã³ã³ãœãŒã«ã¢ããªã±ãŒã·ã§ã³ãšåãæ¹æ³ã§ãåçã©ã€ãã©ãªã®é¢æ°ã«ååãä»ããããšããå§ãããŸãã ãZFBEGIN ... ZFENDããããã¯ã®DLLã³ãŒãã§ã¯ãå©çšå¯èœãªãã¹ãŠã®æé ã®åæãå¿ é ã§ããããšã«æ³šæããŠãã ããã
çŸåšå®è£ ãããŠããé¢æ°ã®ã»ããã¯å°ããã§ããã絶察ã«ãã¹ãŠãå®è¡ããããã«ã¿ã¹ã¯ãèšå®ããŠããŸããã ãã§ã«ããŒã¿ããã·ã¥ãäœæããŠçœ²åããããžã¿ã«çœ²åãæ€èšŒã§ããŸãã å°ãªããšããé¢å¿ã®ããåéçºè ãæå·åãããã€ããŒããã°ããæ§æãããã®ã³ã³ããã¹ããåæåããŠäœ¿çšãéå§ã§ããããã«ãããã¬ãŒã ã¯ãŒã¯ããããŸãã æ°ããé¢æ°ã®è¿œå ã¯ãæ¢åã®é¢æ°ãšã®é¡æšã«ãã£ãŠå®è¡ããããããããã»ã©æéã¯ããããŸããã
ãã¹ãŠã®Cachééçºè ãæåŸ ããŠããããžã§ã¯ãã®çµæã䜿çšãããã®éçºã«åå ããããšæããŸãã