PDEL for PHP5 official website

Practical and Decryptable Encryption Library for PHP5   (Version 1.2.1)

Special thanks for your access. Sorry , this site is Japanese(UTF-8) version only.
   PDELのもっともシンプルな暗号化方式である可変暗号化(「暗号化の都度、結果が異なる」「結果が暗号化する情報のバイト数に比例する」「有効期限を付けない」「セッション・ハイジャック・チェックを行わない」)は【表1-1-A】の手順A~手順Dによって、暗号化を行っています。

【表1-1-A】半角のXYZ(文字コードはASCII)という文字列を暗号化する場合のイメージ
手順 内容 イメージ 備考
A 16進数化 XYZ

58595a
58595a はXYZの16進数です。
B 認証情報設定 58595a

00037d29f8ed58595a
16進数データの先頭に認証情報Aを設定します。
C 文字の置き換え 00037d29f8ed58595a

cPPs0oqH4idoxO3nuG
16進数で使用される0~9、およびa~fを、別の文字に置き換えます。
==> 後述マップファイルを基に置換します。
D 様々な文字列操作 cPPs0oqH4idoxO3nuG

Oxodi4Hqo0PNX9c3nuGPs
テキストファイルの内容に従って、様々な文字列操作(文字列の追加、反転等)を行います。
==> 後述レシピファイルを基に変換します。

   以下に各手順を補足します。
  • PDEL実行時の内部文字エンコーディングで16進数化します。
  • PDELでの文字列関連処理は、全てPDEL実行時の内部文字エンコーディングで行います。PDEL内部で文字コード変換は一切行いません。
  • 復号時「正しく復号されたか?」「復号を許可しても良いか?」を確認する目的で認証情報を設定します。
  • 認証情報はA~Cの3種類存在します。上記イメージで記したのは認証情報Aです。認証情報Bは有効期限付き暗号化実施時のみ設定され、認証情報Cはセッション・ハイジャック・チェック付き暗号化実施時のみ設定されます。
    【表1-1-B】手順B完了後のデータイメージ
    認証情報A 認証情報B 認証情報C 暗号化対象データ
    バイト数+ハッシュ値 日時情報 バイト数+ハッシュ値 16進数変換後
  • 認証情報Aのバイト数は、暗号化前データ(上記例ではXYZ)のバイト数(16進数)です。認証情報Aのハッシュ値は、暗号化前データ(上記例ではXYZ)のハッシュ値です。
  • 認証情報Cのバイト数は、「セッション・ハイジャック・チェックに用いた情報」のバイト数(16進数)です。認証情報Cのハッシュ値は、「セッション・ハイジャック・チェックに用いた情報」のハッシュ値です。
  • 認証情報Aおよび認証情報Cに設定する情報は、次の認証モードから選択可能です。特に認証情報Aで用いる認証モードをPDELではデフォルト認証モードと呼びます。(概略イメージで用いた認証モードは5です。)
    【表1-1-C】認証モード一覧
    認証モード 認証方式 付加情報量
    0 行わない(認証情報Cでは選択不可能) 0バイト
    1 バイト数のみチェック(認証情報Cでは選択不可能) 4バイト
    2 ハッシュ値(CRC32)のみチェック 8バイト
    3 ハッシュ値(MD-5)のみチェック 32バイト
    4 ハッシュ値(SHA-1)のみチェック 40バイト
    5 バイト数およびハッシュ値(CRC32)のダブルチェック 12バイト
    6 バイト数およびハッシュ値(MD-5)のダブルチェック 36バイト
    7 バイト数およびハッシュ値(SHA-1)のダブルチェック 44バイト
  • 手順Bにおいて先頭4桁(0003)が対象文字列(XYZ)のバイト数、5桁目から8桁分(7d29f8ed)が対象文字列(XYZ)のCRC32ハッシュ値です。(各々16進数表現です。)
  • 認証情報は、暗号化後データのバイト数に影響を及ぼします。(付加情報量のバイト数分が加算されます。なお認証情報Bは14バイト固定です。)
  • 暗号化の強度を高めるため、手順Bの結果を以下の仕様で置き換えます。
  • アルファベットの大文字(A~Z)と小文字(a~z)、数字(0~9)、ドット( . )、ハイフン( - )64種の文字各々1個からなる「64桁のランダムな並びの文字列」を定義します。
    (例) cP-gAUXTNSYqyb5srfawu3lxVz.F6B0eiZOLnCvHRGW97mpJ81DhtEoIjKkd4QM2
  • PDELでは上記文字列をマップ文字列、マップ文字列で使用される64種の文字をマップ文字種別と呼びます。
  • マップ文字列先頭から4桁単位で「16進数使用文字(0~9およびa~f)」に割り当てます。
    16進数 0 1 2 ・・・ d e f
    マップ文字列 cP-g AUXT NSYq ・・・ tEoI jKkd 4QM2
  • 手順Bで変換された16進数の全ての文字を、上記割り当てをもとに、マップ文字列の文字に置換します。(16進数使用文字種別一つにつき「4種類のなかからランダムに置換」します。ここでは割愛しますが、ランダムでない固定置換も行えます。)
  • PDELでは、マップ文字列はマップファイルというテキストファイルに定義します。
  • 暗号化の強度を高めるため、テキストファイルの内容に従い、手順Cの結果を変換します。
  • 以下は3行のテキストファイルで手順Cの結果(cPPs0oqH4idoxO3nuG)を暗号化する場合のイメージです。
    【表1-1-D】様々な文字列操作のルールを定義したテキストファイル
    行番号 テキストファイル内容 イメージ 意味
    1 Add:3:1 cPPs0oqH4idoxO3nuG(注)

    c9XNPPs0oqH4idoxO3nuG
    「マップ文字種別から3桁のランダムな文字列」を生成し「先頭から1桁目の後方」に追加する。
    2 StrCycle:L:2:LAST:16 c9XNPPs0oqH4idoxO3nuG(注)

    c9XNP0oqH4idoxO3nuGPs
    「文字列の末尾から16桁」を「左方向に2桁循環」させる。
    3 StrReverse:0:15 c9XNP0oqH4idoxO3nuGPs(注)

    Oxodi4Hqo0PNX9c3nuGPs
    「文字列の先頭から15桁」を「反転」させる。
  • PDELでは操作前の文字列(注)のことを操作対象文字列、上記2行目および3行目のように操作対象文字列の桁数が増えない操作において操作が行われる範囲(青字の範囲)操作対象範囲と記します。
  • PDELでは、様々な文字列操作のルールを定義したテキストファイルをレシピファイルと呼びます。(XYZ という文字列を Oxodi4Hqo0PNX9c3nuGPs に暗号化する方法は「秘伝のタレの作り方」であると言えます。そのため、このファイルのことをレシピファイルと呼びます。)

   復号は、【表1-1-A】の手順を逆に行うことにより、実装しています。(手順Dでは、【表1-1-D】のテキストファイルの最後の行から逆変換を行います。)手順D→手順Aと逆変換を実施し、復号されたデータのハッシュ値とバイト数が、認証情報Aと同じであれば復号成功、そうでなければ復号失敗と判定します。
   マップファイルとレシピファイルの仕様等を以下に記します。

  1. ファイル名称
    暗号化方式 種類 名称(先頭1桁はドットです)
    可変暗号化 マップファイル .MAP-V****.txt
    レシピファイル .RECIPE-V****.txt
    固定暗号化 マップファイル .MAP-F****.txt
    レシピファイル .RECIPE-F****.txt
    • 可変暗号化は、暗号化の結果が、ランダムになる方式です。(前述したXYZの暗号化をもう一度行うと、別の結果になりますが、このような暗号化です。)
    • 固定暗号化は、暗号化の結果が常に同じ内容となる方式です。
    • 名称の****の部分は、対となる「マップファイル」と「レシピファイル」で同じものを指定します。(後述「ChangeAuthMode」による例外を除きます。)
    • 名称の****の部分に使用できる文字は、アルファベット大文字と小文字、数字、アンダースコア( _ )、ハイフン( - )、カギ括弧開き・閉じ( [ ] )です。1桁~39桁の範囲で定義できます。VまたはFを含め最大40桁です。
    • V****またはF****の箇所をPDELではレシピ名と呼びます。(氏名用のレシピ、メールアドレス用のレシピ、電話番号用のレシピ、住所用のレシピ、クレジットカード番号用のレシピ、…のように複数定義できます。)
    • 固定暗号化は「有効期限付き暗号化」または「セッション・ハイジャック・チェック付き暗号化」では行えません。
    • ファイルを配置するディレクトリはPDEL専用INIファイルで定義します。

  2. マップファイル(内容とファイルサイズ)
    暗号化方式 内容(文字コードはASCII) サイズ
    可変暗号化
    • マップ文字列のみを定義します。
    • 改行コードを含めてはいけません。
    64バイト
    固定暗号化
    • 先頭64バイトはマップ文字列を定義します。
    • 次の64バイトは固定拡張文字列を定義します。
    • 最後の16バイトは固定マップキー文字列を定義します。
    • 改行コードを含めてはいけません。
    144バイト
    • ファイル内容は、ツールで作成できますが、以下にその仕様等を記します。
    • マップ文字列は概略イメージ手順C参照。
    • 固定拡張文字列は、「マップ文字列をランダムに並べ替えた文字列」を定義します。マップ文字列と同じ並びの文字列は定義できません。
    • 固定マップキー文字列3210321032103210をランダムに並べ替えたものを定義します。
    • 固定拡張文字列は、文字列の拡張を伴う暗号化(概略イメージ手順DのAddや後述Extend)で使用します。
    • 固定マップキー文字列は、概略イメージ手順Cの「文字の置き換え」で使用します。

  3. レシピファイル(内容と記述ルール)
    • レシピファイルにはコマンドと呼ばれる文字列操作等を行う行を定義します。
    • コマンドは一つのレシピファイル内で最大100件定義できます。
    • コマンドのパラメータはコロン(:)で区切って指定します。
    • シャープ(#)で始まる行はコメント行です。
    • 使用可能なコマンドは12種類です。詳細は仕様補足をご参考願います。
    • 改行コードは[LF]・[CR][LF]どちらでも構いません。
    • 文字コードは、コメントを除くコマンド行がASCIIであれば、Shift-JIS・EUC-JP・UTF-8何でも構いません。
   データマスキングを行う・行わない、行う場合の概略パターンはPDEL専用INIファイルのセクション定義で決定します。行う場合の詳細なデータマスキングの方法はマスクルール定義ファイルに記述します。以下にマスクルール定義ファイルの仕様を記します。

  1. ファイル配置ディレクトリおよびファイル名称
    PDEL専用INIファイルで定義します。
  2. ファイル内容
    • 一つのレシピにつき、一行定義します。(レシピが6種類あれば6行定義します。)
    • 各行は「レシピ名」「復号成功時の名称」「復号失敗時の名称」「適用除外の権限レベル」の4フィールドをコロン(:)で区切って定義します。
    • 「復号失敗時の名称」は省略可能です。
    • PDEL専用INIファイルでの定義が「システム利用者の権限レベルに応じたデータマスキングを行う」場合「適用除外の権限レベル」は必須です。
    • PDEL専用INIファイルでの定義が「データマスキングを無条件に行う」場合、「適用除外の権限レベル」は省略可能ですが、定義されていてもエラーとはなりません。(何らかの調査を行うため、本番環境をコピーした環境を構築する場合、PDEL専用INIファイルを「データマスキングを無条件に行う」に変更するようなケースを想定したうえでの仕様です。)
    • 「適用除外の権限レベル」にPDEL-MASK-PRIVATEを指定すると、システム利用者のうち、権限レベルの有る利用者は、常にマスキングが行われます。(権限レベルの有る利用者とは「社内システムの利用者」「B2B・B2C型システムにおいて、システム運営会社側に属する利用者」を想定しています。)
    • 「適用除外の権限レベル」にPDEL-MASK-PUBLICを指定すると、権限レベルの有無にかかわらず、全システム利用者で常にマスキングが行われます。(権限レベルの無い利用者とは「B2B・B2C型システムにおいて、サービスを享受する側の利用者」を想定しています。)
    • シャープ(#)で始まる行はコメント行です。
    • 改行コードは[LF]・[CR][LF]どちらでも構いません。
    • 文字コードは、コメントを除くコマンド行がASCIIであれば、Shift-JIS・EUC-JP・UTF-8何でも構いません。
    • 「復号成功時の名称」「復号失敗時の名称」で使用できる文字は、アルファベット大文字と小文字、数字、アンダースコア( _ )、ハイフン( - )、プラス( + )、アスタリスク( * )、ドット( .)、スラッシュ( / )で、1桁~40桁の範囲で定義できます。
  3. 動作イメージ例
    【6項目をPDELで暗号化したシステムのマスクルール定義ファイルの例】
    (この例における権限レベルは 1:初級スタッフ 2:スタッフ 3:リーダー 4:マネージャー です。)
    行番号 マスクルール定義ファイル内容 レシピが対象とする情報
    1 V-NAME:NAME:ErrNAME:2 氏名
    2 V-MAD:MAD:ErrMAD:3 メールアドレス
    3 V-TEL:TEL:ErrTEL:3 電話番号
    4 V-ADDR:ADDR:ErrADDR:4 住所
    5 V-CARD:CARD:ErrCARD:PDEL-MASK-PRIVATE クレジットカード
    6 V-PASS:****:Err****:PDEL-MASK-PUBLIC パスワード
    導入時の注意点にも記していますが
      パスワードをPDELで暗号化することは
      推奨しません。
    上記のようなマスクルール定義ファイルでアプリケーションで顧客データを照会すると、次のように表示されます。
    • 復号に成功した場合の利用者ごとの表示例
      項目 権限レベルの有る利用者(下段は保有権限レベル) 権限レベルの無い利用者
      1 2 3 4
      氏名 NAME 実データ 実データ 実データ 実データ
      メールアドレス MAD MAD 実データ 実データ 実データ
      電話番号 TEL TEL 実データ 実データ 実データ
      住所 ADDR ADDR ADDR 実データ 実データ
      クレジットカード CARD CARD CARD CARD 実データ
      パスワード **** **** **** **** ****
    • 復号に失敗した場合の利用者ごとの表示例
      項目 権限レベルの有る利用者(下段は保有権限レベル) 権限レベルの無い利用者
      1 2 3 4
      氏名 ErrNAME ErrNAME ErrNAME ErrNAME ErrNAME
      メールアドレス ErrMAD ErrMAD ErrMAD ErrMAD ErrMAD
      電話番号 ErrTEL ErrTEL ErrTEL ErrTEL ErrTEL
      住所 ErrADDR ErrADDR ErrADDR ErrADDR ErrADDR
      クレジットカード ErrCARD ErrCARD ErrCARD ErrCARD ErrCARD
      パスワード Err**** Err**** Err**** Err**** Err****
      上記は、PDEL専用INIファイルのMASK_ENV_COMセクションにSKIP_DECRYPT="false"と定義された場合の例です。SKIP_DECRYPT="true"と定義されれば、この箇所は復号成功時の情報(Errを除いた文字列)が表示されます。

    ※デモでは、様々なパターンのデータマスキングが確認できます。
   レシピファイルにExtendコマンドを定義することにより、固定長暗号化が行えます。固定長暗号化実施時は、前述概略イメージの動作が以下のようになります。

【表1-4-A】半角のXYZという文字列の暗号化時にExtend:25が指定された場合のイメージ
手順 内容 イメージ 備考
E-1 16進数化 XYZ

58595a
58595a はXYZの16進数です。
E-2 認証情報設定 58595a

00037d29f8ed58595a
16進数データの先頭に認証情報Aを設定します。
E-3 デリミタ設定 00037d29f8ed58595a

00037d29f8ed58595a00
拡張領域識別用のデリミタを設定します。

※Extend固有の手順です。
E-4 文字の置き換え 00037d29f8ed58595a00

cPPs0oqH4idoxO3nuGg-
16進数で使用される0~9、およびa~fを、別の文字に置き換えます。
E-5 拡張 cPPs0oqH4idoxO3nuGg-

cPPs0oqH4idoxO3nuGg-6nBzp
25バイトに拡張します。

※Extend固有の手順です。
E-6 様々な文字列操作 cPPs0oqH4idoxO3nuGg-6nBzp

レシピファイルのExtendコマンド以降の内容に従って、様々な文字列操作(文字列の追加、反転等)を行います。
上記イメージを補足します。
  1. 手順E-3および手順E-5では、「指定された拡張サイズ(この例では25)」と「認証情報設定文字列バイト数(手順E-2完了後の文字列のバイト数。この例では18)」の差をもとに、動作が決定されます。
    拡張サイズ - 認証情報設定文字列バイト数 手順E-3 手順E-5
    0 何もしない 何もしない
    1 0を末尾に追加 何もしない
    2 00を末尾に追加 何もしない
    3以上 00を末尾に追加 (拡張サイズ - 認証情報設定文字列バイト数 - 2)桁の文字列を末尾に追加
  2. 手順E-5で追加される文字列は、「可変暗号化の場合はランダムな文字列」「固定暗号化の場合は固定暗号化の【固定暗号化時の文字列拡張】仕様で求められた文字列」となります。
  3. Extendコマンドの仕様として、「拡張サイズは認証情報が設定された文字列のバイト数以上であること」というチェックを実施しており、前述の例でレシピファイルの拡張サイズに17以下が定義されていれば、暗号化時にエラーとなります。
  4. 「デリミタに00を使用する」ということは「暗号化する情報にNull(16進数の00)が含まれてはいけない」ということです。従って固定長暗号化では、バイナリ文字列の暗号化は行えません。
   レシピファイルにCheckLimitTimeコマンドを定義することにより、有効期限付き暗号化が行えます。有効期限付き暗号化実施時は、概略イメージ手順Bの処理で認証情報Bが設定されます。(復号可能な期限の日時がYYYYMMDDhhmmssの14桁形式で設定されます。)

  • PDEL呼び出し元アプリケーションが使用する日時はPDELが動作するPHP環境に設定されたタイムゾーンのローカル日時とします。(絶対日時型の有効期限付き暗号化を行う場合、指定する日時はローカル日時です。相対日時型の有効期限付き暗号化を行った場合、PDELは設定された有効期限をアプリケーション側に返しますが、その日時もローカル日時です。)
  • ただし認証情報Bに設定される日時はPDELが動作するPHP環境のGMT日時です。(ローカル日時をGMTに変換して設定しています。)
  • 万一、PDELを夏時間のあるタイムゾーンで動かし、なおかつ夏時間と冬時間の切り替えタイミングを挟んで有効期限付き暗号化が行われた場合、PDELがどのように動作するかは未確認です。
   レシピファイルにCheckHijackコマンドを定義することにより、セッション・ハイジャック・チェック付き暗号化が行えます。PDELにおけるセッション・ハイジャック・チェック付き暗号化は、次の方式で実装しています。

  • 暗号化時にキー項目を連結した文字列のバイト数およびハッシュ値を認証情報Cに設定します。(認証情報Cに適用される認証モードが2~4であれば、バイト数は設定されません。)
  • 復号時、暗号化時と同じロジックでキー項目を連結した文字列のバイト数およびハッシュ値を算出します。(認証情報Cに適用される認証モードが2~4であれば、バイト数は除外されます。)この情報と「復号された認証情報C」を比較し、異なればセッション・ハイジャックされたとみなします。
  • キー項目は以下のものが選択可能です。(CheckHijackコマンドの第1パラメータで指定する項目です。)
    キー項目 内容 サーバ環境変数(注1)
    ZFIP ZF仕様のクライアントIP (注2)
    IP 単純仕様のクライアントIP REMOTE_ADDR
    UA ブラウザ種別 HTTP_USER_AGENT
    LANG 言語 HTTP_ACCEPT_LANGUAGEおよびHTTP_ACCEPT_CHARSET(注3)
    APL 任意情報 暗号化・復号時にPDELを利用するアプリケーションが指定する任意情報。これは端末識別番号が取得できるシステムや、クライアントIPをPDELのZFIP・IP以外の論理で取得するシステムでの利用を想定したキー項目です。
    (注1)PHPのスーパーグローバル変数$_SERVERの項目。
    (注2)下記論理で取得するIPアドレス。
    条件 IPアドレス
    サーバ環境変数HTTP_CLIENT_IPが設定されている場合 サーバ環境変数HTTP_CLIENT_IP
    およびREMOTE_ADDRを連結した文字列
    上記以外でサーバ環境変数HTTP_X_FORWARDED_FORが設定されている場合 サーバ環境変数HTTP_X_FORWARDED_FOR
    およびREMOTE_ADDRを連結した文字列
    上記2条件いずれにも該当しない場合 サーバ環境変数REMOTE_ADDR
    上記論理はZendFrameWork(ZF。バージョンは1.12.0)の
    library/Zend/Controller/Request/Http.phpのgetClientIpメソッド
    を参考にしています。
    
    ※厳密にはZFでは、HTTP_CLIENT_IPまたはHTTP_X_FORWARDED_FOR設定時は
      HTTP_CLIENT_IPまたはHTTP_X_FORWARDED_FORをクライアントIPとしてます。
      ただ、おそらくHTTP_CLIENT_IPまたはHTTP_X_FORWARDED_FORは
      パブリックIPであるREMOTE_ADDRを含まないプライベートIP情報と思われるため
      「REMOTE_ADDRを連結した文字列」をPDELではクライアントIPとしています。
    
    (注3)HTTP_ACCEPT_CHARSETは、この情報を設定するブラウザのみ用います。
  • モバイル系プロバイダを中心に、インターネット接続後にIPアドレスが変更されることもあるそうです。IPアドレスによるチェックを行う/行わないの参考にしてください。
   暗号化後の文字列データは、マップ文字種別だけで構成されます。
   また、暗号化後の文字列データのバイト数は、次のとおりです。
【レシピファイルにExtendコマンドを定義した場合(固定長暗号化の場合)】

暗号化後の文字列データのバイト数 =
  (Extendコマンドで指定したサイズ) +
  (Addコマンド使用時はAddコマンドで指定した付与する文字数の総合計)
【レシピファイルにExtendコマンド未定義の場合(可変長暗号化の場合)】

暗号化後の文字列データのバイト数 =
  (認証情報A~Cの合計バイト数) +
  (暗号化対象データのバイト数 × 2) +
  (Addコマンド使用時はAddコマンドで指定した付与する文字数の総合計)
   当サイトのコピー環境を皆様の環境に構築すれば、自作マップファイル・レシピファイルについて「エラーの有無」「暗号可能最大バイト数」「暗号化後バイト数」等が解析され、表示されます。
   PDELで暗号化可能な文字列とバイト数は、次のとおりです。
【レシピファイルにExtendコマンドを定義した場合(固定長暗号化の場合)】

暗号化可能な文字列のバイト数 =
  (Extendコマンドで指定したサイズ - (認証情報A~Cの合計バイト数)) ÷ 2

※端数切り捨てです。
【レシピファイルにExtendコマンド未定義の場合(可変長暗号化の場合)】

暗号化可能な文字列のバイト数 = 10000
  • バイナリ文字列を暗号化する場合、レシピファイルにAllowBinStringコマンドを定義します。
  • バイナリ文字列の暗号化では、固定長暗号化は行えません。
  • ここでいうバイナリ文字列とは「Null(16進数の00)を含むバイト列」を意味します。
  • 日本語等のマルチバイト文字もバイト列とみなすため、暗号化・復号が可能です。
  この項は「PDELをPHP以外の言語で実装したい、という考えをお持ちの人」以外は読み飛ばして頂いても構いません。

   固定暗号化は、次の二つの機能の仕様が可変暗号化と異なります。
   一つ目は「固定暗号化時のマップ文字置換」(概略イメージの手順C)です。二つ目は「固定暗号化時の文字列拡張」(レシピコマンドのExtendまたはAddで追加する文字列を生成する仕様です。)以下に、これらを記します。

【固定暗号化時のマップ文字列置換】
   「16進数で使用される0~9およびa~fを別の文字に置き換える」場合、マップファイルの固定マップキー文字列をもとに、次の論理で置き換える文字を決定します。なお、この機能はPDEL本体(Pdel.php)の_hex2Map関数で実装されています。
  1. 基準文字列前半部の決定
    「置き換える文字列の長さ÷16の商(端数切捨て)」が1以上であれば、商の回数分、「固定マップキー文字列」を繰り返します。繰り返した文字列を「追加文字列後半部」とします。商が0であれば、「基準文字列前半部」は空文字列とします。
  2. 基準文字列後半部の決定
    「置き換える文字列の長さ÷16の余り」が1以上であれば、「固定マップキー文字列の末尾から余りの桁数分を反転させた文字列」を「基準文字列後半部」とします。余り0であれば、「基準文字列後半部」は空文字列とします。
  3. 基準文字列の決定
    基準文字列前半部と基準文字列後半部を連結した文字列を「基準文字列」とします。
  4. 置き換え
    基準文字列は、「置き換える文字列と同じ長さで、なおかつ、0、1、2、3のみので構成された文字列」です。置き換える文字列先頭桁から末尾まで、同じ桁位置の基準文字列(0、1、2、3のいずれか)に従って、マップ文字列4種類を決定します。(基本文字列の該当桁の値が0であれば四種類の先頭1桁、1であれば四種類の先頭から2桁目、2であれば四種類の先頭から3桁目、3であれば四種類の末尾の桁とします。)

【固定暗号化時の文字列拡張】
   ExtendまたはAddコマンドがレシピファイルに定義されている場合、マップファイルの固定拡張文字列をもとに次の論理で追加する文字列を決定します。なお、以下はPDEL本体(Pdel.php)の_genFixedString関数で実装されています。
  1. 基準文字列の決定
    「追加する文字列の長さ÷10の余り」の桁数分、マップファイルの固定拡張文字列を左方向に循環させます。その後、「追加する文字列の長さ÷10の余り」が2、0、3、8いずれかに該当すれば、循環後の文字列を反転させます。この論理で決定された文字列を「基準文字列」とします。
  2. 追加文字列後半部の決定
    「追加する文字列の長さ÷64の商(端数切捨て)」が1以上であれば、商の回数分、「基準文字列」を繰り返します。繰り返した文字列を「追加文字列後半部」とします。商が0であれば、「追加文字列後半部」は空文字列とします。
  3. 追加文字列前半部の決定
    「追加する文字列の長さ÷64の余り」が1以上であれば、「基準文字列の先頭」から「余りの桁数分」を「追加文字列前半部」とします。余りが0であれば、「追加文字列前半部」は空文字列とします。
  4. 追加文字列の確定
    「追加する文字列の長さ÷64の余り」が1以上であれば、「基準文字列の先頭」から「余りの桁数分」を「追加文字列前半部」とします。余りが0であれば、「追加文字列前半部」は空文字列とします。
  この項も「PDELをPHP以外の言語で実装したい、という考えをお持ちの人」以外は読み飛ばして頂いても構いません。

   もしPDELが、PHP以外の言語で実装されれば、マップファイル・レシピファイルの共有により「データを暗号化したまま、他システムとの連携処理も論理的に可能」となります。(もっとも内部文字コードがPHPのように柔軟に指定できないJava等は「暗号化時はUTF-16等で表現される文字列を、PHPのシステムで使用している内部文字コードに変換後、更にそのバイト列を対象にPDEL仕様に従って暗号化する」「復号時はUTF-16等で表現される文字列を、PHPのシステムで使用している内部文字コードに変換後、更にそのバイト列を対象にPDEL仕様に従って復号する」という機能が必要となります。)
   これは「他システム側のプログラミング言語にハッシュ値算出機能が備わっていること」を前提にしていますが「ハッシュ値算出機能が備わっていないプログラミング言語」も存在します。このような場合、レシピファイルにChangeAuthModeコマンドという特殊なコマンドを用いると、対処できます。

  • レシピファイルにChangeAuthModeを定義した場合、対となるマップファイルを作成してはいけません。
  • 次のようなイメージでの使用を想定しています。(自システム:ハッシュ値算出機能が備わったシステム 他システム:ハッシュ値算出機能のないシステム)
    データの流れ 自システムにおける処理イメージ例
    自システム

    他システム
    ハッシュ値付きで暗号化されたデータを復号

    復号されたデータをChangeAuthModeを用いてハッシュ値なしで暗号化

    他システムへハッシュ値なしの暗号化データ送信
    他システム

    自システム
    他システムからハッシュ値なしの暗号化データ受信

    ChangeAuthModeを用いてハッシュ値なしで復号

    復号されたデータをハッシュ値付きで暗号化し、自システムのDBに登録
  この項も「PDELをPHP以外の言語で実装したい、という考えをお持ちの人」以外は読み飛ばして頂いても構いません。

   PDEL本体のソースコードを確認される際に推奨するIDEはNetBeansのPHP版です。(Eclipseでも構いませんがNetBeansのほうが軽量です。PDEL本体は総ステップ数が2700を超えるため、ナビゲータや定義への移動機能のないエディタは推奨しません。) また、コーディング規約はZendPEARのコーディング規約を参考にしたものの、原則独自規約です。(PDEL本体以外のデモプログラム等は、この規約は無視しています。なおディスプレイは1920×1080以上の解像度を推奨します。)

  • クラス定数またはそれに準ずるプライベート変数は大文字で定義しています。(クラス定数の定義で演算子や関数を使用したかったのですが、文法上不可能なので、一部プライベート変数は大文字で定義しています。)
  • プライベート変数と関数の先頭1桁は_(アンダースコア)です。
  • プロテクト関数の先頭3桁は___(全てアンダースコア)です。
  • ローカル変数先頭1桁およびプライベート変数2桁目は、変数の型です。(iは数値型、sは文字列型、aは配列型、mは複合型、bは論理型、fは浮動小数点型。頻出の$i_ssは数値型SubScriptという意味です。)
  • プログラミングにこだわりがあるとすれば「if文の演算子は省略せずに===または!==を用いる」「文字列定義でダブルクォーテーションは用いない」等です。
  • コンストラクタの第2引数にtrueを指定すると、デバッグモードで実行されます。デバッグモードで実行すると、暗号化・復号の実行結果の連想配列にdebug_infというキーが追加され、レシピファイルに定義したコマンド単位での処理時間等が設定されます。