åäŸã®é ã誰ãã²ãŒã ãDandyããŸãã¯ãSegaãã§äœæéãéãã§ããããšãèªããŸããïŒ ãããŠãã²ãŒã ãé²ããŠããäžã§ããã¹ã¯ãŒããçŽãç¹å¥ã«å·ã€ããããŒãã«æžãçãã人ã¯èª°ã§ããïŒ ããªãããã®ãµã€ãã§ããã®ãµã€ããèªãã§ããã®ã§ããã°ãããããå°ãªããšãäžåºŠã¯ãã©ã®ããã«æ©èœããŸããïŒã
ç§ã®åäŸæ代ã®ã²ãŒã ã®äŸã䜿çšããŠããã¹ã¯ãŒããçæããããã®å€å
žçãªã¡ã«ããºã ã®åçã説æããããšããŸãã ãã¹ãŠã®äŸãNESãã©ãããã©ãŒã ïŒã¯ãããDandyãïŒããã®ãã®ã§ããããšãäºåã«è¬çœªããŸãããäž»é¡ã¯ããã«éå®ãããŸããã ããŸããŸç§ã¯ãããå°ãç 究ãããŠãããå°ãããã¹ããæžãããã®ååãªã¢ãããŒã·ã§ã³ãèªåã§èŠã€ããããªãã£ãã®ã§ãã
åçŽãªãã®ããè€éãªãã®ãŸã§é çªã«äŸã瀺ããŸãã æåã¯ã³ãŒãã¯ã»ãšãã©ãããŸããããã¢ã«ãŽãªãºã ã人éã®èšèªã§èª¬æããã®ãé£ãããªãã°ãªãã»ã©ããŸãæè¡çãªèšèªã§ã¢ã«ãŽãªãºã ã説æããã®ã¯ç°¡åã«ãªãã®ã§ãç§ã責ããªãã§ãã ããã
ã³ãŒãããã¯
ç§ã®èšæ¶ã«ã¯ãŸã 幌å°æã®ã²ãŒã ã®ãã¹ã¯ãŒããããã€ãæ®ã£ãŠããŸããããšãã°ãããããŒã«ã¯ã¬ã€ãžãŒã©ã³ããã®ãBCHKãïŒãããïŒããïŒãŠãŠãšã³ããïŒããè¶
人æŠéãžã§ãããã³ãã®ã4660ããªã©ã§ãã ãããã¯ãå©äŸ¿æ§ã®ç¹ã§çæ³çãªãã¹ã¯ãŒãã§ãããšèšããŸããèŠãããããå
¥åæã«ééããç¯ãã«ããã§ãã ããããã©ãã ãã®æ
å ±ãå«ããããšãã§ãããã®ãããªãã¹ã¯ãŒããã©ã³ãã ã«éžæããå¯èœæ§ã¯ãããŸããïŒ
æåã®ã±ãŒã¹ã§ã¯ããã¹ã¯ãŒãã®ã¢ã«ãã¡ãããã¯24æåã§ãã ãã£ã©ã¯ã¿ãŒã®çµã¿åããã®æ°ãæ°ãããšã24
4ã«ãªããŸã-ã²ãŒã ã«ã¯12ã¬ãã«ãããªãããšãèãããšãããã»ã©å°ãããããŸãããå®éããã¹ã¯ãŒãã«ã¯ã¬ãã«çªå·ä»¥å€ã¯ä¿åãããŸããã ããã€ãã®ç§å¯ã®ãã¹ã¯ãŒããèæ
®ããŠã1åã®è©Šè¡ã§ãã¹ã¯ãŒããååŸãã確çãèšç®ããŸãïŒïŒ12 + 4ïŒ/ 24
4 ãããã¯ã5.7Ã10
-14ã«çžåœããŸãã ã€ãŸããå®éã®ãã¹ã¯ãŒããååŸããåã«ãå¹³åã§17592186044416ã®ãã¹ã¯ãŒããè©Šãå¿
èŠããããŸãã
2çªç®ã®ã±ãŒã¹ã§ã¯ããã¹ãŠãå€å°ç°ãªããŸãã æããã«ã4æ¡ã®ã»ããã§æ£ç¢ºã«10,000ïŒ10
4 ïŒã®çµã¿åãããåŸãããŸãã ã²ãŒã ã«ã¯ãç°ãªãé åºã§å®äºããããšãã§ãã5ã€ã®ã¬ãã«ãš2ã€ã®ã¬ãã«ã®é£æ床ãå«ãŸããŠããŸãã ã€ãŸã ãã¹ã¯ãŒãã«ã¯ãåæ Œã¬ãã«ãšé£æ床ã«é¢ããæ
å ±ãä¿åãããŸãã ãããã£ãŠãæ¢åã®ãã¹ã¯ãŒãã®æ°ã¯2Ã2
5ã§ãã 64.ãããã£ãŠããã¹ã¯ãŒããååŸãã確çã¯0.0064ã§ããã€ãŸãã åå以äžã ååã§ã¯ãããŸãããïŒ å¹³åããŠãçŽ156çªç®ã®ãã¹ã¯ãŒãã¯ãã¹ãŠæ£ãããã®ã§ãããæ€çŽ¢ã®é床ãããªãé«ããããæ€çŽ¢ã¯é·ç¶ãããŸããã ãããŠãççŽã«èšã£ãŠãåäŸã®é ãç§ãã¡ã¯æåããå§ããããªãã£ããšãããã°ãã°ããã«ãŒããã©ãŒã¹ãã²ãŒã ãããŸããã
å®éããã®ãããªãã¹ã¯ãŒãã®æ
å ±å®¹éã¯è©äŸ¡ããæå³ããããŸããããªããªãããããã¯äžçš®ã®ããŒãã€ãŸã ã²ãŒã ã¯åã«ãã¹ãŠã®å¯èœãªãã¹ã¯ãŒããä¿åããå
¥åããããã¹ã¯ãŒãã®ã€ã³ããã¯ã¹ã«ãããã¬ãã«ãªã©ã«é¢ããæ
å ±ãååŸããŸãã ããããèå³ãåŒãããã«ãçè«äžã®å®¹éã¯48ããããš13ãããïŒlog
2 24
4ãšlog
2 10
4 ïŒã§ãããšèšããŸãã
ããã§ããå
¥åããããã¹ã¯ãŒãã¯ã©ã®ãããæ£ç¢ºã«åŠçãããŸããïŒ æåã®ã±ãŒã¹ã§ã¯ãå
¥åããããã¹ã¯ãŒãã¯ãŸã£ããå€æããããä¿åããããã¹ã¯ãŒãã®é
åã§åã«æ€çŽ¢ãããŸãã
ã³ãŒãã衚瀺const char* s_passwords[12] = { " ", "BLNK",
2çªç®ã®ã±ãŒã¹ã§ã¯ãã²ãŒã ã¯å°ãè€éã«ãªããæåã«ãã¹ã¯ãŒãã
ãã€ããª10é²ã³ãŒãã«å€æãã
ãŸã ãããã«ããããµã€ãºãæ£ç¢ºã«ååã«çž®å°ãããŸãã ããã«ãããã²ãŒã èªäœã§ãã¹ã¯ãŒãã®ãµã€ãºãååã«æžããããšãã§ããŸãã
ã³ãŒãã衚瀺 uint16 toBCD(const char* pass) { uint16 result = 0; for (int i = 0; i < 4; i++) { result <<= 4; result |= (pass[i] - '0') & 0xF; } return result; } s_passwords[2][32] = { { 0x0000,
æ°åãšæ°å
ã¯ã©ã·ãã¯ããããŠç¡èŠããªãã§ãã ããããã³ãã£ã ãã§ãªããå€ãã®äººããªãªãžãã«ã®ãããªã³ã¹ãªããã«ã·ã£ãããã¬ã€ãããšæããŸãã ã²ãŒã ã®ãã¹ã¯ãŒãã10é²æ°ã®ã·ãŒã±ã³ã¹ã§ãããä»åã¯ããã€ãã®ããŒã¿ããšã³ã³ãŒãããŸãã
ã€ãŸããæéãšã¬ãã«çªå·ã®2ã€ã®å€ããšã³ã³ãŒããããŸãã ãªããªã ãã¹ã¯ãŒãã¯8æ¡ã®é·ãã§ãã 100,000,000ã®çµã¿åããã§ãã²ãŒã ã«ã¯14ã®ã¬ãã«ãš60ã®å¯èœãªæéå€ïŒåèš840ã®ãªãã·ã§ã³ïŒãããããããæŸãã®ã¯é£ãããšä»®å®ã§ããŸãã ããããå®éã«ã¯ããã§ã¯ãããŸããããã®çç±ãç解ããããã«ããŸããã®çæã®åçã調ã¹ãŠã¿ãŸãããã
ãããã£ãŠãæåã«ã²ãŒã ã¯0ã9ã®å€ãæ ŒçŽã§ãã8ã€ã®èŠçŽ ã®é
åãäœæããŸãã次ã«ã0ã9ã®2ã€ã®ã©ã³ãã å€ãçæãããã€ã³ããã¯ã¹2ãš5ã§ãã®é
åã«æžã蟌ãŸããŸããããã¯ã10ãæ³ãšããŠä¿åãããå€ã«è¿œå ãããŸããããã«ãããå¯èœãªãã¹ã¯ãŒãã®æ°ã100åã«ãªãããã¿ãŒã³ã®èå¥ãæããã«è€éã«ãªããŸãã
const uint8 rand0 = rand() % 10; const uint8 rand1 = rand() % 10; char pass[8] = {0, 0, rand0, 0, 0, rand1, 0, 0};
次ã«ãã¬ãã«ã€ã³ããã¯ã¹ããšã³ã³ãŒããããŸãïŒã€ãŸãããã®æ°-1ïŒãã€ã³ããã¯ã¹ã®2ã€ã®æäžäœããããš10ãæ³ãšãã2çªç®ã®å¢åã®åèšãã€ã³ããã¯ã¹7ã«æžã蟌ãŸãã2ã€ã®æäžäœããããšæåã®å¢åã®åèšãã€ã³ããã¯ã¹1ã«æžã蟌ãŸããŸãã
æãæ¥ãŸããã å°ãç°¡åã§ãã10ãæ³ãšããæåã®å¢åã®10ã®åèšã¯ã€ã³ããã¯ã¹0ã«ãåäœã®åèšãš2çªç®ã®å¢åã¯ã€ã³ããã¯ã¹3ã«æžã蟌ãŸããŸããå¢åããŒãã®å Žåãæéã¯ãã®ãŸãŸ10é²æ°ã§æžã蟌ãŸããŸãã ãŸããæ°åã®äžéã¯9ã§ãããããå¯èœãªæ倧æéå€ã¯99ã§ããããæ£çŽãªã60åã§ã¯ãããŸããã
ããŒã¿ã¯èšé²ããããã§ãã¯ãµã ãèšç®ããŠãã¹ã¯ãŒãã®æå¹æ§ãæ€èšŒããŸãã
ããšãã°ãæ®ãã®32åãå«ã13ã¬ãã«ã®ãã¹ã¯ãŒãã®å¡äŸã¯ã96635134ãã§ãã
ãã¹ã¯ãŒãã®éžæã§ã¯ããã§ãã¯ãµã ããšã³ã³ãŒããããããŒã¿ã«é©ããŠããã°ååã§ããããšãæããã«ãªããŸãã 次ã«ããã®è©³çŽ°ãèæ
®ããªãå Žåããã¹ã¯ãŒããéžæãã確çãèšç®ã§ããŸããæ£ç¢ºã«1ïŒ
ïŒåäœãéé¡ã®å¯èœãªå€ã®æ°ã§å²ã£ãå€ïŒ-éåžžã«å€ãã§ãã
ããããããã¯æ®éã®éã§ãïŒ ãŸããç°ãªãããŒã¿ã«ã€ããŠã¯ãåãã§ããããšãå€æããå ŽåããããŸãã æå¹ãªãã¹ã¯ãŒããå€æŽããŠãæåã®4æ¡ã®åèšãåããŸãŸã«ãªã£ãŠããå Žåã¯ãå€æŽããŸãã éåžžã®åã®ååžã¯ãŸã£ããåäžã§ã¯ãªãããã®ãããªåã®æ倧å€ã¯æ±ºããŠ72ãè¶
ããªããšèšãããšãã§ããŸãã
ãã®ãããªåèšã®è©³çŽ°ãèãããšãç·åœ¢åæã§ã¯ãããŒã¿ãšäžèŽãã確çãéåžžã«é«ãããšãããããŸãã ãã®ããããããã¯ãŒã¯äžã®ããŒããã©ãŒã©ã ã§ã¯ãPrince of Persiaã®ãã¹ã¯ãŒããã©ãã ãå·§ã¿ã«éžæããããæãåºãããšãã§ããŸãã
äœçœ®çªå·ã·ã¹ãã
確ãã«å€ãã®äººã
Base64ãš
Base32ã«ç²ŸéããŠããŸãã å®çŸ©äžããããã¯ããããããŒã¹64ãš32ã®äœçœ®çªå·ã·ã¹ãã ã§ãã åçã¯ç°¡åã§ãããããã¹ããªãŒã ãåºå®ãããé·ã®å€ã«åå²ããç¹å®ã®èŸæžã«åŸã£ãŠãã€ã³ããã¯ã¹ãšããŠååŸããå€ã«åŸã£ãŠæåãååŸããŸãã
å€ãã®ãã¹ã¯ãŒãã·ã¹ãã ã¯ããã®ååã«åºã¥ããŠããŸãã ãããŠããã¹ã¯ãŒãçæã¢ã«ãŽãªãºã ãäŸã«æãã次ã®ã²ãŒã ã¯ãã¢ããã³ãã£ãŒã¢ã€ã©ã³ã4ãšããŠç¥ãããäžè¬çãªäººã
ã®é«æ©å人ã®åéºå³¶IVã§ãã
ã²ãŒã ã®ç¶æ
ã«ã¯ãå©çšå¯èœãªã¢ã€ãã ã®ã»ããïŒæ倧12ïŒãèœåïŒæ倧3ïŒãç¹å¥ãªã¢ã€ãã ïŒæ倧6ïŒãåéãããããŒãïŒæ倧8ïŒãåµã®ããå Žæãåæ Œã¬ãã«ã«é¢ããæ
å ±ãå«ãŸããŸãã ããããå®éã«ã¯ãããŒããšç¹å¥ãªãªããžã§ã¯ããé€ããã¹ãŠã«ã€ããŠã1ã€ã®å€ã責任ãè² ã£ãŠããŸã-é²è¡ã®ææšã§ãã ããã¯ãåèŠçŽ ã䜿çšå¯èœãªã¢ã€ãã ãèœåãªã©ã«é¢ããæ
å ±ãæ ŒçŽããé
åå
ã®ã€ã³ããã¯ã¹ã§ãã ç°¡åã«èšãã°ããªããžã§ã¯ããèœåãããã³å®äºããã¹ããŒãžã®ã»ãããå®çŸ©ããã®ã¯ãã®ãã€ãã§ãã
ã¢ã«ãŽãªãºã ã®æåã®ã¹ãããã¯ã4ãã€ãã®é
åãäœæããããšã§ãã é²è¡ç¶æ³ã®å€ã¯æåã®ãã€ãã«æžã蟌ãŸããŸãã èå³æ·±ãããšã«ãç¹å®ã®å€ã®ã¿ãèš±å¯ãããŠããŸãã
2çªç®ã®ãã€ãã«ã¯ã䜿çšå¯èœãªç¹å¥ãªã¢ã€ãã ã®ãã¹ã¯ãèšé²ãããŸã-ãã€ãã®æäžäœ6ãããã æ®ãã®äžäœ2ãããã«ã¯ã1ã«çããå®æ°ãæžã蟌ãŸããŸãã ããã¯ãã¹ã¯ãŒã圢åŒã®ããŒãžã§ã³ã ãšæããŸãã ãŸããå
¥åããããã¹ã¯ãŒãã®ããå³å¯ãªæ€èšŒãç¶ç¶çã«è¡ãããšãã§ããŸãã
åµã眮ãããŠããå Žæã®ã€ã³ããã¯ã¹ã¯ã3çªç®ã®ãã€ãã«æžã蟌ãŸããŸãïŒãã¬ã€ããªãã£ã人ã®ããã«ãäžçš®ã®ãã§ãã¯ãã€ã³ãïŒã åµãã©ãã«ãã€ã³ã¹ããŒã«ãããŠããªãå Žåãå€ã¯0xFFã§ãã åµã®ããå Žæã®ã€ã³ããã¯ã¹ã¯ãç¹å®ã®å€ã®ã¿ãåãããšãã§ããŸã-åµãã€ã³ã¹ããŒã«ã§ããå Žæã®ã¿ãå«ãŸããŸãã
ãããŠæåŸã«ãåéãããããŒããšããŒãããŒãã®ãã¹ã¯ã4çªç®ã®ãã€ãã«ã³ããŒãããŸãã
const uint8 s_version = 1;
次ã«ããã¹ã¯ãŒãã¯Base32ãšåæ§ã«ãšã³ã³ãŒããããŸãããã¢ã«ãã¡ããããç°ãªããŸãããã®é
åããã5ãããã1ã€ãã€ååŸããã8ã€ã®èŠçŽ ã®é
åã®å¥ã
ã®ãã€ãã«æžã蟌ãŸããŸãã ãã®å Žåãæäœãxorãã䜿çšãããšããã§ãã¯ãµã ãé
åã®æåŸã®ãã€ãã«æžã蟌ãŸããŸãã
6ãã€ãç®ã®ç©ºããããã«ã¯ãã³ãŒãããã¯ã€ã³ããã¯ã¹ãè¿œå ãããŸãã ã²ãŒã ã®éå§æã«ããã®ã€ã³ããã¯ã¹ã¯ã©ã³ãã ã«èšç®ãããŸãïŒ0ã3ã®å€ïŒãã1ã€ã®ããã»ãŒãžå
ã§åžžã«1ã€ã ãã䜿çšãããŸãã ã€ãŸã åããã¹ã¯ãŒãã®4ã€ã®ããªãšãŒã·ã§ã³ããããŸãã
uint8 password[8] = {}; for (var i = 0; i < 7; i++) { password[i] = takeBits(data, 5); password[7] ^= password[i]; } password[6] |= (tableIndex << 3); password[7] ^= password[6];
æçµæ®µéïŒ4ã€ã®Base32ã³ãŒãã£ã³ã°ããŒãã«ã®1ã€ãã€ã³ããã¯ã¹ã«ãã£ãŠååŸãããçµæã®é
åãããã¹ãã«å€æãããŸãã é
åèŠçŽ ã¯æåã€ã³ããã¯ã¹ãšããŠäœ¿çšãããŸãã
const char* s_encodeTables[] = { "3CJV?N4Y0FP78BS1GW2QL6ZM9TR5KDXH", "JT1W9M3DV5?ZKX6GC0FB2SPHR4N8LY7Q", "R0CXM8TWB3G56PKY4FVND7QL2JZ19HS?", "8JWB3PD0?RVG5L2KX4QFZ9TN1S6MH7YC" }; char passwordStr[11] = ""; int index = 0; for (var i = 0; i < 8; i++) { passwordStr[index++] = s_encodeTables[tableIndex][password[i]]; if (i == 3 || i == 5) { passwordStr[index++] = '-'; } }
32
8ã®å¯èœãªãã¹ã¯ãŒããªãã·ã§ã³ããããŸãã é©åãªãã¹ã¯ãŒãã®æ°ãèšç®ããã®ã¯ç°¡åã§ã-ãšã³ã³ãŒããããåå€æ°ã®æå¹ãªå€ã®æ°ãæããã ãã§ãã ãããã£ãŠã26åã®åµã®äœçœ®ã20åã®ç°ãªãé²æå€ãåéãããå¿èã®256ïŒ2
8 ïŒã®çµã¿åãããç¹å¥ãªã¢ã€ãã ã®64ïŒ2
6 ïŒã®çµã¿åãããããã³4ã€ã®ãã¹ã¯ãŒããªãã·ã§ã³ããšã³ã³ãŒãã§ããŸãã åèšïŒ26Ã20Ã256Ã64Ã4 = 34078720ãã¹ã¯ãŒãã ãããã£ãŠããã¹ã¯ãŒããéžæãã確çã¯ã0.03ïŒ
ã§ããå¹³å32,264åã®è©Šè¡ãå¿
èŠã«ãªããŸãã
ã°ã©ãã£ãã¯ã«ãªã¹
å Žåã«ãã£ãŠã¯ãéçºè
ã¯ãªãªãžãã«ã§ãããã°ã©ãã£ãã¯ãã¹ã¯ãŒãã䜿çšããŸãã ããšãã°ãã¡ã¬ãã³ã·ãªãŒãºã®ã²ãŒã ã§ãããã«ééããå¯èœæ§ããããŸãã ãã¡ããããã®ãããªãã¹ã¯ãŒãã®äœ¿ããããã¯çããã-ç¹ã«ç¿æ
£ããã ããããããã¯æ¥æ¬èªã®é·ããã¹ã¯ãŒããšæ¯èŒããŠãäœããããŸãããæ®å¿µãªãããç§ã¯ãã®èšäºã§èª¬æããã®ã«ååãªåŒ·åºŠãæã£ãŠããŸããã§ããã
äŸãšããŠãã²ãŒã Power Blade 2ãåãäžããŸãã4x3ã°ãªããã«é
眮ããã12ã®ããŒãã¹ã¢ã€ã³ã³ã§æ§æããããã¹ã¯ãŒãã䜿çšããŸãã 空çœã®ã¢ã€ã³ã³ãå«ãåèš8ã€ã®ç°ãªãã¢ã€ã³ã³ããããŸãã å®éããã®çš®ã®ã·ã³ããªãã¯ãã¹ã¯ãŒããšã°ã©ãã£ãã¯ãã¹ã¯ãŒãã®éãã¯ããã®èŠçŽ ã®è¡šçŸã«ãããŸããã¢ã€ã³ã³ãã·ã³ãã«ã«çœ®ãæããŠããæ¬è³ªã¯å€ãããŸããã
åã¢ã€ã³ã³ã¯ããã¹ã¯ãŒããå
¥åããéã®è¡šç€ºé åºã«åŸã£ãŠã0ã7ã®æ°åã«å¯Ÿå¿ããŠããŸãã
ã²ãŒã ã«ã¯å®äºããã¬ãã«ãšå©çšå¯èœãªè¡£è£
ã«é¢ããæ
å ±ããä¿åãããŠããŸãããã8åã®
12åã®çµã¿åãããããããšãèšç®ããã®ã¯ç°¡åã§ãã ã©ã³ãã ãªé åºã§å®äºããããšãã§ãã5ã€ã®ã¬ãã«ïŒãã¡ã€ãã«ã¯ã«ãŠã³ãããŸããïŒãããã³4ã€ã®è¡£è£
ã ã€ãŸã ãããã5ããããš4ããããåèš9ãããã ãã¹ã¯ãŒãã®å®¹éã¯12Ãlog
2 8ãã€ãŸã 36ãããã§ååã§ãã
ãã¹ã¯ãŒãã®çæãéå§ãããšãã²ãŒã ã¯éåžžã©ããé
åã圢æããŸãã ä»åã¯ãããããããã¹ã¯ãŒãã»ã«ã«å¯Ÿå¿ãã12åã®èŠçŽ ããçŽã¡ã«ãªããŸãã åã»ã«ã«ã¯3ãããã®å®¹éããããã²ãŒã ã¯2ãããã®å€ãæžã蟌ã¿ããã§ãã¯ãµã ã®æäžäœããããæ®ããŸãã
uint8 pass[12] = {};
次ã«ã6ãããã®ãã§ãã¯ãµã ãèæ
®ãããŸããããã¯ãé
åã®ãã¹ãŠã®èŠçŽ ã®ç®è¡åèšã§ãã ãã®éã¯ãã»ã«ã®äºçŽãããäžäœãããã«ãããåäœã§æžã蟌ãŸããŸãã
uint8 calcChecksum(const uint8* pass) { uint8 checksum = 0; for (int i = 0; i < 12; i++) { checksum += pass[i]; } for (int i = 0; i < 6; i++) { pass[i + 6] |= (checksum >> i) & 1; } }
çµæã¯ããããã次ã®ã¹ããŒã ã§ãã
ããŒã¿ãæºåããããã次ã®ã¹ãããã¯5ã€ã®ããŒãã«ã®ããããã«ããé åã§ãã æå·ã«é¢é£ãããã®ã§ã¯ãããŸãããïŒ æž¡ãããã¬ãã«ã®ãã¹ã¯ã«å¿ããŠãé åããŒãã«ãéžæãããŸãã ããŒãã«ã«ã¯ãæ°ããé åºã«åŸã£ãŠèŠçŽ ã®ã€ã³ããã¯ã¹ãå«ãŸããŸãã
char s_swizzleTableFinal[] = {0, 6, 5, 4, 10, 1, 9, 3, 7, 8, 2, 11}; char s_swizzleTables[][] = { {0, 2, 3, 1, 4, 6, 9, 5, 7, 8, 10, 11}, {8, 2, 3, 6, 10, 1, 9, 5, 7, 0, 4, 11}, {5, 4, 3, 10, 6, 0, 9, 8, 7, 1, 2, 11}, {3, 4, 1, 2, 6, 5, 9, 10, 7, 8, 0, 11} }; void swizzlePassword(uint8* pass, uint8 clearedLevelsMask) { const uint8* swizzTable = (clearedLevelsMask == 0x1F) ? s_swizzleTableFinal : s_swizzleTables[clearedLevelsMask % 4]; uint8 swizzledPass[12] = {}; for (var i = 0; i < 12; i++) { swizzledPass[i] = pass[swizzTable[i]]; } for (var i = 0; i < 12; i++) { pass[i] = swizzledPass[i]; } }
æåŸã®ã¹ãããã¯ãå¢åããŒãã«ã䜿çšããããšã§ãã ã€ãŸã åã»ã«ã¯ã8ãæ³ãšããããŒãã«ã®å¯Ÿå¿ããèŠçŽ ãšåèšãããŸããããã«ãããåãå€ã§ãã£ãŠãã¢ã€ã³ã³ãç°ãªãããšã«ãªããŸãã
void applyIncrementTable(uint8* pass) { for (var i = 0; i < 12; i++) { pass[i] = (pass[i] + s_incrementTable[i]) % 8; } }
æºåãã§ãããã¹ã¯ãŒãããããŸãã ãããŠããã®ãã¹ã¯ãŒãã«ã¯36ãããã®ãã¡15ãããã䜿çšãããŠããããšãããããŸããã
å®éããããã®ãããã¯ããã»ã©äœ¿çšãããŠããŸããã ãã¹ã¯ãŒãã®ãã³ãŒãæé ã§ã¯ãåéãããLããŒãã¹ãšEããŒãã¹ã«é¢ããæ
å ±ãšçŸåšã®çªå·ãååŸããŸãããããããã¹ãŠã®å€ããŒãã«çããããšã確èªããŸãã ãã®ããšãããããšããšãã®æ
å ±ãä¿åããããšãèšç»ãããŠãããšä»®å®ã§ããŸããããããç Žæ£ããããšã«ããŸããã
ãããã²ãŒã ãã¬ã€ã®ãã©ã³ã¹ã®çµæãªã®ããåã«ç¡å¹åãããéçºè
ããŒã«ãªã®ãã¯äžæã§ãã 詳现ã«ã€ããŠã¯ãã¡ãã
ã芧ãã ãã ã
å¯å€é·
èªå®
ã®ã©ããã«ãåäŸã®é ã®äž»ãªRPGã§ãããªãã«ãã³ãžã£ãã©ã¶ãŒãºã®ãã¹ã¯ãŒããæžãããããŒãããã¯ããããŸãã ãã®ã²ãŒã ã¯è¶
èªç¶çãªãã®ã§ã¯ãããŸããããå®æãããŸã§ã«æ°å¹ŽããããŸããã çµå±ãããã¯ç§ã®æåã®RPGã§ãããæåã¯ããã§ãã¹ã€ã³ã°ãããããšãå¯èœã§ããããšããç¥ããªãã£ãã®ã§ããã³ãã䜿ããã«2çªç®ã®ãã¹ãåãã®ã«çŽ6ãæããããŸããïŒäžç·ã«ãã¬ã€ããæ©äŒãããããïŒã
ãã€ãŠããã®ã²ãŒã ã§ãã¹ã¯ãŒãã·ã¹ãã ã®æ§é ãèããããã«ãªããŸãã-äžæ¥äžãã¬ãã®åã«åº§ã£ãŠããã¹ã¯ãŒãã®ãã¿ãŒã³ãæ¢ããçŸåšã®ç¹æ§ãžã®äŸåãå€æããããšããŠããŸããã ãã®çµæã1ã€ã®ãã¹ã¯ãŒããååŸããŠéé¡ãå¢ããããšããã§ããŸãããããããå¯äžã®è¯ãã±ãŒã¹ã§ããã
ãã°ããããŠãç§ã®ITã¹ãã·ã£ãªã¹ãã«ãªãéçšã§ãç§ã¯ãã€ãŠãã®äºä»¶ã«ã€ããŠæãåºããŸããã ãããŠã圌ã¯éåžžã«å¥œå¥å¿ã匷ããé ãæ©ãŸããã®ã奜ãã ã£ãã®ã§ã圌ã¯å€§åŠã®äŒæäžã«ãã¹ã¯ãŒããçæããããã®ã¡ã«ããºã ãå¿
ãèŠã€ããããšã決ããŸããã ä»ã§ã¯1æ¥ã§ååã§ãããã1é±éããããŸããããããã§ãç®æšã¯éæãããŸããã
ãã®ã±ãŒã¹ã¯ããã¹ã¯ãŒãã®é·ããå¯å€ã§ãããšããçç±ã ãã§ã以åã®ã±ãŒã¹ãããèå³æ·±ããã®ã§ããã²ãŒã ãé²ããã«ã€ããŠãæ°ãããã£ã©ã¯ã¿ãŒãè¿œå ãããŸãã ããã«ããã¹ã¯ãŒãã«ã¯ã以åã®ãã¹ãŠãçµã¿åããããã®ãããã¯ããã«å€ãã®ããŒã¿ãä¿åãããŸãã ã¹ã¯ãªãŒã³ã·ã§ãããããããããã«ãã¢ã«ãã¡ãããã¯32æåã§ããã¹ã¯ãŒãã®æ倧é·ã¯54æåã§ãã ããã«ããã32
54åã®æ倧é·ã®ãã¹ã¯ãŒããåŸãããŸããå¯å€é·ãèæ
®ãããšã32
1 + 32
2 + ... + 32
54ãªãã·ã§ã³ããããŸãã æ倧é·ã®1ã€ã®ãã¹ã¯ãŒãã«å¯Ÿå¿ã§ããæ
å ±éãèšç®ãããšã270ãããïŒlog
2 32
54 ïŒã«ãªããŸãã
ããã§ã¯ããã¹ã¯ãŒãã«ã¯ã©ã®ãããªããŒã¿ãä¿åãããŸããïŒ ããã¯RPGã§ãããããå€ãã®ç¹æ§ãããããããã®ã»ãšãã©ãã¹ãŠãä¿åããå¿
èŠããããŸãã
æ©èœãªã¹ãç¹åŸŽïŒ
- æåã¬ãã«ïŒæ倧50ïŒ
- çµéšéïŒæ倧65535ïŒ
- æ倧ãã«ã¹ïŒæ倧255ïŒ
- éé¡ïŒæ倧99999ïŒ
- MããŒãã¹ã®æ°ïŒæ倧6ïŒ
è¡£è£
ïŒ
- åãåã£ãããªãºã ãã«ïŒèµ€ããªã¬ã³ãžãé»è²ãç·ãéãéã玫ïŒ
- å©çšå¯èœãªã¢ãŒãã£ãã¡ã¯ãïŒè§£æ¯å€ã粟ç¥ïŒ
- ã¹ãã©ã€ã¯ã®ã¿ã€ãïŒãéã®çªãããã¯ã©ãã·ã¥ãããŒãããã¡ã¬ã¹ãã©ã€ã¯ããããã¡ã€ã¢ã¹ãã©ã€ã¯ããããã©ã³ãã¹ãã©ã€ã¯ããããŽãŒã«ãã³ã¯ããŒããããªãŒã¹ãã©ã€ã¯ãããããªãºã ã¯ããŒãïŒ
- æ¢åã®å£ïŒãé·¹ã®å£ãããèã®å£ãããeagleã®å£ãããããªãºã ã®å£ãïŒ
- ã·ãŒã«ãïŒããããç¶ãããé¡ãããçãããããªãºã ãïŒ
- ããïŒãçœãããé»ãããããŒããªãŒãããç¥èãªããŒããïŒ
- ã¿ãªã¹ãã³ïŒãαãããβãããγãããÏãããÏãïŒ
- ãå®ãïŒãIãããIIãããIIIãããIVãïŒ
- ã©ã³ãã®çš®é¡ïŒãããããã£ã³ãã«ãããŒãã倪éœã®æ¬ çïŒ
- æè£å£ã®çš®é¡ïŒãã·ã³ã°ã«ãããã·ãªã¢ã«ãããããŒã¡ã©ã³ããããã£ã¯ãµãŒã ïŒç¿»èš³ã§ããŸããïŒ ïŒ
ã¢ã€ãã ãªã©ïŒ
- ãã³ã®æ°ïŒã©ã€ãããŒãªã³ã°ããŒã·ã§ã³ã®ã¢ããã°ãæ倧8åïŒ
- ããŒãããŒã«ã®æ°ïŒåŒ·åãªçãã®ããŒã·ã§ã³ã®ã¢ããã°ãæ倧1åïŒ
- ããªã³ãã¿ãŒã®æ°ïŒåžå
ãžã®ããŒã¿ã«ããŒã¿ã«ãæ倧8åïŒ
- è¬ã®éïŒ2çªç®ã®ãã¬ã€ã€ãŒã埩掻ãããããšãã§ããŸããæ倧1åïŒ
- ã¹ã±ãŒãããŒãã®æ°ïŒæ倧8åãŸã§ãæŠå Žããè±åºã§ããŸããïŒ
- ç匟ã®æ°ïŒæ倧8åïŒ
- ãã©ãã°ã¹ã¿ãŒã¯ãããŸããïŒã¬ãŒã·ã³ã°ã«ãŒã§ãïŒ
- ãã©ãã°ã¹ã¿ãŒçšããããªãŒã®æ°
- äž¡æ¹ã®ãã¬ã€ã€ãŒãå©çšã§ããç¹å¥ãªãããæ°
å®éããã®ããŒã¿ã®ãã¹ãŠãä¿åãããããã§ã¯ãªããä¿åãããŠãããã¹ãŠã®ããŒã¿ããªã¹ããããããã§ããããŸããã 蚪ããéœåžãçŸåšã®å Žæãçºçããã²ãŒã ã€ãã³ãã«é¢ããæ
å ±ãå«ãããã€ãã®ãããã¯èšåãããŠããŸããã ãããã®2ã€ã®å€ã¯çµéšã®éã«çŽæ¥äŸåããåé·ããŒã¿ã§ãããããã¬ãã«ãšæ£åžžæ§ã¯ä¿æãããŸããã ãŸãã2çªç®ã®ãã¬ã€ã€ãŒã®ç¹å¥ãªãããã®æ°ã¯ä¿åãããŸããã åºæ¬çã«ãªãã·ã§ã³ã§ãã
ããã§ã¯ãã©ã®ããã«æ©èœããŸããïŒ ãŸããã²ãŒã ã¯ä¿åããå¿
èŠã®ããå€æ°ã®ãã€ããžã®ãã€ã³ã¿ãŒã®é
åãä¿åããŸãã ãããã®ãã€ã³ã¿ãŒã«åŸã£ãŠãã²ãŒã ã¯ãã€ãã®é
åã圢æãããã®åŸããšã³ã³ãŒããããŸãã ãã®é
åã¯ã8ãã€ãã®4ã€ã®ã°ã«ãŒãã«åå²ãããŸãïŒæåŸã®ã°ã«ãŒãã§ã¯6ãã€ãïŒã
const char s_groupsBytes[4] = {8, 8, 8, 6}; const char* s_passDataMap[30] = {
ãã¹ã¯ãŒããã§ããã ãã³ã³ãã¯ãã«ããããã«ããã¹ãŠã®ãã«å€ã¯ç¡èŠãããŸãã ãã®ç®çã®ããã«ãé
åã®4ã€ã®ã°ã«ãŒãããšã«éãŒãå€ã®ãã¹ã¯ãã³ã³ãã€ã«ãããŸãã1ãã€ãã§ã¯ãiçªç®ã®ããããé
åã®içªç®ã®èŠçŽ ããã¹ã¯ãŒãã«å«ãããã©ããã瀺ããŸãã 圢æãããé
åã§ã¯ããã®ãã¹ã¯ã¯å¯Ÿå¿ããã°ã«ãŒãã®åã«ç§»åããŸãã
uint8 valuesMask(const uint8* data, int group) { uint8 valuesMask = 0; const int startIndex = group * 8; for (int i = startIndex + s_groupsBytes[group] - 1; i >= startIndex; i--) { valuesMask <<= 1; if (data[i] != 0) { valuesMask |= 1; } } return valuesMask; }
ãã¹ãŠã®ã°ã«ãŒãå€ããŒãã«çããå ŽåãæåŸã«åãæäœãã°ã«ãŒãã«é©çšãããŸãã4ãããã®ãã¹ã¯ïŒãã€ãã®äžäœ4ãããïŒããããiçªç®ã®ãããïŒäžäœããäžäœïŒã¯ãã¹ã¯ãŒããå«ãŸããããšã瀺ããŸããé
åã®içªç®ã®ã°ã«ãŒãã ãã®ãã¹ã¯ã¯ããããã®ã°ã«ãŒãã®çŽåã®ããããŒã«æžã蟌ãŸããŸãã
ããã«ãé
åã®åãã€ãããã®æå¹ãããæ°ã«å¯Ÿå¿ããé·ãããŒãã«ããããŸãã ã€ãŸã ãã®çµæãé
åã®ãã€ãå
šäœããšã³ã³ãŒãããããå€ã®ãããã®ã¿ã䜿çšãããŸãã åãææ³ããŒã以å€ã®å€ã®ãã¹ã¯ã«ãé©çšãããŸãã䜿çšããããã¹ã¯ãããã®æ°ã¯ãã°ã«ãŒãå
ã®ãã€ãæ°ã«å¯Ÿå¿ããŸãã
æçµçã«çæãããé
åã¯ããããã¹ã¿ãã¯ã«é¡äŒŒããŠããŸããå€æ°ã¯ãå眮眮æãã«ãã£ãŠè¿œå ãããŸãã
const char s_bitLengths[] = { 8, 7, 8, 8, 8, 8, 1, 7, 8, 2, 3, 4, 4, 2, 4, 2, 3, 4, 3, 4, 3, 1, 3, 1, 3, 4, 3, 4, 4, 1 }; void pushBits(uint8* data, uint8 value, int bitCount) { shiftRight(data, bitCount); writeBits(data, value, bitCount); }
次ã«ãããããŒã®äžçš®ã§ãã4ãã€ããé
åã®å
é ã«è¿œå ãããŸãã
ãã§ãã¯ãµã ããã¹ã¯ãŒãã«å«ãŸããã°ã«ãŒãã®ãã¹ã¯ãããã³å¢å-32ãæ³ãšããæåã®å€ã«è¿œå ããã0ã31ã®8ãããã©ã³ãã å€ãæ ŒçŽãããŸããæåã«ãå¢åãããããŒã®æåŸã«æžã蟌ãŸããããããŒã®æåŸã®ãã€ãããå§ãŸããŸãããã§ãã¯ãµã ãèæ
®ãããŸããããã¯ãèŠçŽ ã®åèšã«ã·ãªã¢ã«çªå·ãæãã20ãããã®ããã·ã¥ã§ãã uint32 calcChecksum(uint8* data, int count) { uint32 sum = 0; for(int i = 0; i < count; i++) { sum += data[i] * (i + 1); } return sum; }
ãã®åŸãåã®å Žåãšåæ§ã«ãããŒã¿ã¯Base32ãšåæ§ã«ãšã³ã³ãŒããããŸãããã®å Žåãæåã«ããã§ãã¯ãµã ã®ããããŒãšãã¹ã¯ãŒãã«å«ãŸããã°ã«ãŒãã®ãã¹ã¯ã®äžäœ4ããããå¥ã
ã«ãšã³ã³ãŒãããã次ã«å¢åãå¥ã®ãã¹ã¯ãŒãã·ã³ãã«ã§æžã蟌ãŸãããã®åŸã«ã®ã¿ä»ã®ãã¹ãŠã®ããŒã¿ããšã³ã³ãŒããããŸãã uint8 password[54] = {}; uint8* header = encodedData; uint8* body = &encodedData[4];
å¢åå€ã¯çµæã®å€ã«é©çšãããŸãããã ããã·ã³ãã«èªäœã¯äŸå€ã§ãå€èªäœãä¿åãããŸãã
ãããŠå®éãæçµæ®µéïŒã¢ã«ãã¡ãããé ã®ããã¹ããžã®å€æã const wchar_t* s_passwordCharTable = L"âBCD\u25a0FGH+JKLMN\u25cfPQRST\u25b2VWXYZ234567"; for (int i = 0; i < charCount; i++) { std::cout << s_passChars[password[i]]; if (i % 6 == 5) { std::cout << ' '; } }
ã²ãŒã ã§ã®ã¢ã«ãŽãªãºã ã®å®è£
ã®æ©èœã«ã€ããŠå°ãNES , , , . , «» .
: , ( «Base32») 4- . .
, , 9 ( ) â 8 + . , , .. 18-, , . , , .
0x12 (, 4 ), , . ãªããªã , , .
uint8 data[32] = {}; for (int index = 0; index < 34; index++) { register = index; if (register == 0 && !(mask & 0x80)) { register = 9; index = register; } if (register == 9 && !(mask & 0x40)) { register = 18;
, . ? , , , , , 3- , ( ), , , .
- , , ! : , . â , .
ããŒãã¹ãšããŠ
JavaScriptã®æ奜家ã¯ãã¢ããã³ãã£ãŒã¢ã€ã©ã³ã4ïŒé«æ©å人ã®åéºå³¶ IVïŒãšPower Blade 2ã®èšäºã®ããã«ç¹å¥ã«æžããããã¹ã¯ãŒããžã§ãã¬ãŒã¿ãŒãããã³ã»ãŒ5幎åã®ãªãã«ãã³ãžã£ãã©ã¶ãŒãºçšã®ãžã§ãã¬ãŒã¿ãŒã®é«è²ŽãªããŒãžã§ã³ã詳ãã調ã¹ãããšãã§ããŸããå³å¯ã«ã³ãŒããå€æããªããããé¡ãããŸã;ãŠã§ãããã°ã©ãã³ã°ã¯ç§ã®å°éããã¯ã»ã©é ãã§ããããªã³ã¹ãªããã«ã·ã£ã®ãã¹ã¯ãŒããžã§ãã¬ãŒã¿ãŒã¯ãã¡ãã«ãããŸãããããŠå°ãæããã... åç
§è³æ