ãã®èšäºã®äž»ãªç®æšã¯ãå®éã®ã¢ããªã±ãŒã·ã§ã³ã§èŠã€ãã£ãéèŠãªã³ãŒãã»ã¯ã·ã§ã³ã貎éãªããŒã¿ã«å¯Ÿããæ»æããä¿è·ããããã®Intel Tamper Protection Toolkitã®æ©èœãå®èšŒããããšã§ãã ããŒã«ãããã䜿çšãããšãé£èªåã«ãã£ãŠéçããã³åçãªãªããŒã¹ãšã³ãžãã¢ãªã³ã°ã«å¯Ÿæããå®è¡æã«æŽåæ§ãç£èŠããããšã«ãããä¿è·ãããã¢ããªã±ãŒã·ã§ã³ã«å€æŽãå ããããªãããã«ããããšãã§ããŸãã
ããã§ã¯ãããŒã«ãããã®é£èªåã«äœ¿çšãããiprotãšåŒã°ããã³ã³ããŒãã³ãã1ã€ã ãèŠãŠããããScryptæå·åãŠãŒãã£ãªãã£ããŒãžã§ã³1.1.6ã«é©çšããŸãã ãã®ãŠãŒãã£ãªãã£ã¯ãå ¥åããããã¹ã¯ãŒãã«åºã¥ããåçŽãªæå·åããŒçææ©èœã§ãã 圌女ãæ¯æããéžæã¯ããã€ãã®çç±ã§ãªãããŸããã ãŸãããã®æ©èœã®ã³ãŒãã«ã¯ãã¢ããªã±ãŒã·ã§ã³ã§ãã䜿çšãããæ©èœïŒãã¡ã€ã«ã®èªã¿åãããã³æžã蟌ã¿æäœãã¡ã¢ãªå²ãåœãŠãæå·åæ©èœãã·ã¹ãã ã³ãŒã«ïŒãå«ãŸããŠããŸãã 第äºã«ãç¹å®ã®æ°åŠçè£ çœ®ãå«ãŸããŠããŸãã 第äžã«ããŠãŒãã£ãªãã£ã¯éåžžã«ã³ã³ãã¯ãã§ãããéçºè ãèªåã®ã¢ããªã±ãŒã·ã§ã³ãä¿è·ããããã»ã¹ã§å®éã«ééããå¯èœæ§ã®ããããŸããŸãªåé¡ã瀺ãããšãã§ããŸãã æåŸã«ã scryptã¯ææ°ã®å®å šãªããŒçææ©èœã§ãããå®éã«ç©æ¥µçã«äœ¿çšãããŠããŸããããšãã°ãæ°ããscryptããŒã¹ã®ãã£ã¹ã¯æå·åã¯Android 4.4ã«çµã¿èŸŒãŸããŠããŸãã
ã³ãŒãã®é£èªå
以äžã®ãªã¹ãã«ç€ºãããŠããæ©åŸ®ãªé¢æ°ã®ãœãŒã¹ã³ãŒãã®äŸãæ€èšããåçã©ã€ãã©ãªãã³ã³ãã€ã«ããŸãã
#define MODIFIER (0xF00D) int __declspec(dllexport) sensitive(const int value) { int result = 0; int i; for (i = 0; i < value; i++) { result += MODIFIER; } return result; }
æ©å¯æ©èœã®ãœãŒã¹ã³ãŒã
IDA Proã䜿çšããŠãçµæã®ã©ã€ãã©ãªããªããŒã¹ãšã³ãžãã¢ãªã³ã°ããŸãã ãã®å³ã¯ãããžãã¯ãšèšç®çšããŒã¿ã䜿çšããã³ãŒãå®è¡ã®é åºã瀺ããŠããŸãã ãããã£ãŠãããã«ãŒã¯ã³ãŒãå ã®MODIFIERã®å€ãç°¡åã«ç¢ºèªããŠå€æŽã§ããŸãã
éã¢ã»ã³ãã«ãããã³ãŒãã®å®è¡é åº
ããŸããŸãªã³ãŒãé£èªåæè¡ã¯ãå®è£ ã®è©³çŽ°ãé ãããªããŒã¹ãšã³ãžãã¢ãªã³ã°ãè€éã«ããã³ãŒãã®å€æŽãé²ãã®ã«åœ¹ç«ã¡ãŸãã ã³ãŒãã®é£èªåã¯ãã³ãŒããåãæ©èœã«å€æããªããããªããŒã¹ãšã³ãžãã¢ãªã³ã°ãè¡ã£ãŠããã°ã©ã ã®ããžãã¯ãšããŒã¿ãç解ããããšãå°é£ãªã³ãŒãã«ã³ãŒããå€æããããã»ã¹ã§ãã é£èªåã¯ãã³ãŒãå ã®æ©å¯ããŒã¿ã®çé£ããã®å€æŽãåé¿ããéçºè ã®ç¥ç財ç£ãä¿è·ããããã«äœ¿çšãããŸãã
Intelã¿ã³ããŒãããã¯ã·ã§ã³ããŒã«ããã
Intel Tamper Protection Toolkitã¯ãã³ãŒããé£èªåããMicrosoft Windows *ããã³Android *ã§å®è¡å¯èœãã¡ã€ã«ã®å®è¡æã«ã¢ããªã±ãŒã·ã§ã³ã®æŽåæ§ãæ€èšŒããããã«äœ¿çšããã補åã§ãã Tamper Protection Toolkitã䜿çšããŠãã¢ããªã±ãŒã·ã§ã³ã®è²Žéãªã³ãŒããšããŒã¿ãéçããã³åçãªãªããŒã¹ãšã³ãžãã¢ãªã³ã°ãšå€æŽããä¿è·ã§ããŸãã ãã®ããŒã«ã§ä¿è·ãããå®è¡å¯èœãã¡ã€ã«ã«ã¯ãç¹å¥ãªããŒãããŒããŒãè¿œå ã®ãœãããŠã§ã¢ã¯äžèŠã§ãIntelããã»ããµãŒã§å®è¡ã§ããŸãã
Intel Tamper Protection Toolkit Betaã¯ã ããããããŠã³ããŒãã§ããŸã ã
ãã®èšäºã§ã¯ãã³ãŒãã®éèŠãªã»ã¯ã·ã§ã³ãé£èªåããèµ·ããããæ»æããæå·åãŠãŒãã£ãªãã£ãä¿è·ããããã«ã次ã®Intel Tamper Protection Toolkitã³ã³ããŒãã³ãã䜿çšããŸãã
- iprot-èªå·±å€æŽããã³èªå·±æå·åã³ãŒããäœæããé£èªåããŒã«ã
- æå·ã©ã€ãã©ãª -åºæ¬çãªæå·æäœã®ã»ãããåããã©ã€ãã©ãªïŒå®å šãªããã·ã¥ã¢ã«ãŽãªãºã ãã¡ãã»ãŒãžèªèšŒïŒèªèšŒïŒã³ãŒããããã³å¯Ÿç§°æå·ã
é£èªåããŒã«ã¯ãåçã©ã€ãã©ãªïŒ.dllïŒãšãšã¯ã¹ããŒãé¢æ°ã®ãªã¹ããåãåããŸãã åºåã¯ãé£èªåããããšã¯ã¹ããŒãæ©èœãåããåçã©ã€ãã©ãªã§ãã ã¢ãã¬ã¹ããéå§ããŠãå ¥åã«éä¿¡ãããåçã©ã€ãã©ãªã®ã³ãŒãã解æãããç¹å¥ãªå éšè¡šçŸã«å€æãããŸãã ãã©ã³ãããã©ã³ãžã·ã§ã³ãããã³ãã£ã¬ã³ãžããéæå¯èœãªå Žåã¯ãå解ããã³å€æãããŸãã ã³ãŒããé£èªåããããã«ãèæ ®ãã¹ãå¶éãããã€ããããŸãã ã³ãŒãã¯ãã¡ã¢ãªãå€éšã®å°éäžèœãªé¢æ°åŒã³åºããéæ¥é·ç§»ãã°ããŒãã«å€æ°ã䜿çšããŠäœã¬ãã«ã®äœæ¥ãè¡ãããšã¯ã§ããŸããã
ãã®èšäºã§ã¯ãã³ãŒããé£èªåããããã«ã³ãŒãã«å€æŽãå ããéã«çºçããèœãšãç©Žãšãçºçããåé¡ãå æããæ¹æ³ã«ã€ããŠèª¬æããŸãã
iprotã䜿çšããŠãåã®ã»ã¯ã·ã§ã³ã§èª¬æããåçã©ã€ãã©ãªãé£èªåããŸã ã
iprot sensitive.dll sensitive -o sensitive_obf.dll
IDA Proã䜿çšããŠé£èªåãããã³ãŒãããªããŒã¹ãšã³ãžãã¢ãªã³ã°ããŠã¿ãŸãããã
sensitive PROC NEAR jmp ?_001 ?_001: push ebp push eax call ?_002 ?_002 LABEL NEAR pop eax lea eax, [eax+0FECH] mov dword ptr [eax], 608469404 mov dword ptr [eax+4H], 2308 mov dword ptr [eax+8H], -443981824 mov dword ptr [eax+0CH], 1633409 mov dword ptr [eax+10H], -477560832 mov dword ptr [eax+14H], 15484359 mov dword ptr [eax+18H], -1929379840 mov dword ptr [eax+1CH], -1048448 <âŠ.>
éã¢ã»ã³ãã«ãããé£èªåã³ãŒã
é£èªåãããã³ãŒããå ã®ã³ãŒããšã©ã®ããã«ç°ãªããã¯ç°¡åã«ããããŸãã IDA Proã¯ãé£èªåãããã³ãŒãã®å®è¡é åºã®ã¹ããŒã ã衚瀺ã§ããã MODIFIERå€ãæ¶ããŸããã ãŸããé£èªåãããã³ãŒãã¯éçããã³åçãªå€æŽããä¿è·ãããŸãã
ãã¹ã¯ãŒãããŒçææ©èœ
ãã¹ã¯ãŒãããŒçæé¢æ°ïŒè±èªPBKDF ïŒã¯ããŠãŒã¶ãŒãå ¥åãããã¹ã¯ãŒããæå·ã¢ã«ãŽãªãºã ã§äœ¿çšã§ããããŒïŒãã€ããªããŒã¿ã»ããïŒã«å€æããããã«äœ¿çšãããŸãã PBKDFã¯ãã¢ããªã±ãŒã·ã§ã³ã»ãã¥ãªãã£ã®éåžžã«éèŠãªã³ã³ããŒãã³ãã§ãããŠãŒã¶ãŒãå ¥åãããã¹ã¯ãŒãã¯ããšã³ããããŒãäžååã§ãããããæå·åã¢ã«ãŽãªãºã ã§å®å šã«äœ¿çšã§ããªãããã§ãã ãããã®æ©èœã¯ãã¢ããªã±ãŒã·ã§ã³ãä¿è·ããããã«åºã䜿çšãããŠããŸããããšãã°ããã£ã¹ã¯äžã®ããŒã¿ãæå·å/埩å·åããããã«ãPGPã·ã¹ãã ã®ãã¹ã¯ãŒãããæå·åããŒãååŸãããŸãã ãŸãããªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã¯ãããã®æ©èœã䜿çšããŠããŠãŒã¶ãŒãã¹ã¯ãŒãïŒèªèšŒïŒãæ€èšŒããŸãã
äžè¬ã«ãPBKDFã®æ°åŒã¯æ¬¡ã®ãšããã§ãã
y = F ïŒ P ã S ã d ã t 1 ã...ã t n ïŒ
ããã§ã yã¯é¢æ°ã«ãã£ãŠçæãããããŒã Pã¯ãã¹ã¯ãŒãã Sã¯ãœã«ãã dã¯çæãããããŒã®é·ãã t 1 ã...ã t nã¯ãããã»ããµã¯ããã¯é床ãé¢æ°ã®èšç®ã«å¿ èŠãªRAMã®éãªã©ã®ããŒããŠã§ã¢ãªãœãŒã¹ã®éã«ãã£ãŠæ±ºå®ããããã©ã¡ãŒã¿ãŒã§ãã S saltã¯ãæå®ããããã¹ã¯ãŒãã§ç°ãªãããŒãäœæããããã«äœ¿çšãããŸãã ãã©ã¡ãŒã¿ãŒt 1 ã...ã t nã¯ãé¢æ°ã®èšç®ã«æ¶è²»ãããããŒããŠã§ã¢ãªãœãŒã¹ã決å®ãã圹å²ãæãããèšç®ãè€éã«ããããŒããŠã§ã¢ã¬ãã«ã§äžŠååã䜿çšãããã«ãŒããã©ãŒã¹æ»æã«å¯Ÿããä¿è·ãè¿œå ããããã«æ§æã§ããŸããåŸæ¥ã®GPUã
PBKDF䜿çšã¹ããŒã
ãŠãŒã¶ãŒãã¹ã¯ãŒããå埩ããã«ã¯ã次ã®2ã€ã®æ¹æ³ããããŸãã
- æ»æè ã¯ããªãŒã¯ã®çµæãšããŠååŸããçæãããããŒã䜿çšããŠãã¹ã¯ãŒããå埩ããŸãã
- æ»æè ã¯ãããŒã«ãã£ãŠçæãããæå·åãŸãã¯çœ²åãããããŒã¿ã䜿çšããŠãã¹ã¯ãŒããå埩ããŸãã
åè ã®å Žåã Intel Tamper Protection Toolkitã¯ãçæããããã«å®è¡ãããã³ãŒããé衚瀺ã«ããŠãçæãããããŒã䜿çšããããšã«ãããããŒã®æŒæŽ©ãé²ããŸãã
Intel Tamper Protection Toolkitã®2çªç®ã®ã±ãŒã¹ã¯é²æ¢ã§ããŸããããæ»æè ãããŒã®çæã«äœ¿çšããããã©ã¡ãŒã¿ãŒãå®å šã§ãªããã®ã«å€æŽããªãã£ãããšã確èªããã®ã«åœ¹ç«ã¡ãŸãã
以äžã¯ãå®éã«äœ¿çšããããã¹ã¯ãŒãçæããŒçæé¢æ°ã®äŸã§ãã
- ãã¹ã¯ãŒãããŒã¹ã®ããŒæŽŸçé¢æ° ïŒPBKDF2ïŒã ããã¯ã y = F ïŒ P ã S ã c ïŒã®åœ¢åŒã®é¢æ°ã§ããããã§ã cã¯ã P ã Sã®é¢æ°Fãèšç®ããããã«å¿ èŠãªããã»ããµãŒæéãå¶åŸ¡ããããã®å埩åæ°ã§ãã PBKDF2ã¯ãRAMãéåžžã«å°ãªãã·ã¹ãã ã«å®è£ ã§ãããããGPUã䜿çšãããã«ãŒããã©ãŒã¹æ»æãéåžžã«å¹æçã«ãªããŸãã ããã«ãããããããå€ãã®è£œåã¯åŒãç¶ãPBKDF2ã䜿çšããŠããŸãã
- bcrypt ã ãã®æ©èœã¯ãGPUã䜿çšãããã®ã¿ã€ãã®æ»æã«å¯ŸããŠãããå€ãã®åºå®éã®RAMã䜿çšãããããããèæ§ããããŸãã
Colin PercivalãéçºããæãçŸä»£çã§å®å šãªæ©èœã¯scryptã§ãã 次ã®æ°åŒããããŸãã
y = F ïŒ P ã S ã d ã N ã r ã p ïŒã
ããã§ã yã¯é¢æ°ã«ãã£ãŠçæãããããŒã dã¯çæãããããŒã®é·ãã Pã¯ãŠãŒã¶ãŒãã¹ã¯ãŒãã Sã¯ãœã«ãã p ã r ãããã³Nã¯ããŒãçæããããã«å¿ èŠãªããã»ããµæéãšRAMã®éãèšå®ããããã®ãã©ã¡ãŒã¿ãŒã§ãã ãã©ã¡ãŒã¿N ã r ã p ã dã®å€ã¯éãããšãã§ããéåžžã¯ããŒãŸãã¯æå·åãããããŒã¿ãšãšãã«ä¿åãããŸãã
ãã©ã¡ãŒã¿ãŒN ã r ã pã®å€ã«å¿ããŠãåãããŒã®çæã«ã¯ãç°ãªãéã®ããã»ããµãŒæéãšã¡ã¢ãªãŒãµã€ãºãå¿ èŠã«ãªãå ŽåããããŸãã ããšãã°ããã©ã¡ãŒã¿ãŒãã100 msããã³ã20 MBãèŠæ±ããå Žåã scrypté¢æ°ã«å¯Ÿããéåžžã®GPUã«å¯Ÿãããã«ãŒããã©ãŒã¹æ»æã¯ãå°éã®RAMãå¿ èŠãšããGPUäžã®ç°ãªããã¹ã¯ãŒãã®äžŠåèšç®ãå¯èœã«ããPBKDF2ã»ã©å¹æçã§ã¯ãããŸããã
æå·åæå·åãŠãŒãã£ãªãã£
Scryptæå·åãŠãŒãã£ãªãã£ã¯ãCTRã¢ãŒãã®AESã¢ã«ãŽãªãºã ãšãå ¥åãã¡ã€ã«ãæäœããããã®ãŠãŒã¶ãŒãã¹ã¯ãŒãçšã®scrypté¢æ°ã«ãã£ãŠçæãããããŒã䜿çšããŸãã å®è¡ããããã«å¿ èŠãªãã©ã¡ãŒã¿ãŒãšè¿œå ã®ãã©ã¡ãŒã¿ãŒãå«ãŸããŠããŸãã
å¿ é ã¯æ¬¡ã®ãšããã§ãã
- scryptãããŒãçæããããã«äœ¿çšãããã¹ã¯ãŒã ã
- ã¢ãŒã ïŒæå·åãŸãã¯åŸ©å·åã
- å ¥åãã¡ã€ã«å ã
è¿œå ãªãã·ã§ã³ïŒ
- -tããŒã®çæã«å¿ èŠãªç§åäœã®æéã
- -mã¯ãããŒã®çæã«äœ¿çšãããRAM ã®å²åã§ãã
- -MããŒã®çæã«äœ¿çšãããRAMã®ãã€ãæ°ã
- åºåãã¡ã€ã«ã®åå ã
ããšãã°ãã³ãã³ãã§ãŠãŒãã£ãªãã£ãå®è¡ãã
scrypt enc infile -t 0.1 -M 20971520
ããŒãçæããã«ã¯ã100msã®ããã»ããµæéãš20MBã®RAMãå¿ èŠã§ãã ãã®ãããªãã©ã¡ãŒã¿ãŒå€ã¯ããã«ãŒããã©ãŒã¹æ»æã®äžŠååãè€éã«ããŸãã
以äžã®å³ã¯ããŠãŒã¶ãŒãæå·åã®ããã®å ¥åãã¡ã€ã«ã®ååããã¹ã¯ãŒããããã³å¿ èŠãªããŒããŠã§ã¢ãªãœãŒã¹ã決å®ãããã©ã¡ãŒã¿ãŒãå ¥åããå Žåã®ScryptãŠãŒãã£ãªãã£ã®æäœãè¡šããŠããŸãã
æå·åäžã«ãŠãŒãã£ãªãã£ã«ãã£ãŠå®è¡ãããæé ã説æããŸãã
- Scryptãã©ã¡ãŒã¿ãŒãåéããŠå€æããŸãã ããã°ã©ã ã¯ãããã»ããµãŒæéã®ãã©ã¡ãŒã¿ãŒãšããŒã®çæã«å¿ èŠãªRAMã®éãéžæããããããscrypté¢æ°ãèªèãããã©ã¡ãŒã¿ãŒã«å€æããŸãã
- æå·åããŒã®çæã scrypté¢æ°ã¯ããŠãŒã¶ãŒãã¹ã¯ãŒããšåã®æé ã§èšç®ããããã©ã¡ãŒã¿ãŒN ã r ã pã䜿çšããŠ64ãã€ãã®ããŒãçæããŸãã dk 1ããŒã®äžäœ32ãã€ãã¯ããã©ã¡ãŒã¿ãŒN ã r ã p ã ãœã«ã ãããã³æå·åãããããŒã¿ã®èªèšŒã³ãŒããèšç®ããããã«äœ¿çšãããŸãã ãããã£ãŠã埩å·åã®ããã»ã¹ã§ã¯ãå ¥åãããã¹ã¯ãŒãã®æ£ç¢ºæ§ãšæå·åãããããŒã¿ã®æŽåæ§ã確èªã§ããŸãã dk 2ããŒã®äžäœ32ãã€ãã¯ãCTRã¢ãŒãã§AESã¢ã«ãŽãªãºã ã䜿çšããŠå ¥åãã¡ã€ã«ãæå·åããããã«äœ¿çšãããŸãã
- æå·åãã©ã¡ãŒã¿ã®èªèšŒã³ãŒãã®èšç®ã ãã®ã¹ãããã§ãããŒã®çæã«äœ¿çšããããã©ã¡ãŒã¿ãŒN ã r ã pããã³saltã®èªèšŒïŒèªèšŒïŒã³ãŒããèšç®ãããŸãã
- CTRã¢ãŒãã®32ãã€ãAESãããã¯ã䜿çšããOpenSSLæå·åã CTRã¢ãŒãã§32ãã€ãã®AESæå·ã䜿çšããŠã dk 2ã§å ¥åã¡ãã»ãŒãžãæå·åããŸãã
- æå·åãããããŒã¿ã®èªèšŒã³ãŒãã®èšç®ã æåŸã«ã dk 1ã䜿çšããŠæŽåæ§ã確ä¿ããããã«ãèªèšŒã³ãŒããèšç®ãããŠããŒã¿ãæå·åãããŸãã åºåãã¡ã€ã«ã«ã¯ãæå·åãããããŒã¿ããã©ã¡ãŒã¿ãŒN ã r ã p ãæå·åäžã«äœ¿çšããããœã«ã ãããã³æå·åãããããŒã¿ãšãã©ã¡ãŒã¿ãŒã®æŽåæ§ãä¿èšŒããèªèšŒã³ãŒããå«ãŸããŸãã
æå·åæå·åã¹ããŒã
èããããè åš
æå·åã¢ãŒãã§ãŠãŒãã£ãªãã£ã®åäœãåæããè åšã¢ãã«ã決å®ããŸãã ãã©ã¡ãŒã¿N ã r ã p ã saltã®å€ãããã³äžéã¹ãããã§ååŸãããçæããŒã¯éèŠãªããŒã¿ã§ããããªã¢ã«ã¿ã€ã ã®å€æŽã«å¯Ÿããä¿è·ãå¿ èŠã§ãã ããšãã°ããããã°ã¢ãŒãã§ã¯ãæ»æè ã¯ãã«ãŒããã©ãŒã¹æ»æã«å¯ŸããçæãããããŒã®æµæã匱ããããã«ããã©ã¡ãŒã¿N ã r ã pã®ä»ã®å€ãèšå®ã§ããŸãã
次ã®å³ã¯ããŠãŒã¶ãŒãæå·åãããããã¹ãN ã r ã p ã salt ã èªèšŒã³ãŒã ãããã³ãã¹ã¯ãŒããå«ãå ¥åãã¡ã€ã«ã®ååãå ¥åãããšãã®åŸ©å·åããã»ã¹ã瀺ããŠããŸã ã
埩å·åäžã«ãŠãŒãã£ãªãã£ã«ãã£ãŠå®è¡ãããæé ã説æããŸãã
- æå·åèšå®ãã©ã¡ãŒã¿ãŒã 埩å·åã®å ¥åãã¡ã€ã«ã«ã¯ãæå·åãããããŒã¿ãèªèšŒã³ãŒãhmac 1 ã hmac 2 ãããã³æå·åäžã«äœ¿çšããããã©ã¡ãŒã¿ãŒN ã r ã p ã saltãå«ãŸããŸãã ãã®ã¹ãããã§ããããã®ãã©ã¡ãŒã¿ãŒã¯å ¥åãã¡ã€ã«ããå·®ãåŒãããéµçææ©èœã«è»¢éãããŸãã
- æå·åããŒã®çæã scrypté¢æ°ã¯ãåã®æé ã§ååŸãããã¹ã¯ãŒããšãã©ã¡ãŒã¿ãŒN ã r ã p ã saltã®ããŒãçæããŸãã ãã®ããŒã®äžäœ32ãã€ããšäžäœ32ãã€ãã¯ãããããå³dk 1ãšdk 2ã«ç€ºãããŠããŸãã
- Scryptãã©ã¡ãŒã¿ãšãã¹ã¯ãŒãã®æŽåæ§ããã§ãã¯ããŸãã N ã r ã p ã saltãããã³passwordã®æŽåæ§ã¯ãèªèšŒã³ãŒãã䜿çšããŠæ€èšŒãããŸãã ãã¹ã¯ãŒããæ£ããããšã確èªããããã«ããŠãŒãã£ãªãã£ã¯dk 1ã䜿çšããŠãã©ã¡ãŒã¿ãŒN ã r ã p ã saltã®èªèšŒã³ãŒããèšç®ããåä¿¡ããå€ãšå€hmac 1ãæ¯èŒããŸãã äžèŽããå Žåããã¹ã¯ãŒãã¯æ£ããã§ãã
- æå·åãããããŒã¿ã®æŽåæ§ã確èªããŸãã æå·åãããããŒã¿ãå€æŽãããŠããªãããšã確èªããããã«ãããŒã¿ã®èªèšŒã³ãŒããdk 1ã䜿çšããŠèšç®ããã hmac 2ã®å€ãšæ¯èŒãããŸãã äžèŽããå ŽåãããŒã¿ã¯ç ŽæããŠããªãããã次ã®æé ã§åŸ©å·åã§ããŸãã
- CTRã¢ãŒãã®AESã¢ã«ãŽãªãºã ã«ããOpenSSL 32ãã€ããããã¯åŸ©å·åã æåŸã«ãããŒã¿ã¯dk 2ã䜿çšããŠCTRã¢ãŒãã§32ãã€ãã®AESãããã¯ã¢ã«ãŽãªãºã ã䜿çšããŠåŸ©å·åãããŸãã åºåãã¡ã€ã«ã«ã¯ã埩å·åãããããŒã¿ãå«ãŸããŠããŸãã
æå·è§£èªã¹ããŒã
Windowsã§ã®ãŠãŒãã£ãªãã£ã®ç§»æ€
ãã®äœæ¥ã®ç®çã¯ã ã¿ã³ããŒãããã¯ã·ã§ã³ããŒã«ãããã䜿çšããŠãWindowsçšã®Scryptæå·åãŠãŒãã£ãªãã£ãä¿è·ããããšã§ãã ãŠãŒãã£ãªãã£ã®åæããŒãžã§ã³ã¯Linuxçšã«äœæãããŠãããããæåã®ã¿ã¹ã¯ã¯Windowsã«ç§»æ€ããããšã§ãã
ãã©ãããã©ãŒã åºæã®ã³ãŒãã¯ã次ã®æ¡ä»¶ä»ããã£ã¬ã¯ãã£ãã®éã«é 眮ãããŸãã
#if defined(WIN_TP) // Windows #else // Linux #endif // defined(WIN_TP)
WIN_TPããªããã»ããµãã£ã¬ã¯ãã£ãã¯ãWindowsåºæã®ã³ãŒããåé¢ããŸãã Windowsã§ã®ã¢ã»ã³ããªã«ã¯WIN_TPãå®çŸ©ããå¿ èŠããããŸããããããªããšãLinuxã³ãŒããã¢ã»ã³ããªã«éžæãããŸãã
Microsoft * Visual Studio 2013éçºç°å¢ã䜿çšããŠããŠãŒãã£ãªãã£ããã«ãããã³ãããã°ããŸãã ããã»ã¹ãã¹ã¬ãããã¡ã¢ãªããã³ãã¡ã€ã«ç®¡çããµãŒãã¹ã€ã³ãã©ã¹ãã©ã¯ãã£ããŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ãªã©ãWindows OSãšLinux OSã®äžéšã®ãªããžã§ã¯ãã«ã¯éãããããŸãã ãŠãŒãã£ãªãã£ã移æ€ãããšãã«ã¯ãããããã¹ãŠã®éããèæ ®ããå¿ èŠããããŸããã ãããã«ã€ããŠä»¥äžã«èª¬æããŸãã
- ãŠãŒãã£ãªãã£ã¯ãã³ãã³ãã©ã€ã³åŒæ°ã解æããããã«getoptïŒïŒé¢æ°ã䜿çšããŸãã 䜿çšå¯èœãªããã°ã©ã åŒæ°ã®ãªã¹ãã¯äžèšã®ãšããã§ãã getoptïŒïŒé¢æ°ã¯ãPOSIXæšæºã»ããã«åŸã£ãŠunitstd.hããããŒãã¡ã€ã«ã«ãããŸãã éããŠããgetopt_portãããžã§ã¯ãã®get_optïŒïŒå®è£ ã䜿çšããŸãã ãããè¡ãã«ã¯ã getopt_portãããžã§ã¯ããããããžã§ã¯ãã«ãã¡ã€ã«getopt.hããã³getopt.cãè¿œå ããŸãã
- POSIX APIã§å®£èšãããŠããæ®ãã®gettimeofdayïŒïŒé¢æ°ã¯ããŠãŒãã£ãªãã£ã«ãã£ãŠäœ¿çšããã salsa oppsã枬å®ãããŠãŒã¶ãŒãã©ãããã©ãŒã ã§å®è¡ããã1ç§ãããã®æäœåæ°salsa20 / 8ãã«ãŠã³ãããŸãã ãŠãŒãã£ãªãã£ã¯ãµã«ãµoppsã¡ããªãã¯ã䜿çšããŠããã©ã¡ãŒã¿N ã r ãããã³pã®ããå®å šãªå€ãéžæããããã scryptã¢ã«ãŽãªãºã ã¯ããã«ãŒããã©ãŒã¹æ»æãåé¿ããæå°åæ°ã§salsa20 / 8æäœãå®è¡ããŸãã gettimeofdayïŒïŒé¢æ°ã®å®è£ ãscryptenc_cpuperf.cãã¡ã€ã«ã«è¿œå ããŸããã
- æ§æã¢ã«ãŽãªãºã ãéå§ããåã«ããŠãŒãã£ãªãã£ã¯ãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã«ãPOSIXã»ããããgetrlimité¢æ°ïŒRLIMIT_DATAã...ïŒãåŒã³åºããŠããŒãçæããããšã«ããããã£ããã£ããã䜿çšå¯èœãªRAMã®éãèŠæ±ããŸãã Windowsã§ã¯ãããã»ã¹ããŒã¿ã»ã°ã¡ã³ãã®æ倧ãµã€ãºïŒåæåãããããŒã¿ãšåæåãããŠããªãããŒã¿ãããã³æïŒã®ããŒãå¶éãšéããŒãå¶éã¯4GBã«èšå®ãããŸãã ãããã¯ãã¹ãŠã以äžã®ã³ãŒãã«ç€ºãããŠããŸãã
/* ... RLIMIT_DATA... */ #if defined(WIN_TP) rl.rlim_cur = 0xFFFFFFFF; rl.rlim_max = 0xFFFFFFFF; if((uint64_t)rl.rlim_cur < memrlimit) { memrlimit = rl.rlim_cur; } #else if (getrlimit(RLIMIT_DATA, &rl)) return (1); if ((rl.rlim_cur != RLIM_INFINITY) && ((uint64_t)rl.rlim_cur < memrlimit)) memrlimit = rl.rlim_cur; #endif // defined(WIN_TP)
- ããã«ã sysendian.hãã¡ã€ã«ã§ã€ã³ã©ã€ã³é¢æ°ãå®çŸ©ããããã®ãã£ã¬ã¯ãã£ããMSVSã³ã³ãã€ã©ãŒã«è¿œå ãããŸããã
#if defined(WIN_TP) static __inline uint32_t #else static inline uint32_t #endif // WIN_TP be32dec(const void *pp);
- tarsnap_readpassïŒ...ïŒé¢æ°ã移æ€ããŠãã¿ãŒããã«ã§é衚瀺ã®ãã¹ã¯ãŒãå
¥åãå®è¡ããŸããã ãã®é¢æ°ã¯ãã¿ãŒããã«ãŠã£ã³ããŠã®æåã®è¡šç€ºããªãã«ãããã¹ã¯ãŒãã空çœæåã§ãã¹ã¯ããŸãã ãã¹ã¯ãŒãã¯ã¡ã¢ãªã«å²ãåœãŠããããããã¡ã«ä¿åããã次ã®Scryptèšå®ããã³ããŒçææ©èœã«éä¿¡ãããŸãã
/* , */ #if defined(WIN_TP) if ((usingtty = _isatty(_fileno(readfrom))) != 0) { GetConsoleMode(hStdin, &mode); if (usingtty) mode &= ~ENABLE_ECHO_INPUT; else mode |= ENABLE_ECHO_INPUT; SetConsoleMode(hStdin, mode); } #else if ((usingtty = isatty(fileno(readfrom))) != 0) { if (tcgetattr(fileno(readfrom), &term_old)) { warn("Cannot read terminal settings"); goto err1; } memcpy(&term, &term_old, sizeof(struct termios)); term.c_lflag = (term.c_lflag & ~ECHO) | ECHONL; if (tcsetattr(fileno(readfrom), TCSANOW, &term)) { warn("Cannot set terminal settings"); goto err1; } } #endif // defined(WIN_TP)
- ãªãªãžãã«ã®getsaltïŒïŒé¢æ°ã¯ãæ¬äŒŒã©ã³ãã ã·ãŒã±ã³ã¹ãååŸããããã«ãUnix OSã®äžéšã§ããç¹æ®ãã¡ã€ã«/ dev / urandomãèªã¿åããŸãã Windowsã§ã¯ã Ivy Bridgeããå§ãŸãIntel Xeonããã³Coreãããã§å©çšå¯èœãªããŒããŠã§ã¢ä¹±æ°ãžã§ãã¬ãŒã¿ãŒããã®rdrandïŒïŒåœä»€ã䜿çšããŸãã ãã®å Žåãé£èªåããŒã«Tamper Protectionã䜿çšããŠgetsaltïŒïŒé¢æ°ãé£èªåããããšã¯ã§ããªããããæšæºCé¢æ°ã¯æ¬äŒŒã©ã³ãã ã·ãŒã±ã³ã¹ã®çæã«æå³çã«äœ¿çšãããŸããã ãã®é¢æ°ã«ãã£ãŠçæããããœã«ãã¯ã»ã¯ã·ã§ã³3ã§ä¿è·ãªããžã§ã¯ããšããŠåé¡ãããããã getsaltïŒïŒé¢æ°ã¯éçããã³åçãªå€æŽããªããŒã¹ãšã³ãžãã¢ãªã³ã°ããé£èªåããŒã«ã«ãã£ãŠä¿è·ããå¿
èŠããããŸãã 以äžã¯ã saltãçæããããã«ã³ãŒãã«å ããããå€æŽã§ãã
#if defined(WIN_TP) uint8_t i = 0; for (i = 0; i < buflen; i++, buf++) { _rdrand32_step(buf); } #else /* /dev/urandom. */ if ((fd = open("/dev/urandom", O_RDONLY)) == -1) goto err0; /* , buffer. */ while (buflen > 0) { if ((lenread = read(fd, buf, buflen)) == -1) goto err1; /* , buffer. */ if (lenread == 0) goto err1; /* */ buf += lenread; buflen -= lenread; } /* */ while (close(fd) == -1) { if (errno != EINTR) goto err0; } #endif // defined(WIN_TP)
Intel Tamper Protection Toolkitã«ãããŠãŒãã£ãªãã£ä¿è·
次ã«ããŠãŒãã£ãªãã£ã³ãŒãããªãã¡ã¯ã¿ãªã³ã°ããŠãè åšã¢ãã«ã§å®çŸ©ããããã¹ãŠã®éèŠãªããŒã¿ãä¿è·ããŸãã ãã®ãããªããŒã¿ã®ä¿è·ã¯ã iprotããŒã«ã䜿çšããŠã³ãŒããé£èªåããããšã«ããå®çŸãããŸããããã«ãããã»ããããã³ã³ãã€ã©ãŒãé£èªåãããŸãã ãŸããåçæ§ã®ååã«åŸããéèŠãªããŒã¿ãäœæãåŠçã䜿çšããæ©èœã®ã¿ãé£èªåããŸãã
é£èªåããŒã«ããã€ãããã¯ã©ã€ãã©ãªãå ¥åãšããŠåãåããã³ãã³ãã©ã€ã³ã§æå®ãããä¿è·ãããé¢æ°ã®ã¿ãå«ããã€ããªãã¡ã€ã«ãçæããããšã¯æ¢ã«ããã£ãŠããŸãã ãã®ãããéèŠãªããŒã¿ãæäœãããã¹ãŠã®é¢æ°ãåçã©ã€ãã©ãªå ã«é 眮ããŠãããã«é£èªåããããã«ããŸãã ã³ãã³ãã©ã€ã³åŒæ°ã®è§£æããã¹ã¯ãŒãã®èªã¿åããªã©ã®æ®ãã®æ©èœã¯ãã¡ã€ã³ã®å®è¡å¯èœãã¡ã€ã«ã«ä¿è·ãããªããŸãŸã«ããŸãã
ä¿è·ããããŠãŒãã£ãªãã£ã®æ°ããæ§é ã次ã®å³ã«ç€ºããŸãã ãã®ãŠãŒãã£ãªãã£ã¯ãã¡ã€ã³ã®å®è¡å¯èœãã¡ã€ã«ãšãé£èªåããããã€ãããã¯ã©ã€ãã©ãªã®2ã€ã®éšåã«åãããŠããŸãã ã¡ã€ã³ã®å®è¡å¯èœãã¡ã€ã«ã¯ãã³ãã³ãã©ã€ã³åŒæ°ã®è§£æããã¹ã¯ãŒãã®èªã¿åããããã³å ¥åãã¡ã€ã«ã®ã¡ã¢ãªãžã®ããŒããè¡ããŸãã , scryptenc_file , scryptdec_file , ( N , r , p , ).
, , Scrypt HMAC scrypt : N , r , p . HMAC , scrypt_ctx_enc_init , scrypt_ctx_dec_init , scryptenc_file scryptdec_file , . , . scrypt_ctx_enc_init scrypt_ctx_dec_init scrypt : , .
Scrypt
, : .
:
- getopt() . .
- / .
- scrypt_ctx_enc_init scrypt ( N , r , p ), maxmem , maxmemfrac maxtime , . HMAC ( -) , , scrypt . , , scrypt .
- , .
- scrypt_ctx_enc_init . scrypt , HMAC. , scrypt HMAC. , . , -, , .
- scryptenc_file , . scrypt ( N , r , p ), . , scrypt . . , scrypt . , , .
:
- getopt() .
- / .
- scrypt_ctx_dec_init , . , , scrypt .
- , .
- scrypt_ctx_dec_init . , .
- scryptdec_file , . scrypt ( N , r , p ), . , scrypt . , .
OpenSSL AES CTR Intel Tamper Protection Toolkit crypto library . OpenSSL , crypto library iprot . AES scryptenc_file scryptdec_file / . ( scrypt_ctx_enc_init , scrypt_ctx_dec_init , scryptenc_file scryptdec_file ) scrypt . iprot .
Tamper Protection . iprot . , : scrypt , HMAC HMAC . HMAC - . , , scrypt , , scryptenc_file scryptdec_file . iprot , .
scrypt_ctx_enc_init scrypt . buf_p scrypt_ctx_enc_init . ( null ), , . scrypt , HMAC scrypt . .
// : scrypt if (buf_p == NULL) { // scrypt // <...> // HMAC itp_res = itpHMACSHA256Message((unsigned char *)ctx_p, sizeof(scrypt_ctx)-sizeof(ctx_p->hmac), hmac_key, sizeof(hmac_key), ctx_p->hmac, sizeof(ctx_p->hmac)); *buf_size_p = (r << 7) * (p + (uint32_t)N) + (r << 8) + 253; }
buf_p , scrypt_ctx_enc_init . HMAC, , , . , buf_p , HMAC . , , .
// : scrypt if (buf_p != NULL) { // HMAC itp_res = itpHMACSHA256Message( (unsigned char *)ctx_p, sizeof(scrypt_ctx)-sizeof(ctx_p->hmac), hmac_key, sizeof(hmac_key), hmac_value, sizeof(hmac_value)); if (memcmp(hmac_value, ctx_p->hmac, sizeof(hmac_value)) != 0) { return -1; } // scrypt: // ctx_p->addrs.B0 = ⊠// HMAC itp_res = itpHMACSHA256Message( (unsigned char *)ctx_p, sizeof(scrypt_ctx)-sizeof(ctx_p->hmac), hmac_key, sizeof(hmac_key), ctx_p->hmac, sizeof(ctx_p->hmac)); }
, , : (. indirect jump ) . C , -, . - memcmp , iprot . -, memcmp , memset , memmove , . , .
, , double , . , , pickparams salsa20/8 double 32768. , .
double opslimit; #if defined(WIN_TP) // unsigned char d_32768[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x40}; unsigned char d_32768[sizeof(double)]; d_32768[0] = 0x00; d_32768[1] = 0x00; d_32768[2] = 0x00; d_32768[3] = 0x00; d_32768[4] = 0x00; d_32768[5] = 0x00; d_32768[6] = 0xE0; d_32768[7] = 0x40; double *var_32768_p = (double *) d_32768; #endif /* salsa20/8. */ #if defined(WIN_TP) if (opslimit < *var_32768_p) opslimit = *var_32768_p; #else if (opslimit < 32768) opslimit = 32768; #endif
16- , double , double . , double2hex 16- double .
iprot , :
iprot scrypt-dll.dll scryptenc_file scryptdec_file scrypt_ctx_enc_init scrypt_ctx_dec_init -c 512 -d 2600 -o scrypt_obf.dll
. . , , .
| |
. : . 512- 2600- . . , , . , .
, Intel Tamper Protection Toolkit , Github.
è¬èŸ
Scrypt .
åç §è³æ
- K. Grasman. getopt_port on github
- C. Percival. The scrypt encryption utility
- C. Percival. âStronger key derivation via sequential memory-hard functionsâ.
- C. Percival, S. Josefsson (2012-09-17). âThe scrypt Password-Based Key Derivation Functionâ. IETF.
- N. Provos, D. Mazieres, J. Talan Sutton 2012 (1999). âA Future-Adaptable Password Schemeâ. Proceedings of 1999 USENIX Annual Technical Conference: 81â92.
- W. Shawn. Freebsd sources on github
: , ,
{Roman.Kazanstev, Denis.Katerinskiy, Thaddeus.C.Letnes}@intel.com