|
■No78423 (リュウ さん) に返信 > 参考にさせていただきます! その後、お使いの DES.js の出所や動作仕様について、何かわかりましたか? 今のところ分かっているのは DES を使っている、ということだけですよね…。
「どのようなアルゴリズムで暗号化/復号化されているのか」が分からないと、 他言語で再実装する際に困ると思います。 今回の場合、パディング と iv の扱いについて調査が必要でしょう。
> こんなに丁寧に書いていただけるなんて感動しました(TT) > 助かりますm(__)m
JavaScript 版も VB 版も、修正前の古いコードを投稿してしまっていました…。 まぁ、あれでも意図は伝わると思うので、あえて差し替えはしませんが、 一箇所だけ訂正しておきます。
No78419 >> Function EncryptWithIV(ByVal plainText As String, ByVal key8 As String, ByVal iv As String) As String >> des.Padding = PaddingMode.None '自分でパディングする
>> Function DecryptWithIV(ByVal base64Str As String, ByVal key8 As String) As String >> des.Padding = PaddingMode.Zeros '自分でパディングを処理 暗号化と復号化で、別のパディングが指定されていますが、 これはどちらも None にしておいてください。
-------------------
蛇足として、パディングの仕組みについて触れておくと:
そもそも DES の場合、データを 64bit すなわち 8 バイト単位のブロックに分割して処理します。
そのため、元データが 3 バイトだと 5 バイト分のデータが不足しますし、 元データが 14 バイトなら、最後のブロックで 2 バイト分不足することになります。
それゆえ、暗号化する前には、ダミーデータを末尾に付与して 8 の倍数バイトに揃えておき、 復号した後では、その余剰データすなわちパディングを取り除くという作業が必要になります。
そして No78418 で採用した des.js の場合、末尾に 0x5 を埋める仕様でした。
一応、.encrypt メソッドの第 5 引数および .decrypt メソッドの第 4 引数に 0x5 以外の値(0x0〜0xff の範囲内)を指定すれば、別の値でパディングできるそうです。 (key や iv が同一でも、パディング値が異なれば、暗号化の結果は異なります)
もし、あのライブラリを採用している場合、元データの末尾 8 バイトに 0x5 を含むような データを扱う場合、encrypt/decrypt 時に、paddingChar を意図的に変更せねばなりません。
一方、.NET Framework の DESCryptoServiceProvider の場合、パディングモードとして、 None Zeros PKCS7 ANSIX923 ISO10126 という 5 種類のモードが用意されています。
『None』の場合、パディングは自動的に行われないので、末尾パディングの付与と除去は、 自身で実装せねばなりません。今回のように、パディング動作をカスタマイズする際に使います。
『Zeros』は、末尾に 0x0 を埋め込むモードです。元データがブロック長ぴったりの場合には パディングは付与されませんので、パディングが 0x0 固定であることを除けば、先の des.js と 同様の実装です。なお、このモードはデータの末尾に 0x0 を含むようなデータを扱えません。
『PKCS7』は初期設定のモードです。(これの動作は No78417 で説明していますね) このモードの利点は、復号化した際のパディングの除去が容易である点です。 復号した際の末尾データが 0x5 だったら、最後の 5 バイトを除去すればよいですし、 復号した際の末尾データが 0x2 だったら、最後の 2 バイトを除去すればよいからです。 ただし、元データがブロック長ピッタリだった場合にもパディングは付与されるため、 暗号化した結果は、本来の長さよりも 1 ブロック分長くなります。
『ANSIX923』は、最終バイトにパディング長をいれ、その直前までに 0 を埋め込るモードです。 たとえば、元データが 3 バイトの場合、「0, 0, 0, 0, 5」という 5 バイトが付与されます。 元データが 7 バイトならパディングは「1」という 1 バイトです。なお、元データが 8 の倍数バイトに収まる場合は、パディングのみの「0, 0, 0, 0, 0, 0, 0, 8」という パディングだけのブロックが付与されます。
『ISO10126』は、ANSIX923 に近いですが、間を埋めるデータが 0 固定ではなく、 ランダムな値で埋める仕様です。そのため他のモードとは異なり、同じパラメーターで 暗号化しても、前回と異なる結果が得られるという利点があります。 なお、パディングサイズが 1 バイト分しか存在しない場合(元データの長さが 7 バイトや 15 バイトだった場合)は、ランダムデータを埋める場所が無いため、 その場合のみ、ANSIX923 モードと同じ結果が返されます。
|