メインページ | アルファベット順一覧 | 構成 | ファイル一覧 | 構成メンバ | ファイルメンバ | 関連ページ

# dkcBlowfish.h

Blowfish block cipher algorithm [詳細]

`#include "dkcOSIndependent.h"`

dkcBlowfish.hのインクルード依存関係図

このグラフは、どのファイルから直接、間接的にインクルードされているかを示しています。

ソースコードを見る。

## 構成
struct | dkc_Blowfish
## マクロ定義
#define | MAXKEYBYTES 56
#define | NPASS 16
#define | dkcd_BLOWFISH_MAX_KEY_SIZE MAXKEYBYTES
| キーの最大値
## 型定義
typedef DWORD(* | DKC_BLOWFISH_SBOX_TYPE )[256]
typedef dkc_Blowfish | DKC_BLOWFISH
## 関数
DKC_EXTERN DKC_BLOWFISH *WINAPI | dkcAllocBlowfish (BYTE *key, int keysize)
DKC_EXTERN int WINAPI | dkcFreeBlowfish (DKC_BLOWFISH **)
| dkcAllocBlowfish()で確保したメモリ領域を開放
DKC_EXTERN int WINAPI | dkcBlowfishInit (DKC_BLOWFISH *p, BYTE *key, int keybytes)
| dkcAllocBlowfish()で初期化するけど、明示的に初期化したい場合これを呼び出す。
DKC_EXTERN DWORD WINAPI | dkcBlowfishGetOutputLength (DWORD lInputLong)
DKC_EXTERN DWORD WINAPI | dkcBlowfishEncrypt (DKC_BLOWFISH *p, BYTE *pInput, BYTE *pOutput, DWORD lSize)
DKC_EXTERN void WINAPI | dkcBlowfishDecrypt (DKC_BLOWFISH *p, BYTE *pInput, BYTE *pOutput, DWORD lSize)

## 説明

Blowfish block cipher algorithm

作者:
  converted C by d金魚

から:
  2004/07/07

覚え書き:
  Bruce Schneier氏、Jim Conger氏に感謝します。

TODO:
  インターフェイスの変更の可能性あり。しかし、よほど気が向かない限り行わないだろう。

dkcBlowfish.h で定義されています。

## マクロ定義

#define dkcd_BLOWFISH_MAX_KEY_SIZE MAXKEYBYTES

| キーの最大値 dkcBlowfish.h の 25 行で定義されています。 参照元 dkcBlowfishInit().

#define MAXKEYBYTES 56

| TODO: このdefineは変える可能性ありdkcd_BLOWFISH_MAX_KEY_SIZEを使用すべし dkcBlowfish.h の 20 行で定義されています。

#define NPASS 16

| TODO: このdefineは変える可能性あり dkcBlowfish.h の 22 行で定義されています。 参照元 dkcBlowfishInit().

## 型定義

typedef struct dkc_Blowfish DKC_BLOWFISH

typedef DWORD(* DKC_BLOWFISH_SBOX_TYPE)[256]

| dkcBlowfish.h の 30 行で定義されています。

## 関数

DKC_EXTERN DKC_BLOWFISH* WINAPI dkcAllocBlowfish | ( | BYTE * | key,
|  | int | keysize
| ) |

  | 引数:
  | key[in] | キーへのポインタ
  | keysize[in] | keyのサイズ
覚え書き: dkcd_BLOWFISH_MAX_KEY_SIZEよりキーが大きい場合は失敗します。 内部でdkcBlowfishInit()を呼び出しています。 dkcBlowfish.c の 289 行で定義されています。 参照先 dkcAllocate(), dkcBlowfishInit(), dkcFreeBlowfish(), DWORD, NULL, dkc_Blowfish::PArray, と dkc_Blowfish::SBoxes.
    00289                                                             {
    00290     DKC_BLOWFISH *p;
    00291     if(NULL==key || 0==keysize){
    00292         return NULL;
    00293     }
    00294     p = (DKC_BLOWFISH *)dkcAllocate(sizeof(DKC_BLOWFISH));
    00295     if(NULL==p){
    00296         return NULL;
    00297     }
    00298     p->PArray = (DWORD *)malloc( sizeof(DWORD) * 18) ;
    00299     if(NULL==p->PArray){
    00300         goto Error;
    00301     }
    00302     p->SBoxes = (DKC_BLOWFISH_SBOX_TYPE)malloc( sizeof(DWORD) * 4 * 256) ;
    00303     if(NULL==p->SBoxes){
    00304         goto Error;
    00305     }
    00306     if(DKUTIL_FAILED(dkcBlowfishInit(p,key,keysize))){
    00307         goto Error;
    00308     }
    00309     return p;
    00310 Error:
    00311     dkcFreeBlowfish(&p);
    00312     return NULL;
    00313 }

