Skip to content

Instantly share code, notes, and snippets.

@KEINOS
Last active March 2, 2024 18:05
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save KEINOS/cf7f291c5d92767f065986a94d4db4d7 to your computer and use it in GitHub Desktop.
Save KEINOS/cf7f291c5d92767f065986a94d4db4d7 to your computer and use it in GitHub Desktop.
[Golang]: Simple example of Diffie–Hellman key exchange

ディフィー・ヘルマン鍵共有の概念 with Go

package main

import "fmt"

// Public constant
const (
	g = 2  // 基数
	p = 97 // devisor, 法, 割る数 (g < p で、素数であること)
)

func main() {
	// Bob's secret key
	x := 15
	// Bob's public key (0 < i < p)
	i := (g ^ x) % p

	fmt.Println("Bob secret:", x)
	fmt.Println("Bob public:", i)

	// Alice's secret key
	y := 10
	// Alice's public key (0 < j < p)
	j := (g ^ y) % p

	fmt.Println("Alice secret:", y)
	fmt.Println("Alice public:", j)

	// Bob's shared secret calculation from Alice's public key
	bobKey := (j ^ x) % p

	fmt.Println("Bob shared secret:", bobKey)

	// Alice's shared secret calculation from Bob's public key
	aliceKey := (i ^ y) % p

	fmt.Println("Alice shared secret:", aliceKey)
	// Output:
	// Bob secret: 15
	// Bob public: 13
	// Alice secret: 10
	// Alice public: 8
	// Bob shared secret: 7
	// Alice shared secret: 7
}

Ref:

package main
import (
"crypto/ecdh"
"crypto/rand"
"fmt"
)
func main() {
// --------------------------------------------------------------
// AliceとBobの事前合意
// --------------------------------------------------------------
// Alice と Bob の事前合意。
// 共通パラメーターとして NIST P-384 の曲線を使用する、とする。選択肢は:
// P256, P384, P521, X25519
paramCommon := ecdh.P384()
// --------------------------------------------------------------
// Alice の公開鍵暗号のペア鍵作成
// --------------------------------------------------------------
alicePrivKey, err := paramCommon.GenerateKey(rand.Reader)
panicOnErr(err)
fmt.Printf("Alice Priv: %x\n", alicePrivKey.Bytes())
alicePubKey := alicePrivKey.PublicKey()
fmt.Printf("Alice Pub: %x\n", alicePubKey.Bytes())
// --------------------------------------------------------------
// Bob の公開鍵暗号のペア鍵作成
// --------------------------------------------------------------
bobPrivKey, err := paramCommon.GenerateKey(rand.Reader)
panicOnErr(err)
fmt.Printf("Bob Priv: %x\n", bobPrivKey.Bytes())
bobPubKey := bobPrivKey.PublicKey()
fmt.Printf("Bob Pub: %x\n", bobPubKey.Bytes())
// --------------------------------------------------------------
// 各々の共通秘密鍵の生成
// --------------------------------------------------------------
// Alice が、相手の公開鍵と自身の秘密鍵で 2 者間の共通秘密鍵(aliceSecret)
// を作成。
aliceSecret, err := alicePrivKey.ECDH(bobPubKey)
panicOnErr(err)
fmt.Printf("Alice's Shared Secret: %x\n", aliceSecret)
// Bob が、相手の公開鍵と自身の秘密鍵で 2 者間の共通秘密鍵(bobSecret)を作成。
bobSecret, err := bobPrivKey.ECDH(alicePubKey)
panicOnErr(err)
fmt.Printf("Bob's Shared Secret : %x\n", bobSecret)
}
// panicOnErr は、err が nil でない場合にエラーを表示し、プログラムを終了します。
func panicOnErr(err error) {
if err != nil {
panic(err)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment