ブロック暗号のCBCモードは1ビットでも変化すると、それ以降の暗号文すべてが変化します。逆に言えば共通のパラメータを先頭に配置して結合する事で、暗号文も途中までは同じになり圧縮率を改善出来ます。
検証
- 前提条件
下記コマンドを使えるようにインストールしてください- openssl
- gzip
- bash シェルスクリプト
1234567891011121314151617181920212223242526272829303132#! /bin/bash# 暗号化に使用するKEYとIVKEY=$(openssl rand -hex 16)IV=$(openssl rand -hex 16)# 共通のパラメータCOMMON_PARAM=$(openssl rand -hex 150)# テキストを生成UNOPTIMIZED_TEXT="";OPTIMIZED_TEXT="";for i in {1..5}; do# 固有のパラメータSPECIFIC_PARAM=$(openssl rand -hex 150)# 固有のパラメータが前にあるので、暗号化後のテキストに共通性がないUNOPTIMIZED_URL="https://exmple.com/p="$(echo "${SPECIFIC_PARAM}${COMMON_PARAM}" | openssl aes-128-cbc -e -A -base64 -iv ${IV} -K ${KEY})UNOPTIMIZED_TEXT+=${UNOPTIMIZED_URL}# 共通のパラメータが前にあるので、暗号化後のテキストにおいて前半部分は同じOPTIMIZED_URL="https://exmple.com/p="$(echo "${COMMON_PARAM}${SPECIFIC_PARAM}" | openssl aes-128-cbc -e -A -base64 -iv ${IV} -K ${KEY})OPTIMIZED_TEXT+=${OPTIMIZED_URL}doneecho "圧縮前のサイズは同じ"echo ${UNOPTIMIZED_TEXT} | wc -cecho ${OPTIMIZED_TEXT} | wc -cecho "圧縮後は最適化した方がサイズが小さい"echo ${UNOPTIMIZED_TEXT} | gzip -c | wc -cecho ${OPTIMIZED_TEXT} | gzip -c | wc -c - 結果
123456圧縮前のサイズは同じ41664166圧縮後は最適化した方がサイズが小さい31401996