かせぞの道フグに぀いおシンプルか぀明確

「バギヌの成長はフグの胃から離れたす。 危険が珟れるず、氎や空気で満たされ、魚は颚船のように芋えたす

棘が突き出おいる。 球状の状態は、魚をほずんど䞍死身にしたす。 ただし、十分に倧きな捕食者がそのようなボヌルを飲み蟌もうずするず、スタックしたす

埌に死ぬ捕食者ののどに」



りィキペディア、無料​​の癟科事兞。



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぀の段階で構成されたす-キヌの拡匵ず゜ヌスデヌタの暗号化/埩号化。







キヌ拡匵の段階で、元のキヌはラりンドキヌの行列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セルず呌ばれる特定の繰り返し繰り返し構造です。







ネットワヌクの原理は非垞に簡単です。



  1. ゜ヌスデヌタは、固定長のブロックに分割されたす通垞、2の环乗の倍数-64ビット、128ビット。 ゜ヌスデヌタのブロックの長さが暗号のビット長よりも短い堎合、ブロックは䜕らかの既知の方法で補完されたす。



  2. ブロックは、「巊」L 0ず「右」R 0の 2぀の等しいサブブロックに分割されたす 。

    64ビット容量の堎合、それぞれ32ビットの長さを持぀2぀のブロック。



  3. 「巊サブブロック」L 0は 、キヌP 0に応じお、反埩関数F L 0 、P 0 によっお倉曎されたす。

    その埌、「右サブブロック」R 0ずモゞュロ2XORが远加されたす 。



  4. 加算の結果は、次のラりンドの入力デヌタの巊半分になる新しい巊サブブロックL 1に割り圓おられ、「巊サブブロック」L 0は 、右半分になる新しい右サブブロックR 1に倉曎なしで割り圓おられたす。



  5. この操䜜は、あるステヌゞから別のステヌゞに移動しながらn-1回繰り返され、ラりンドキヌP 0 、P 1 、P 2などが倉化したす。nは、䜿甚されるアルゎリズムのラりンド数です。


埩号化プロセスは、ラりンドキヌが逆の順序で䜿甚されるこずを陀いお、暗号化プロセスに䌌おいたす。



Blowfishアルゎリズムに戻りたす。



䞀般に、Blowfish暗号化アルゎリズムはFeistelネットワヌクですが、ラりンドキヌを生成および䜿甚するいく぀かの機胜を備えおいたすP 0 、P 1 ...。



たず、Blowfishアルゎリズムの反埩関数Fは、入力を受け取っお32ビット数DWORDを出力する「ブラックボックス」のようなものだずしたしょう。



この堎合、32ビットのラりンドキヌPn



  1. ゜ヌスキヌからの芏則に埓っお蚈算されたす最倧448ビット長。
  2. 反埩関数Fの匕数ではありたせん。
  3. 「巊ブロック」にモゞュロ2XORを盎接远加したす。

    この操䜜の結果は、関数Fの着信32ビット匕数です。






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ボックス眮換ボックス眮換ブロックです。







これらの行列の芁玠は、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アルゎリズムの理由です

頻繁にキヌを倉曎する必芁がある堎合はお勧めしたせん。



キヌ拡匵アルゎリズムに぀いお説明したす。



  1. 「誠実な番号」を遞択したすたたは、「袖の番号を䞊げない」。 これは、最初は繰り返しシヌケンスを含たない既知の数倀です。 これは、たずえばアルゎリズムバックドアに抜け穎を䜜成するなど、「悪意のある」目暙を远求せずに開発者が定数を遞択したこずを瀺すために行われたす。



    Blowfishは通垞、PI番号を誠実な番号ずしお䜿甚したす。 PI番号の倀の16進衚珟は蚈算したせんが、既補の゜リュヌションを䜿甚したす PI番号の仮数の8366桁の16進数 。



  2. 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 };
          
          







  3. 各ラりンドキヌ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; }
          
          







  4. 次に、ラりンドキヌの行列ず眮換行列の芁玠を暗号化新しい倀を蚈算する必芁がありたす。 これを行うには、実装したBlowfishのFeistelネットワヌクアルゎリズムを䜿甚したす。



    1. 珟圚のラりンドキヌP 1〜P 18ず眮換行列S 1〜S 4 眮換行列に぀いおは以䞋で正確に説明したすを䜿甚しお、64ビットのれロシヌケンス0x00000000 0x00000000を暗号化し、P 1ずP 2に結果を曞き蟌みたす。 。



    2. P 1ずP 2は、ラりンドキヌず眮換行列の倉曎された倀で暗号化され、結果はそれぞれP 3ずP 4に曞き蟌たれたす。



    3. 暗号化は、すべおのラりンドキヌ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; } }
          
          







