![](https://habrastorage.org/storage2/b52/27e/1e5/b5227e1e575ca5d6dfbee7ff425c3854.jpg)
æ£ãçªãåºãŠããã çç¶ã®ç¶æ ã¯ãéãã»ãšãã©äžæ»èº«ã«ããŸãã ãã ããååã«å€§ããªæé£è ããã®ãããªããŒã«ã飲ã¿èŸŒãããšãããšãã¹ã¿ãã¯ããŸã
åŸã«æ»ã¬æé£è ã®ã®ã©ã«ã
ãŠã£ãããã£ã¢ãç¡æââã®çŸç§äºå žã
1993幎æ«ãŸã§ã«ãæå·ã®äžçã§ã¯éåžžã«åä»ãªç¶æ³ãçºçããŸããã DES察称æå·åã¢ã«ãŽãªãºã ã¯ã匱ã56ãããããŒã§ã倧倱æã«è¿ããæ¢åã®ãã®ã
åœæãã¯ããREDOC IIãIDEAãªã©ã®ä»£æ¿åã¯ç¹èš±ã«ãã£ãŠä¿è·ãããŠããŸãã
ç¡æã§äœ¿çšããããšã¯ã§ããŸããã åœæRSA Securityã«ãã£ãŠéçºãããRC2ããã³RC4ã¢ã«ãŽãªãºã ã«ã¯ãã©ã€ã»ã³ã¹ããã»ã¹ãå¿ èŠã§ããã ãããŠäžè¬çã«ãæ¿åºæ©é¢ã倧äŒæ¥å ã®æå·åæ¥çã¯
Skipjackãªã©ã®ç§å¯ã®ã¢ã«ãŽãªãºã ã䜿çšããããã«ãªããŸããã
äžå®ã®ç空ããããŸããã æ»ã«ãããŠããDESãããæå·åãããæå·åã¢ã«ãŽãªãºã ãå¿ èŠã§ããããåæã«ããã䜿çšããæš©å©ã«å¶éã¯ãããŸããã§ããã
ãããŠåœŒã¯çŸããŸããã
1994幎ãã±ã³ããªããžã®Fast Software Encryptionã¯ãŒã¯ã·ã§ãããããã³ãã®åŸã®ã³ã³ãã¥ãŒã¿ãµã€ãšã³ã¹ã®ã¬ã¯ãã£ãŒããŒãïŒïŒ809ã1994ïŒã§ãBruce Schneierã¯ãBlowfishãšããååã®ãããã¯æå·ã¢ã«ãŽãªãºã ãçºè¡šããŸããã
ãã®ã¢ã«ãŽãªãºã ã®ç¹åŸŽã¯ãDESãããé«åºŠãªæå·åå®å®æ§ïŒæ倧448ãããã®å¯å€ããŒé·ã®äœ¿çšãå«ãïŒãé«ãæå·å/埩å·åé床ïŒçœ®æããŒãã«ã®çæã«ããïŒããããŠãã¡ãããç®æšã
1994幎ã®Bruce Schneierã«ããã¢ãŒã«ã€ãã®ãªãªãžãã«èšäºïŒ
ãããã¯æå·IIããã«ãŒã¹ã·ã¥ãã€ã¢ãŒïŒããŒãžã®äžéšïŒïŒ
æ°ããå¯å€é·ããŒã®èª¬æã64ããããããã¯æå·ïŒBlowfishïŒã 191-204
ãŸãã¯PDF
ã¯ããã«
BlowFishã¯ãå¯å€é·ããŒã䜿çšãã64ããããããã¯æå·ã¢ã«ãŽãªãºã ã§ãã ããã¯ã1993幎ã«æå·åãšæ å ±ã»ãã¥ãªãã£ã®åéã§æåãªå°é家ã§ããBruce Schneierã«ãã£ãŠéçºãããŸããã
äžè¬çãªå Žåãã¢ã«ãŽãªãºã ã¯2ã€ã®æ®µéã§æ§æãããŸã-ããŒã®æ¡åŒµãšãœãŒã¹ããŒã¿ã®æå·å/埩å·åã
![](https://habrastorage.org/storage2/174/07a/354/17407a3541a3d56c7b10ef315d358b89.png)
ããŒæ¡åŒµã®æ®µéã§ãå ã®ããŒã¯ã©ãŠã³ãããŒã®è¡åïŒPïŒã«å€æãããŸãã
åèš4168ãã€ãã®çœ®æãããªãã¯ã¹ïŒSã眮æããã¯ã¹ïŒïŒãŸãã¯çœ®æïŒã ããããããã®ãæ¡åŒµåãïŒ448ããããã4168ãã€ãïŒãååã®éžæã説æããŠããŸã
Blowfishã¢ã«ãŽãªãºã ã
ããŒã¿æå·åãããã³ã©ãŠã³ãããŒãšçœ®æã®ãããªãã¯ã¹ã®äœæã¯ãFeistelãããã¯ãŒã¯ã䜿çšããŠè¡ãããŸããFeistelãããã¯ãŒã¯ã¯16ã©ãŠã³ãã§æ§æãããŠããŸãã ãããã£ãŠãããŒæ¡åŒµãšããŒã¿æå·åã®æ®µéã詳现ã«æ€èšããåã«ãåè¿°ã®Feistelãããã¯ãŒã¯ãäœã§ãããã決å®ããå¿ èŠããããŸãã
ãã®ããã»ã¹ã§ã¯ãC ++ã®Blowfishã¢ã«ãŽãªãºã ã«åŸã£ãŠãšã³ã³ãŒããŒã®ããã°ã©ã ã³ãŒããå®è£ ããŸãã é«ã¬ãã«èšèªïŒC / C ++ / Haskell / Perl / ...ãªã©ïŒã®æ¢è£œã®å®è£ ãããŒãžã§å©çšå¯èœ
ãã«ãŒã¹ã»ã·ã¥ãã€ã¢ãŒã®ãµã€ãã«ãœãŒã¹ã³ãŒãããããŸãã
Feistel Network
1971幎ãDES Corporationã®ããŽãããã¡ãŒã¶ãŒãã§ããIBM Corporationã®Horst Feistelã¯ãåŸã«äžè¬åãLuciferããšåŒã°ããããŸããŸãªæå·åã¢ã«ãŽãªãºã ãå®è£ ãã2ã€ã®ããã€ã¹ãéçºããŸããã ãããã®ããã€ã¹ã®1ã€ã§ã圌ã¯åŸã«Feistel NetworkãšåŒã°ããåè·¯ã䜿çšããŸããã ãã®ãããã¯ãŒã¯ã¯ãFeistelã»ã«ãšåŒã°ããç¹å®ã®ç¹°ãè¿ãïŒç¹°ãè¿ãïŒæ§é ã§ãã
![](https://habrastorage.org/storage2/6bc/382/716/6bc38271606fa8df1362129e3cd2c495.png)
ãããã¯ãŒã¯ã®åçã¯éåžžã«ç°¡åã§ãã
- ãœãŒã¹ããŒã¿ã¯ãåºå®é·ã®ãããã¯ã«åå²ãããŸãïŒéåžžã2ã®çŽ¯ä¹ã®åæ°-64ãããã128ãããïŒã ãœãŒã¹ããŒã¿ã®ãããã¯ã®é·ããæå·ã®ãããé·ãããçãå Žåããããã¯ã¯äœããã®æ¢ç¥ã®æ¹æ³ã§è£å®ãããŸãã
- ãããã¯ã¯ããå·ŠãL 0ãšãå³ãR 0ã® 2ã€ã®çãããµããããã¯ã«åå²ãããŸã ã
64ããã容éã®å Žåããããã32ãããã®é·ããæã€2ã€ã®ãããã¯ã
- ãå·Šãµããããã¯ãL 0㯠ãããŒP 0ã«å¿ããŠãå埩é¢æ°F ïŒL 0 ãP 0 ïŒã«ãã£ãŠå€æŽãããŸãã
ãã®åŸããå³ãµããããã¯ãR 0ãšã¢ãžã¥ã2ïŒXORïŒãè¿œå ãããŸã ã
- å ç®ã®çµæã¯ã次ã®ã©ãŠã³ãã®å
¥åããŒã¿ã®å·Šååã«ãªãæ°ããå·Šãµããããã¯L 1ã«å²ãåœãŠããããå·Šãµããããã¯ãL 0㯠ãå³ååã«ãªãæ°ããå³ãµããããã¯R 1ã«å€æŽãªãã§å²ãåœãŠãããŸãã
- ãã®æäœã¯ãããã¹ããŒãžããå¥ã®ã¹ããŒãžã«ç§»åããªããn-1åç¹°ãè¿ãããã©ãŠã³ãããŒïŒP 0 ãP 1 ãP 2ãªã©ïŒãå€åããŸããnã¯ã䜿çšãããã¢ã«ãŽãªãºã ã®ã©ãŠã³ãæ°ã§ãã
埩å·åããã»ã¹ã¯ãã©ãŠã³ãããŒãéã®é åºã§äœ¿çšãããããšãé€ããŠãæå·åããã»ã¹ã«äŒŒãŠããŸãã
Blowfishã¢ã«ãŽãªãºã ã«æ»ããŸãã
äžè¬ã«ãBlowfishæå·åã¢ã«ãŽãªãºã ã¯Feistelãããã¯ãŒã¯ã§ãããã©ãŠã³ãããŒãçæããã³äœ¿çšããããã€ãã®æ©èœãåããŠããŸãïŒP 0 ãP 1 ...ïŒã
ãŸããBlowfishã¢ã«ãŽãªãºã ã®å埩é¢æ°Fã¯ãå ¥åãåãåã£ãŠ32ãããæ°ïŒDWORDïŒãåºåããããã©ãã¯ããã¯ã¹ãã®ãããªãã®ã ãšããŸãããã
ãã®å Žåã32ãããã®ã©ãŠã³ãããŒPnïŒ
- ãœãŒã¹ããŒããã®èŠåã«åŸã£ãŠèšç®ãããŸãïŒæ倧448ãããé·ïŒã
- å埩é¢æ°Fã®åŒæ°ã§ã¯ãããŸããã
- ãå·Šãããã¯ãã«ã¢ãžã¥ã2ïŒXORïŒãçŽæ¥è¿œå ããŸãã
ãã®æäœã®çµæã¯ãé¢æ°Fã®çä¿¡32ãããåŒæ°ã§ãã
![](https://habrastorage.org/storage2/9d7/ec8/87f/9d7ec887fa50737170f8e0811ecb1e9c.png)
Blowfishã¢ã«ãŽãªãºã ã§ã¯ãæå·åäžã«ïŒFeistelãããã¯ãŒã¯å ã§ïŒ16ã©ãŠã³ããå®è¡ãããæåŸã®ã©ãŠã³ãã®å·Šå³ã®åºåãããã¯ã«17çªç®ãš18çªç®ã®ããŒãè¿œå ãããŸãã å¯èœãªããŒã®é·ãã決å®ããããããã®ã©ãŠã³ãæ°ãéžæãããŸããã
ããããããã§æ³šææ·±ãèªè ã¯çåãæ±ããããããŸããïŒãããã32ãããã®é·ããæã€18åã®ã©ãŠã³ãããŒã䜿çšãããå Žåãæçµçã«576ãããïŒ18ããŒÃ32ãããïŒã®é·ãã®ããŒãååŸããŸãã Blowfishã®ãœãŒã¹ããŒã®é·ããæåã¯448ãããã«å¶éãããŠããã®ã¯ãªãã§ããïŒ
çãã¯ç°¡åã§ã-å¶éã¯ãããŸããã 576ããããŸã§ã®ããŒã䜿çšã§ããŸãã ãããïŒ ãã®å¶éã¯ãã¢ã«ãŽãªãºã ã®ã»ãã¥ãªãã£ãšæå·ã®å®å®æ§ã芳å¯ããããã®èŠä»¶ã«åºã¥ããŠè¡ãããŸããã
C ++ã§Blowfishã¢ã«ãŽãªãºã ã®Feistelãããã¯ãŒã¯ãå®è£ ããŸãããã
void swap(unsigned long *a, unsigned long *b) { unsigned long temp; if (a && b) { temp = *a, *a = *b, *b = temp; } } void blowfish_encrypt_block(blowfish_ctx *ctx, unsigned long *high, unsigned long *low) { int i; for (i = 0; i < 16; i++) { *high ^= ctx->p[i]; *low ^= F(ctx, *high); swap(low, high); } swap(low, high); *low ^= ctx->p[16]; *high ^= ctx->p[17]; }
ããŒæ¡åŒµïŒçç ŽïŒïŒ
Blowfishã¢ã«ãŽãªãºã ã®æºå段éã¯ãéèŠãªæ¡åŒµæ®µéã§ãã ãã®æ®µéã®ããã»ã¹ã§ã¯ãã©ãŠã³ãããŒã®ãããªãã¯ã¹Pnãšçœ®æãããªãã¯ã¹ãæ§ç¯ãããŸããããããã256åã®32ãããèŠçŽ ã§æ§æããã4ã€ã®Sããã¯ã¹ïŒçœ®æããã¯ã¹ïŒçœ®æãããã¯ã§ãã
![](https://habrastorage.org/storage2/0ce/91a/46b/0ce91a46bcef6f3e9c70d63c4e611819.png)
ãããã®è¡åã®èŠçŽ ã¯ãBlowfishã¢ã«ãŽãªãºã ã«ã€ããŠåè¿°ããFeistelãããã¯ãŒã¯ã䜿çšããŠæå·åïŒèšç®ïŒãããŸãã ãããã£ãŠãBlowfishã¢ã«ãŽãªãºã ã®Feistelãããã¯ãŒã¯ã䜿çšãããŸãã
- ãœãŒã¹ããŒã¿ã®æå·å/埩å·åã
- ã©ãŠã³ãããŒãããªãã¯ã¹ãšçœ®æãããªãã¯ã¹ãçæããŸãïŒã€ãŸããããŒæ¡åŒµïŒã
çæãããã©ãŠã³ãããŒãããªãã¯ã¹ãšçœ®æãããªãã¯ã¹ã¯ããã®åŸäœ¿çšãããŸã
æå·å/埩å·åã®éçšã§ã
ããŒæ¡åŒµããã»ã¹ãåŠçãããŸã
18Ã32ïŒP 1 ãP 2 ...ïŒ+ 4Ã256Ã32ïŒS 1 âS 4 ïŒ= 33344ããããŸãã¯4168ãã€ãã®ããŒã¿ã
ãã®å ŽåãïŒ18ïŒPnïŒ+ 4Ã256ïŒS 1 âS 4 ïŒïŒ/ 2 = 521ãFeistelãããã¯ãŒã¯ã®å®å šãªå埩ã«å¯ŸããŠå®è¡ãããŸãã
ããã¯ãã¹ãŠéåžžã«æéããããæäœã§ããããããBlowfishã¢ã«ãŽãªãºã ã®çç±ã§ã
é »ç¹ã«ããŒãå€æŽããå¿ èŠãããå Žåã¯ãå§ãããŸããã
ããŒæ¡åŒµã¢ã«ãŽãªãºã ã«ã€ããŠèª¬æããŸãã
- ãèª å®ãªçªå·ããéžæããŸãïŒãŸãã¯ããè¢ã®çªå·ãäžããªããïŒã ããã¯ãæåã¯ç¹°ãè¿ãã·ãŒã±ã³ã¹ãå«ãŸãªãæ¢ç¥ã®æ°å€ã§ãã ããã¯ãããšãã°ã¢ã«ãŽãªãºã ïŒããã¯ãã¢ïŒã«æãç©Žãäœæãããªã©ããæªæã®ãããç®æšãè¿œæ±ããã«éçºè
ãå®æ°ãéžæããããšã瀺ãããã«è¡ãããŸãã
Blowfishã¯éåžžãPIçªå·ãèª å®ãªçªå·ãšããŠäœ¿çšããŸãã PIçªå·ã®å€ã®16é²è¡šçŸã¯èšç®ããŸããããæ¢è£œã®ãœãªã¥ãŒã·ã§ã³ã䜿çšããŸãïŒ PIçªå·ã®ä»®æ°ã®8366æ¡ã®16é²æ° ã
- PIçªå·ã®ä»®æ°ã®å€ã¯ãã©ãŠã³ãããŒã®ãããªãã¯ã¹ïŒFIXED_PïŒããã³çœ®æãããªãã¯ã¹ïŒFIXED_SïŒãåããããã«äœ¿çšãããŸãã
typedef struct _blowfish_ctx { unsigned long p[18]; unsigned long sbox[4][256]; } blowfish_ctx; const unsigned int FIXED_S[4][256] = { { 0xD1310BA6, 0x98DFB5AC, 0x2FFD72DB, 0xD01ADFB7, 0xB8E1AFED, 0x6A267E96, 0xBA7C9045, 0xF12C7F99, 0x24A19947, 0xB3916CF7, 0x0801F2E2, 0x858EFC16, 0x636920D8, 0x71574E69, 0xA458FEA3, 0xF4933D7E, 0x0D95748F, 0x728EB658, 0x718BCD58, 0x82154AEE, 0x7B54A41D, 0xC25A59B5, 0x9C30D539, 0x2AF26013, .... .... 0xB74E6132, 0xCE77E25B, 0x578FDFE3, 0x3AC372E6 } }; const unsigned long FIXED_P[] = { 0x243F6A88, 0x85A308D3, 0x13198A2E, 0x03707344, 0xA4093822, 0x299F31D0, 0x082EFA98, 0xEC4E6C89, 0x452821E6, 0x38D01377, 0xBE5466CF, 0x34E90C6C, 0xC0AC29B7, 0xC97C50DD, 0x3F84D5B5, 0xB5470917, 0x9216D5D9, 0x8979FB1B };
- åã©ãŠã³ãããŒPnïŒP 1 ãP 2 ...ïŒã®å€ã¯ãå
ã®ããŒKã®å¯Ÿå¿ããèŠçŽ ãšã¢ãžã¥ã2ïŒXORïŒã§å ç®ãããŸããããšãã°ãã©ãŠã³ãããŒP 1ã® XOR
å ã®ããŒKã®æåã®32ãããã䜿çšããŠãå ã®ããŒKã®2çªç®ã®32ãããã䜿çšããŠP 2ã®ããã«ãªããŸãã å ã®ããŒKããã¹ãŠã®ã©ãŠã³ãããŒã®é·ãïŒ576ãããïŒãããçãå Žåã¯ãããèªäœãé£çµããŸãã
ããªããšïŒKKãKKKãªã©ã
for(i = 0, k = 0; i < 18; i++) { for(j = 0, long_key = 0; j < 4; j++, k++) { long_key = (long_key << 8) | key[k % key_len]; } ctx->p[i] ^= long_key; }
- 次ã«ãã©ãŠã³ãããŒã®è¡åãšçœ®æè¡åã®èŠçŽ ãæå·åïŒæ°ããå€ãèšç®ïŒããå¿
èŠããããŸãã ãããè¡ãã«ã¯ãå®è£
ããBlowfishã®Feistelãããã¯ãŒã¯ã¢ã«ãŽãªãºã ã䜿çšããŸãã
- çŸåšã®ã©ãŠã³ãããŒP 1ãP 18ãšçœ®æè¡åS 1ãS 4 ïŒçœ®æè¡åã«ã€ããŠã¯ä»¥äžã§æ£ç¢ºã«èª¬æããŸãïŒã䜿çšããŠã64ãããã®ãŒãã·ãŒã±ã³ã¹0x00000000 0x00000000ãæå·åããP 1ãšP 2ã«çµæãæžã蟌ã¿ãŸãã ã
- P 1ãšP 2ã¯ãã©ãŠã³ãããŒãšçœ®æè¡åã®å€æŽãããå€ã§æå·åãããçµæã¯ããããP 3ãšP 4ã«æžã蟌ãŸããŸãã
- æå·åã¯ããã¹ãŠã®ã©ãŠã³ãããŒP 1ãP 18ããã³çœ®æè¡åS 1ãS 4ã®èŠçŽ ãå€æŽããããŸã§ç¶ããŸãã
ã€ãŸã æçµçã«ãïŒ18 Pn + 4Ã256ïŒS 1 âS 4 ïŒïŒ/ 2 = 521ã®ç¹°ãè¿ãã«å¯ŸããBlowfishã¢ã«ãŽãªãºã ã®Feistelãããã¯ãŒã¯èšç®ã®çµæãååŸããå¿ èŠããããŸãã å埩ããšã«ãã©ãŠã³ãããŒã®è¡åãŸãã¯é åã®è¡åã®èŠçŽ ã«å¯ŸããŠ2ã€ã®æ°ããå€ãããã«èšç®ããããã2ã§å²ã£ãã
for (i = 0, k = 0, l = 0; i < 18; i++) { blowfish_encrypt_block(ctx, (unsigned long*)&k, (unsigned long*)&l); ctx->p[i] = k; ctx->p[++i] = l; } for (i = 0; i < 4; i++) { for (j = 0; j < 256; j++) { blowfish_encrypt_block(ctx, (unsigned long*)&k, (unsigned long*)&l); ctx->sbox[i][j] = k; ctx->sbox[i][++j] = l; } }
- çŸåšã®ã©ãŠã³ãããŒP 1ãP 18ãšçœ®æè¡åS 1ãS 4 ïŒçœ®æè¡åã«ã€ããŠã¯ä»¥äžã§æ£ç¢ºã«èª¬æããŸãïŒã䜿çšããŠã64ãããã®ãŒãã·ãŒã±ã³ã¹0x00000000 0x00000000ãæå·åããP 1ãšP 2ã«çµæãæžã蟌ã¿ãŸãã ã
ãã®æç¹ã§ãBlowfishã¢ã«ãŽãªãºã ã®æºå段éïŒããŒã®æ¡åŒµïŒãå®äºããŸããã ããããæå·å/埩å·å段éãèŠãåã«ãBlowfishã¢ã«ãŽãªãºã ã®Feistelãããã¯ãŒã¯ã®å埩å ã§åã©ãŠã³ãã§å®è¡ãããããã©ãã¯ããã¯ã¹ã -é¢æ°FãéããŠã¿ãŸãããã
![](https://habrastorage.org/storage2/b6d/f68/863/b6df68863b71046e42c60e39a0fddc73.png)
å埩ïŒã©ãŠã³ãïŒé¢æ°
ã©ãŠã³ãé¢æ°ãŸãã¯å埩é¢æ°ïŒäœ¿çšãããFeistelãããã¯ãŒã¯å šäœã«å ±éã§ããããïŒã¯éåžžã«åçŽã§ããã眮æè¡åã«å¯ŸããŠããã€ãã®è«çæŒç®ã®ã¿ã䜿çšããŸãã åœåãHorst Feistelã¯Luciferã®éçºæã«ãé åã®è¡åã«åçŽãªç·åœ¢åè·¯ãåããé»åãŠãããã®äœ¿çšãæ³å®ããŠããŸããã
![](https://habrastorage.org/storage2/943/81f/7e9/94381f7e90f5ac53644465619f78baeb.png)
ã ããïŒ
- çä¿¡32ããããããã¯ã¯4ã€ã®8ããããããã¯ã«åå²ãããŸããããããX 1 ãX 2 ãX 3 ãX 4ãšåŒã³ãŸããã
ïŒäžã®å³ãåç §ïŒã
- ããããã¯ã眮æããŒãã«S 1ãS 4ã®é åã®ã€ã³ããã¯ã¹ã§ãã
- S 1 [X 1 ]ãšS 2 [X 2 ]ã®å€ã2 32ãæ³ãšããŠå ç®ãããçµæãå ç®ãããŸã
2ïŒXORïŒãšS 3 [X 3 ]ãæ³ãšããæåŸã«S 4 [X 4 ]ã2 32ãæ³ãšããŠåèšããŸãã - èšç®ã®çµæã¯ãé¢æ°FïŒX 1 -X 4 ïŒã®å€ã«ãªããŸãã
é¢æ°åŒïŒ
![](https://habrastorage.org/storage2/d3a/659/ed5/d3a659ed5486de345c5eaf856bdc68ea.png)
ãã¹ãŠãéåžžã«ç°¡åã§ãã ãã®é¢æ°ã¯ãS 1ãS 4眮æãããªãã¯ã¹ã䜿çšããŠãçä¿¡32ãããã®ããŒã¿ã眮æãããªãã¯ã¹ããã®å€ã«ç·åœ¢ã«å€æããŸãã ãããŠæå³èªäœ
ãããªãã¯ã¹ã§ã¯ã眮æã¯ä»¥åã«æ€èšããäž»èŠãªæ¡åŒµæ®µéã§èšç®ãããŸãã
C ++ã§ã®é¢æ°ã®å®è£ ïŒ
unsigned long F(blowfish_ctx *ctx, unsigned long x) { return ((ctx->sbox[0][(x >> 24) & 0xFF] + ctx->sbox[1][(x >> 16) & 0xFF]) ^ ctx->sbox[2][(x >> 8) & 0xFF]) + ctx->sbox[3][(x) & 0xFF]; }
次ã«ããœãŒã¹ããŒã¿ãæå·åããããã»ã¹ã«é²ã¿ãŸãããã
ãœãŒã¹ããŒã¿ã®æå·å/埩å·å
ãµãã©ã€ãºïŒ å®éããœãŒã¹ããŒã¿ã®æå·åããã³åŸ©å·åã¢ã«ãŽãªãºã ã¯ãã§ã«æ€èšæžã¿ã§ãã åé¡ã¯ãæåã«æ°ã¥ããããã«ãããŒã¿ã®æå·å/埩å·åãããã³åè¿°ã®ã©ãŠã³ãããŒã®ãããªãã¯ã¹ãšçœ®æãããªãã¯ã¹ã®äœæããBlowfishã¢ã«ãŽãªãºã ã«èæ ®ãããFeistelãããã¯ãŒã¯ã䜿çšããŠè¡ãããããšã§ãã
ã€ãŸã ãœãããŠã§ã¢ã®å®è£ ã§ã¯ããœãŒã¹ããŒã¿ã®æå·åããã»ã¹å šäœããããŒæ¡åŒµã®æ®µéã§ã®æå·åããã»ã¹ãšã®é¡æšã«ãã£ãŠæ§ç¯ãããŸãã ã€ãŸã ãœãŒã¹ããŒã¿ã®64ãããããšã«blowfish_encrypt_blocké¢æ°ïŒFeistelãããã¯ãŒã¯ã®å®è£ ïŒãç¹°ãè¿ãå®è¡ããããšãè¡šããŸãã ã©ãŠã³ãããŒPïŒP 1 ãP 2 ãhellipïŒããã³çœ®æè¡åS 1ãS 4ã¯ãããããFeistelãããã¯ãŒã¯ããã³ãã®ãããã¯ãŒã¯å ã®é¢æ°Fã®å ¥åãã©ã¡ãŒã¿ãŒã§ãã
![](https://habrastorage.org/storage2/9d7/ec8/87f/9d7ec887fa50737170f8e0811ecb1e9c.png)
ãã®çµæãBlowfishã¢ã«ãŽãªãºã ã§æå·åãŸãã¯åŸ©å·åã¢ã«ãŽãªãºã ãèŠçŽãããšã
ãã®åŸã次ã®æé ãå®è¡ããŸãã
- Feistelãããã¯ãŒã¯ã®ã©ãŠã³ãããŒçšã«18åã®èŠçŽ ã®é
åãšããããã256åã®èŠçŽ ã®4ã€ã®çœ®æè¡åãéžæããŸãã
- éžæããé
åã«PIçªå·ã®ä»®æ°å€ãå
¥åããŸãã
- å埩XORãäœæããŸããPi= Pi XOR KiïŒPiã¯ã©ãŠã³ãããŒãKiã¯ãœãŒã¹ããŒïŒã
- Feistelãããã¯ãŒã¯ã䜿çšããŠã©ãŠã³ãããŒãšçœ®æãããªãã¯ã¹ãæå·åããŸãïŒçœ®æãããªãã¯ã¹ã¯ãããã¯ãŒã¯å
ã®é¢æ°ã®å
¥åãã©ã¡ãŒã¿ãŒãšããŠäœ¿çšããããããã¯ãŒã¯å
ã®ã©ãŠã³ãããŒã¯ã©ãŠã³ãããŒãããªãã¯ã¹ããååŸãããŸãïŒã
- ãŸããFeistelãããã¯ãŒã¯ã䜿çšããŠã64ãããã®ãœãŒã¹ããŒã¿ãããã¯ãæå·å/埩å·åããŸãã
ãŸãšã
芪æãªãèªè ã è€éãªããšãç°¡åãªèšèã§èª¬æããããšã¯éåžžã«å°é£ã§ãã
ãã®ããã¹ããæžãå§ããåã«ãç§ã¯éçºè ã®ä»£ããã«èº«ã眮ããŠã¿ãŸããã
è°è«ããBlowfishã¢ã«ãŽãªãºã ãç 究ããããšãã人ã
ããã§ããã®ã¢ã«ãŽãªãºã ãç解ããã®ã«ååãªå®å šæ§ãåããããã¥ã¡ã³ãããããã¯ãŒã¯äžã§èŠã€ããããšã«ããŸããã ãã®çµæãç§ã¯ãã¡ãããŠã£ãããã£ã¢ã®ããŒãžããã©ãŒã©ã ããããŠããŸããŸãªçšèªéã«å°éããŸããã ããããããã«æ瀺ããã説æãèªããšããã°ãã°çããããå€ãã®è³ªåãçããŸããã
ããããã¹ãŠã®ããšãããäŸãšãšãã«ç°¡åãã€åæã«è©³çŽ°ãªèª¬æãæçšã§ãããéèŠããããšããæèŠã§ç§ã確èªããŸããã ãããã£ãŠãç§ã¯ã§ããéãããã¹ãŠãæ£ã«çœ®ããããšãè©Šã¿ãŸããã ããããç§ã¯ãããã©ãã ãããŸããã£ã-ããªããå€æããŸãã
ããããšã
å¿ãããAB
PSç¶è¡ããäºå®ã§ã...