この scrypt実装を使用して、Go を使用して決定論的にパスワードを生成するための単純な gode を実装しました。私のコードはここにあります。これは関連部分の抜粋です:
const keyLen = 8
// recommended cost parameters for interactive login in 2009
const N = 16384
const r = 8
const p = 1
func main() {
dk, _ := scrypt.Key([]byte("mypassword"), []byte("mysalt"), N, r, p, keyLen)
for _, v := range dk {
fmt.Printf("%x ", v)
}
fmt.Println()
}
コードを実行すると、次の出力が得られます。
19 e5 59 39 fe 1 2b ef
ただし、C 実装ベースの libscryptを試したところ、同じ出力は得られませんでした。私は得るでしょう:
68 56 66 b2 86 19 2f 6e
C コードはここにあり、これが主要部分です。
int N = 16384;
int r = 8;
int p = 1;
const int keyLen = 8;
int main(void) {
unsigned char digest[keyLen];
const unsigned char password[] = "mypassword";
const unsigned char salt[] = "mysalt";
libscrypt_scrypt(password, sizeof(password), salt, sizeof(salt), N, r, p, digest, keyLen);
for (int i = 0; i < keyLen; ++i) {
printf("%x ", digest[i]);
}
printf("\n");
return 0;
}
また、さらに別の実装scrypt-janeにも出会いました。これは、ハッシュ時にさらに別の結果をもたらしました。これはおそらく、scrypt jane を使用すると、使用するハッシュ関数を選択できるためだと思います。いずれの場合もランダムソルトは使用しませんでした。
ここで検証しようとしている私自身の予感は、scrypt で使用されるハッシュ関数に関する明確な基準がないということです。もしそうなら、Go、C、python、または JavaScript での実装がすべて同じ結果を生成するようにするにはどうすればよいですか? 暗号化では危険なビジネスであることを理解しているため、コードを自分で移植することは避けています。