要素の結合

例えば,A,B,C という 3つの要素を,カンマでくっつけたいと思います

簡単に思いつくのが,ループで次々連結していく,という方法です

しかし,この方法には問題があって,要素の個数ループをまわすと,カンマも同じ個数付く事になります.つまり,要素が 3つなら,カンマも 3つ.最初か最後に邪魔なカンマが入ることになります

このカンマ,必ず入るのが分かっているので,最後に文字列処理で取り除く,というソリューションが考えられます

もう一つが,要素を配列に入れて,配列をカンマで結合する,という方法です

これはスッキリとしたソリューションです.しかし,要素数が多いと配列のサイズが大きくなります

暗号化の強度

暗号化には,アルゴリズムと鍵,という要素があります.暗号化の強度を決めるのは,アルゴリズムと鍵とそれを扱う人間の行動の3点がメインの要素です

例えば,アルゴリズムの比較,例えば,zipの暗号化と,AES256 のどちらが強度が高いでしょうか?という質問は,アルゴリズム以外の,鍵と行動が同じという前提であれば,zip < AES256 という回答ができます

しかし,例えば zip の暗号化では,鍵はしっかりした鍵長があり,辞書アタックにも耐えられ,かつしかるべき手段で取り扱われている状況と,AES256 の暗号化だけど,鍵は辞書に載った簡単な短い文字列で,その鍵はメイル本文に書いてある,なんて状況を比較したら,どちらが暗号化の強度として高いかは議論できません


暗号化と復号には,鍵を使いますが,この鍵にはパスフレーズを使うアルゴリズムが多いので,暗号化されたデータを不正に復号するには,イコールパスフレーズを探す事,と考えて良いと思います(パスフレーズとは違う鍵もあります)


アルゴリズム単体で暗号化強度の高い AES256 を使ったとしても,復号の鍵である,パスフレーズが分かってしまえば,その復号は何も困難ではありません

このパスフレーズは,ホンモノを知らなくても,ある程度予測する技術があります.これは,辞書アタックと呼ばれる手法なのですが,パスフレーズには,よく使われる文字列に法則があることから,パスフレーズと思われる文字列を順にパスフレーズと仮定して復号を試みる,ということを行います

分かりやすい例で言うと,銀行口座の暗証番号が,数字4文字だとします.苦労しますが,0000,0001,0002 と入れていけば,平均,5,000回試せば,どこかで本当の暗証番号に当たりますよね.銀行口座と違って,コンピュータは非常に高速にこういうことを試せるので,パスフレーズが短いと,すぐに突き止められてしまいます

この辞書アタックを行う場合も,AES256 などは復号に計算量を必要とするアルゴリズムのため,1回ごと試すのに時間が掛かるため,パスフレーズを突き止めるまで時間が掛かります.DES などの古いアルゴリズムは,復号に掛かる計算量が少ないため,同じ時間で,より多くの文字列を試す事ができます


辞書アタックを避ける方法として,

・大文字,小文字,数字,記号を必ず全て使う
・文字長を長く取る
・意味の無い文字列にする

というポリシーが良いと思います.しかし難しくする事で,今度は,パスフレーズを紙にメモしたりする人が出てきます.これでは,パスフレーズを工夫した意味がなくなります(3つの要素のうち,行動に問題がある)


辞書アタックは,パスフレーズを求めるクラック手法ですが,それ以外にも,アルゴリズム自体の脆弱性を付いたクラック手法もあり,以前の質問で出た,パスワード付 zip が劣る要因としては,アルゴリズム自体に脆弱性があるためです

アルゴリズム脆弱性の議論については経験則でしかなく,"誰かが発見" するか否か,です.多くの人が使ってるにも関わらず,長時間脆弱性が発見されないから暗号化強度が高い,という結論になります