Keito

© 2024 Keito

技術ブログとポートフォリオ

【Go】XOR暗号を使用した暗号化、復号化のサンプルコード

更新日2025/3/20/(木) 10:35
タグ
Go暗号

概要

暗号技術入門 第3版に出てきたXOR暗号で暗号化、復号化をGoで実装してみた

サンプルコード

package main import ( "crypto/rand" "encoding/hex" "fmt" ) // XOR暗号化・復号化を行う関数 // data: 暗号化または復号化する平文または暗号文 // key: 使用する鍵 // XOR演算を適用し、暗号化または復号化した結果を返す func xorEncryptDecrypt(data, key string) string { dataBytes := []byte(data) // 平文または暗号文をバイト列に変換 keyBytes := []byte(key) // 鍵をバイト列に変換 output := make([]byte, len(dataBytes)) // 出力用のバイト列を準備 keyLength := len(keyBytes) // 鍵の長さを取得 // XOR演算を各バイトに対して適用 for i := 0; i < len(dataBytes); i++ { output[i] = dataBytes[i] ^ keyBytes[i%keyLength] // i番目のデータバイトと鍵バイトをXOR } // 結果を文字列として返す return string(output) } // 文字列をバイナリ形式の文字列に変換 func toBinaryString(data string) string { binaryStr := "" for _, c := range data { binaryStr += fmt.Sprintf("%08b ", c) } return binaryStr } // 平文と同じ長さの鍵を生成する関数 func generateRandomKey(length int) (string, error) { key := make([]byte, length) _, err := rand.Read(key) if err != nil { return "", err } return string(key), nil } func main() { plaintext := "HelloWorld" key, err := generateRandomKey(len(plaintext)) // 平文と同じ長さの鍵を生成 if err != nil { fmt.Println("ランダム鍵の生成に失敗しました:", err) return } fmt.Printf("平文: %s\n", plaintext) fmt.Printf("暗号文: %s\n", hex.EncodeToString([]byte(encrypted))) // 復号化は暗号化と同じ操作を行う(XORは可逆操作) decrypted := xorEncryptDecrypt(encrypted, key) fmt.Printf("復号文: %s\n", decrypted) } // 出力 // 平文 : HelloWorld // 暗号文: 294fd36b7622b728ab71 // 復号文: HelloWorld