質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

暗号化

ネットワークを通じてデジタルデータをやり取りする際に、第三者に解読されることのないよう、アルゴリズムを用いてデータを変換すること。

Q&A

解決済

1回答

1417閲覧

暗号化モジュールのivに0を指定したい

anrakusan

総合スコア35

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

暗号化

ネットワークを通じてデジタルデータをやり取りする際に、第三者に解読されることのないよう、アルゴリズムを用いてデータを変換すること。

0グッド

0クリップ

投稿2016/02/16 03:23

編集2016/02/16 04:08

ivを0に設定するために最初は0埋めしたバイナリ文字列を指定しようと考え、以下の二つの設定方法を考えました。

php

1$iv1 = "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0";

php

1$iv2 = pack("nvc*", 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);

です。
それぞれのivを利用して出来た暗号文は同じものです。

php

1<?php 2 3$text = "秘密の言葉"; 4$key = "秘密の鍵"; 5 6$iv1 = "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"; 7$iv2 = pack("nvc*", 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0); 8 9$enc = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $text, MCRYPT_MODE_CBC, $iv1); 10echo base64_encode($enc); 11 12echo base64_encode($iv1)." ".base64_encode($iv2); 13// output どちらのivを使っても出力は変わらない 14// pUNFp+g0wKGhHpJtFy8G4w==

ですが調べてみると二つのivの値(バイナリ)は厳密には違うようです。

php

1echo base64_encode($iv1)."\n".base64_encode($iv2); 2// output 3// AAAAAAAAAAAAAAAAAAAAAA== 4// AAAAAAAAAAAAAAAAAAAAAAAA

この二つの出力が違うのはなぜでしょうか?
また、二つが違う値であれば生成される暗号文が同じになるのはなぜでしょうか?
ご存知の方がいれば教えていただけると幸いです。

PHPのバージョン:5.4.45

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

この二つの出力が違うのはなぜでしょうか?

iv2 は packnvc* なので、先頭の2つは 16 ビット(2バイト)でパックされます。なので 21 + 21 + 1*14 で、合計で 18 バイトになります。

<?php $iv1 = "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"; $iv2 = pack("nvc*", 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0); printf("iv1: %d %s\n", strlen($iv1), base64_encode($iv1)); printf("iv2: %d %s\n", strlen($iv2), base64_encode($iv2));

次のような結果になります。

iv1: 16 AAAAAAAAAAAAAAAAAAAAAA== iv2: 18 AAAAAAAAAAAAAAAAAAAAAAAA

また、Base64 エンコードは文字長が4の倍数になるようにするために = が付与されるため、iv1 の終端に = が現れています。

また、二つが違う値であれば生成される暗号文が同じになるのはなぜでしょうか?

PHP 7.0.2 だと $iv2 だと下記のメッセージが表示されるので、おそらく 16 バイトよりも大きいぶんは無視されています。

PHP Warning: mcrypt_encrypt(): Received initialization vector of size 18, but size 16 is required for this encryption mode

投稿2016/02/16 03:45

ngyuki

総合スコア4514

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

anrakusan

2016/02/16 11:27

>iv2 は pack が nvc* なので、先頭の2つは 16 ビット(2バイト)でパックされます。 なるほど、よく分かりませんが確かに両方で長さが違うようですね。 >PHP 7.0.2 だと $iv2 だと下記のメッセージが表示されるので、おそらく 16 バイトよりも大きいぶんは無視されています。 よく見たら僕が使っているPHP5.4.45でも似たようなWarningが出ていました。 (バージョン書き忘れていました) 疑問がかなりすっきりしました、ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問