【Go】crypto/rsaを使用して暗号化、復号化を実装してみた
更新日:2025/4/3/(木) 14:46
タグ:Go、暗号
概要
- 暗号技術入門 第3版に出てきたRSA暗号を使用した暗号化、復号化を実装してみた
- crypto/rsaを使用
サンプルコード
package rsademo import ( "crypto/rand" "crypto/rsa" "crypto/sha256" "encoding/base64" "fmt" "log" ) // RSAによる暗号化 func encryptRSA(pub *rsa.PublicKey, message string) (string, error) { ciphertext, err := rsa.EncryptOAEP(sha256.New(), rand.Reader, pub, []byte(message), nil) if err != nil { return "", err } return base64.StdEncoding.EncodeToString(ciphertext), nil } // RSAによる復号化 func decryptRSA(priv *rsa.PrivateKey, ciphertext string) (string, error) { decodedCiphertext, err := base64.StdEncoding.DecodeString(ciphertext) if err != nil { return "", err } plaintext, err := rsa.DecryptOAEP(sha256.New(), rand.Reader, priv, decodedCiphertext, nil) if err != nil { return "", err } return string(plaintext), nil } func main() { // RSA鍵ペアを生成 privateKey, err := rsa.GenerateKey(rand.Reader, 2048) if err != nil { log.Fatalf("鍵ペアの生成に失敗しました: %v", err) } publicKey := &privateKey.PublicKey // 平文 message := "Hello, World!" // 暗号化 ciphertext, err := encryptRSA(publicKey, message) if err != nil { log.Fatalf("暗号化に失敗しました: %v", err) } fmt.Println("暗号化されたデータ:", ciphertext) // 復号化 decryptedMessage, err := decryptRSA(privateKey, ciphertext) if err != nil { log.Fatalf("復号化に失敗しました: %v", err) } fmt.Println("復号化されたデータ:", decryptedMessage) } // 出力 // 暗号化されたデータ: RAAYXaNj4lLeGpoBq3hjEmVQwVyQJdREK9jA8X56jwgGit6NB4ygvHtog7coZ1e72TPfkRDjbjUrL4gXKnVi6JjcfBwnBRIzxDnT5V4baceIfE4rlJFFv0g8Ut6vFLDPiKWnsmfqAu8Vmt2iejP6r8cADdwkK8HMs4/bH+VSzzDgabQJOeT7p4/i5xTynNZifrH2hYK7lwrh6FwojDMex/gb1XxQrtpwseZdYxZqB/YgYQNZY/DHnQYZ3QL3Ev6e68qPUvUqAsg7qWZ3SlyfEu7nWQhUslB6C6mAVohpNbQ+Ks5rjG1u8yE5Q7PJVDmDJutpXerL1dd0z4I1vb1F3A== // 復号化されたデータ: Hello, RSA Encryption!