Diffie-Hellman鍵交換。
AliceとBobは、Diffie-Hellman鍵交換を使って秘密を共有します。 まず素数から始め、秘密鍵を選び、公開鍵を生成して共有し、最後に共有の秘密鍵を生成します。
テストプログラムが素数pとgを用意します。
Aliceは、1より大きくpより小さい秘密鍵aを選びます。
Bobも同じようにして、秘密鍵bを選びます。
Aliceは公開鍵Aを計算します。
A = gᵃ mod p
同じpとgを使って、Bobも自分の秘密鍵bから同様に公開鍵Bを計算します。
AliceとBobは公開鍵を交換します。
Aliceは秘密鍵sを計算します。
s = Bᵃ mod p
Bobは次のように計算します。
s = Aᵇ mod p
計算の結果は同じになります!
これでAliceとBobは、秘密のsを共有できます。
randomとsecretsのどちらを使うべき?Python 3.6以降、「ランダム」な数値を生成するためのモジュールが2つあります。
randomというモジュールは疑似ランダムです。つまり、真のランダム性を生成するのではなく、ランダム性を_シミュレート_するアルゴリズムに従っています。
こうした「乱数」は既知のアルゴリズムで生成されるため、真にランダムとは言えません。
その結果、まさに疑似ランダムであるという理由から、randomモジュールは暗号技術には適しておらず、使うべきではありません。
secretsというモジュールは、暗号学的に強力な「乱数」を生成し、暗号技術に求められるより高い安全性を提供します。
厳密な意味では、これらも依然として疑似ランダムです。ただし、生成される数値が絶対に予測不可能であるという保証があります。
これはあくまで練習用の演習なので、randomモジュールを使ってもかまいません。ただし、実際に暗号技術に使うと非常に危険であることに注意してください。