Perl日記

日々の知ったことのメモなどです。Perlは最近やってないです。

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文字数までは暗号化で値が変わっている。


伝統的ってどういうことなんだろ。