DKC_EXTERN void WINAPI dkcBlowfishDecrypt | ( | DKC_BLOWFISH * | p,
|  | BYTE * | pInput,
|  | BYTE * | pOutput,
|  | DWORD | lSize
| ) |

| Decode pIntput into pOutput. Input length in lSize. Inputbuffer and output buffer can be the same, but be sure buffer length is even MOD8. dkcBlowfish.c の 516 行で定義されています。 参照先 Blowfish_decipher(), BYTE, と DWORD.
    00517 {
    00518     DWORD   lCount ;
    00519     BYTE    *pi, *po ;
    00520     int     i ;
    00521     int     SameDest = (pInput == pOutput ? 1 : 0) ;
    00522
    00523     for (lCount = 0 ; lCount < lSize ; lCount += 8)
    00524     {
    00525         if (SameDest)   // if encoded data is being written into inputbuffer
    00526         {
    00527             Blowfish_decipher (p,(DWORD *) pInput,
    00528                 (DWORD *) (pInput + 4)) ;
    00529             pInput += 8 ;
    00530         }
    00531         else            // output buffer not equal to inputbuffer
    00532         {               // so copy input to output before decoding
    00533             pi = pInput ;
    00534             po = pOutput ;
    00535             for (i = 0 ; i < 8 ; i++)
    00536                 *po++ = *pi++ ;
    00537             Blowfish_decipher (p,(DWORD *) pOutput,
    00538                 (DWORD *) (pOutput + 4)) ;
    00539             pInput += 8 ;
    00540             pOutput += 8 ;
    00541         }
    00542     }
    00543 }

DKC_EXTERN DWORD WINAPI dkcBlowfishEncrypt | ( | DKC_BLOWFISH * | p,
|  | BYTE * | pInput,
|  | BYTE * | pOutput,
|  | DWORD | lSize
| ) |

| Encode pIntput into pOutput. Input length in lSize. Returned value is length of output which will be even MOD 8 bytes. Inputbuffer and output buffer can be the same, but be sure buffer length is even MOD8. 戻り値: 0 == ERROR dkcBlowfish.c の 449 行で定義されています。 参照先 Blowfish_encipher(), BYTE, dkcBlowfishGetOutputLength(), DWORD, と NULL.
    00452 {
    00453     DWORD   lCount, lOutSize, lGoodBytes ;
    00454     BYTE    *pi, *po ;
    00455     int     i, j ;
    00456     int     SameDest = (pInput == pOutput ? 1 : 0) ;
    00457
    00458     if(NULL==p){
    00459         return 0;
    00460     }
    00461     lOutSize = dkcBlowfishGetOutputLength (lSize) ;
    00462     if(lOutSize > lSize){
    00463         return 0;
    00464     }
    00465     for (lCount = 0 ; lCount < lOutSize ; lCount += 8)
    00466     {
    00467         if (SameDest)   // if encoded data is being written into inputbuffer
    00468         {
    00469             if (lCount < lSize - 7) // if not dealing with unevenbytes at end
    00470             {
    00471                 Blowfish_encipher (p,(DWORD *) pInput,
    00472                     (DWORD *) (pInput + 4)) ;
    00473             }
    00474             else        // pad end of data with null bytes tocomplete encryption
    00475             {
    00476                 po = pInput + lSize ;   // point at bytepast theend of actual data
    00477                 j = (int) (lOutSize - lSize) ;  // number ofbytes to set to null
    00478                 for (i = 0 ; i < j ; i++)
    00479                     *po++ = 0 ;
    00480                 Blowfish_encipher (p,(DWORD *) pInput,
    00481                     (DWORD *) (pInput + 4)) ;
    00482             }
    00483             pInput += 8 ;
    00484         }
    00485         else            // output buffer not equal to inputbuffer, so must copy
    00486         {               // input to output buffer prior to encrypting
    00487             if (lCount < lSize - 7) // if not dealing with unevenbytes at end
    00488             {
    00489                 pi = pInput ;
    00490                 po = pOutput ;
    00491                 for (i = 0 ; i < 8 ; i++)
    00492 // copy bytes to output
    00493                     *po++ = *pi++ ;
    00494                 Blowfish_encipher (p,(DWORD *) pOutput, // nowencrypt them
    00495                     (DWORD *) (pOutput + 4)) ;
    00496             }
    00497             else        // pad end of data with null bytes tocomplete encryption
    00498             {
    00499                 lGoodBytes = lSize - lCount ;   // number ofremaining data bytes
    00500                 po = pOutput ;
    00501                 for (i = 0 ; i < (int) lGoodBytes ; i++)
    00502                     *po++ = *pInput++ ;
    00503                 for (j = i ; j < 8 ; j++)
    00504                     *po++ = 0 ;
    00505                 Blowfish_encipher (p,(DWORD *) pOutput,
    00506                     (DWORD *) (pOutput + 4)) ;
    00507             }
    00508             pInput += 8 ;
    00509             pOutput += 8 ;
    00510         }
    00511     }
    00512     return lOutSize ;
    00513  }