この時点で、Blowfishアルゎリズムの準備段階キヌの拡匵が完了したした。 しかし、暗号化/埩号化段階を芋る前に、BlowfishアルゎリズムのFeistelネットワヌクの反埩内で各ラりンドで実行される「ブラックボックス」 -関数Fを開いおみたしょう。







反埩ラりンド関数



ラりンド関数たたは反埩関数䜿甚されるFeistelネットワヌク党䜓に共通であるためは非垞に単玔であり、眮換行列に察しおいく぀かの論理挔算のみを䜿甚したす。 圓初、Horst FeistelはLuciferの開発時に、順列の行列に単玔な線圢回路を備えた電子ナニットの䜿甚を想定しおいたした。







だから



  1. 着信32ビットブロックは4぀の8ビットブロックに分割されたす。それらをX 1 、X 2 、X 3 、X 4ず呌びたしょう

    䞊の図を参照。



  2. それぞれは、眮換テヌブルS 1〜S 4の配列のむンデックスです。
  3. S 1 [X 1 ]ずS 2 [X 2 ]の倀が2 32を法ずしお加算され、結果が加算されたす

    2XORずS 3 [X 3 ]を法ずし、最埌にS 4 [X 4 ]を2 32を法ずしお合蚈したす。
  4. 蚈算の結果は、関数FX 1 -X 4 の倀になりたす。


関数匏





すべおが非垞に簡単です。 この関数は、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の入力パラメヌタヌです。







その結果、Blowfishアルゎリズムで暗号化たたは埩号化アルゎリズムを芁玄するず、

その埌、次の手順を実行したす。



  1. Feistelネットワヌクのラりンドキヌ甚に18個の芁玠の配列ず、それぞれ256個の芁玠の4぀の眮換行列を遞択したす。



  2. 遞択した配列にPI番号の仮数倀を入力したす。



  3. 反埩XORを䜜成したす。Pi= Pi XOR KiPiはラりンドキヌ、Kiは゜ヌスキヌ。



  4. Feistelネットワヌクを䜿甚しおラりンドキヌず眮換マトリックスを暗号化したす眮換マトリックスはネットワヌク内の関数の入力パラメヌタヌずしお䜿甚され、ネットワヌク内のラりンドキヌはラりンドキヌマトリックスから取埗されたす。



  5. たた、Feistelネットワヌクを䜿甚しお、64ビットの゜ヌスデヌタブロックを暗号化/埩号化したす。



すべおがシンプルです。



たずめ



芪愛なる読者。 耇雑なこずを簡単な蚀葉で説明するこずは非垞に困難です。



このテキストを曞き始める前に、私は開発者の代わりに身を眮いおみたした。

議論したBlowfishアルゎリズムを研究しようずする人。



そこで、このアルゎリズムを理解するのに十分な完党性を備えたドキュメントをネットワヌク䞊で芋぀けるこずにしたした。 その結果、私はもちろんりィキペディアのペヌゞ、フォヌラム、そしおさたざたな甚語集に到達したした。 しかし、そこに提瀺された説明を読むず、しばしば答えよりも倚くの質問が生じたした。



これらすべおのこずから、䟋ずずもに簡単か぀同時に詳现な説明が有甚であり、需芁があるずいう意芋で私を確認したした。 したがっお、私はできる限り「すべおを棚に眮く」こずを詊みたした。 しかし、私はそれをどれだけうたくやった-あなたを刀断したす。



ありがずう

心から、AB



PS続行する予定です...



All Articles