MySQLのAES_ENCRYPTで暗号化を試す機会があり、暗号化後のデータ長を試算したときのメモ。
環境
- MySQL5.6
想定ケース
- aes-256-cbc
- AES_ENCRYPT関数で暗号化した値はHEXで16進数へ変換
- 初期化ベクトルはRANDOM_BYTES(16)で生成し、HEXで16進数へ変換して暗号化した値に付加
- 文字コードはutf8
計算
MySQLの公式リファレンスマニュアルによると、暗号化後の長さは以下の式で計算できるとある。
16 * (trunc(string_length / 16) + 1)
今回は暗号化したバイナリの値をHEXで16進数へ変換するので2倍し、
さらに同じく16進数へ変換した初期化ベクトルを付与するので16*2を加算する。
16 * (trunc(string_length / 16) + 1) * 2 + 16 * 2
string_lengthは、文字数 * 1文字のbyte数で計算。
検証
平文「あいうえおかきくけこさしすせそ12345678901234567890」を暗号化。
期待値:16 * (trunc((15 * 3 + 20) / 16) + 1) * 2 + 16 * 2 = 192
mysql> SET @iv=RANDOM_BYTES(16);
Query OK, 0 rows affected (0.00 sec)
mysql> select CHAR_LENGTH(CONCAT(HEX(@iv), HEX(AES_ENCRYPT('あいうえおかきくけこさしすせそ12345678901234567890', SHA2('password',512), @iv)))) as length;
+--------+
| length |
+--------+
| 192 |
+--------+
1 row in set (0.00 sec)