DKC_EXTERN DWORD WINAPI dkcBlowfishGetOutputLength | ( | DWORD | lInputLong | ) |

| dkcBlowfish.c の 436 行で定義されています。 参照先 DWORD. 参照元 dkcBlowfishEncrypt().
    00437 {
    00438     DWORD   lVal ;
    00439
    00440     lVal = lInputLong % 8 ; // find out if uneven number of bytes at
    00441 //the end
    00442     if (lVal != 0)
    00443         return lInputLong + 8 - lVal ;
    00444     else
    00445         return lInputLong ;
    00446 }

DKC_EXTERN int WINAPI dkcBlowfishInit | ( | DKC_BLOWFISH * | p,
|  | BYTE * | key,
|  | int | keybytes
| ) |

| dkcAllocBlowfish()で初期化するけど、明示的に初期化したい場合これを呼び出す。 覚え書き: dkcd_BLOWFISH_MAX_KEY_SIZEよりキーが大きい場合は失敗します。 この関数の使用は奨励されていません。 この関数の名前は変更する場合があります。 戻り値: edk_SUCCEEDEDなら成功 dkcBlowfish.c の 378 行で定義されています。 参照先 bf_P, bf_S, Blowfish_encipher(), dkcd_BLOWFISH_MAX_KEY_SIZE, aword::dword, DWORD, NPASS, dkc_Blowfish::PArray, dkc_Blowfish::SBoxes, と aword::w. 参照元 dkcAllocBlowfish().
    00379 {
    00380
    00381     int         i, j ;
    00382     DWORD       data, datal, datar ;
    00383     union aword temp ;
    00384
    00385     if(dkcd_BLOWFISH_MAX_KEY_SIZE < keybytes){
    00386         return edk_FAILED;
    00387     }
    00388
    00389     // first fill arrays from data tables
    00390     for (i = 0 ; i < 18 ; i++)
    00391         p->PArray[i] = bf_P [i] ;
    00392
    00393     for (i = 0 ; i < 4 ; i++)
    00394     {
    00395         for (j = 0 ; j < 256 ; j++)
    00396             p->SBoxes [i][j] = bf_S [i][j] ;
    00397     }
    00398
    00399
    00400     j = 0 ;
    00401     for (i = 0 ; i < NPASS + 2 ; ++i)
    00402     {
    00403         temp.dword = 0 ;
    00404         temp.w.byte0 = key[j];
    00405         temp.w.byte1 = key[(j+1) % keybytes] ;
    00406         temp.w.byte2 = key[(j+2) % keybytes] ;
    00407         temp.w.byte3 = key[(j+3) % keybytes] ;
    00408         data = temp.dword ;
    00409         p->PArray[i] ^= data ;
    00410         j = (j + 4) % keybytes ;
    00411     }
    00412
    00413     datal = 0 ;
    00414     datar = 0 ;
    00415
    00416     for (i = 0 ; i < NPASS + 2 ; i += 2)
    00417     {
    00418         Blowfish_encipher (p,&datal, &datar) ;
    00419         p->PArray[i] = datal ;
    00420         p->PArray[i + 1] = datar ;
    00421     }
    00422
    00423     for (i = 0 ; i < 4 ; ++i)
    00424     {
    00425         for (j = 0 ; j < 256 ; j += 2)
    00426         {
    00427           Blowfish_encipher (p,&datal, &datar) ;
    00428           p->SBoxes [i][j] = datal ;
    00429           p->SBoxes [i][j + 1] = datar ;
    00430         }
    00431     }
    00432
    00433     return edk_SUCCEEDED;
    00434 }

DKC_EXTERN int WINAPI dkcFreeBlowfish | ( | DKC_BLOWFISH ** |  | ) |

| dkcAllocBlowfish()で確保したメモリ領域を開放 dkcBlowfish.c の 316 行で定義されています。 参照先 dkcFree(), と NULL. 参照元 dkcAllocBlowfish().
    00316                                             {
    00317     if(NULL==p || NULL==(*p)){
    00318         return edk_FAILED;
    00319     }
    00320     if((*p)->SBoxes){
    00321         free((*p)->SBoxes);
    00322     }
    00323     if((*p)->PArray){
    00324         free((*p)->PArray);
    00325     }
    00326     return dkcFree((void **)p);
    00327 }