crypt()で少しはまった
自分用メモ。
crypt()を使って暗号化していたのだけれど、途中から返される値が変わらなくなった。
my $key = 'enoden'; my $word; for my $alphabet ('a' .. 'z') { $word .= $alphabet; say crypt($word, $key), " [$word]"; }
enkDmZCt3oHc2 [a] endoxO49Y1n22 [ab] en9vbnalA6/ts [abc] enlxO3DjgmHHo [abcd] enC9/oS746PWU [abcde] en5QC7646JO2s [abcdef] enfg0Spw9hduA [abcdefg] enFv.wNa4iNAA [abcdefgh] enFv.wNa4iNAA [abcdefghi] enFv.wNa4iNAA [abcdefghij] enFv.wNa4iNAA [abcdefghijk] enFv.wNa4iNAA [abcdefghijkl] enFv.wNa4iNAA [abcdefghijklm] enFv.wNa4iNAA [abcdefghijklmn] enFv.wNa4iNAA [abcdefghijklmno] enFv.wNa4iNAA [abcdefghijklmnop] enFv.wNa4iNAA [abcdefghijklmnopq] enFv.wNa4iNAA [abcdefghijklmnopqr] enFv.wNa4iNAA [abcdefghijklmnopqrs] enFv.wNa4iNAA [abcdefghijklmnopqrst] enFv.wNa4iNAA [abcdefghijklmnopqrstu] enFv.wNa4iNAA [abcdefghijklmnopqrstuv] enFv.wNa4iNAA [abcdefghijklmnopqrstuvw] enFv.wNa4iNAA [abcdefghijklmnopqrstuvwx] enFv.wNa4iNAA [abcdefghijklmnopqrstuvwxy] enFv.wNa4iNAA [abcdefghijklmnopqrstuvwxyz]
8文字数までは変わるけど、9文字数からはずっと同じ。
あれ、これって仕様なんだっけ?、と思ってperldocしてみたら、仕様だった。
crypt - perldoc.perl.org
Traditionally the result is a string of 13 bytes: two first bytes of the salt, followed by 11 bytes from the set "[./0-9A-Za-z]", and only the first eight bytes of PLAINTEXT mattered. But alternative hashing schemes (like MD5), higher level security schemes (like C2), and implementations on non-Unix platforms may produce different strings.
超普通訳
伝統的に結果は13バイトの文字列である:それは、salt(鍵にした文字列)の初めの2バイト、続いて[./0-9A-Za-z]の中から11バイトであり、PLAINTEXT(暗号化する文字列)の初めの八バイトだけが意味をもつ。しかし、別のハッシュ方法(MD5のような)や、高レベルセキュリティ方法(C2のような)、非UNIXプラットフォーム上の実装では違う文字列が生成されるかもしれない。
なるほど、確かに暗号化した文字列の初めの2文字はキーの初めの2文字であり、暗号化した文字列が8文字数までは暗号化で値が変わっている。
伝統的ってどういうことなんだろ。