[go] Go 언어에서의 PGP 암호화

PGP(Pretty Good Privacy)는 전자 메일 보안을 위한 암호화 프로그램이다. Golang에서 PGP 암호화를 사용하여 안전한 전자 메일 통신 및 파일 보안을 구현할 수 있다.

PGP 라이브러리 설치

Golang에서 PGP 암호화를 구현하기 위해서는 crypto, openpgp와 같은 라이브러리가 필요하다. 이 라이브러리들은 go get 명령어를 통해 쉽게 다운로드하고 설치할 수 있다.

go get golang.org/x/crypto/openpgp

PGP 키 생성

PGP 키 쌍을 생성하는 방법은 다음과 같다.

package main

import (
	"crypto/rand"
	"log"
	"os"
	"golang.org/x/crypto/openpgp"
	"golang.org/x/crypto/openpgp/armor"
)

func main() {
	entity, err := openpgp.NewEntity("user", "comment", "user@example.com", nil)
	if err != nil {
		log.Fatal(err)
	}
	
	privateKeyFile, err := os.Create("privateKey")
	if err != nil {
		log.Fatal(err)
	}
	defer privateKeyFile.Close()
	
	w, err := armor.Encode(privateKeyFile, openpgp.PrivateKeyType, nil)
	if err != nil {
		log.Fatal(err)
	}
	defer w.Close()
	entity.SerializePrivate(w, nil)
	
	publicKeyFile, err := os.Create("publicKey")
	if err != nil {
		log.Fatal(err)
	}
	defer publicKeyFile.Close()
	
	w, err = armor.Encode(publicKeyFile, openpgp.PublicKeyType, nil)
	if err != nil {
		log.Fatal(err)
	}
	defer w.Close()
	entity.Serialize(w)
}

이 코드는 PGP 키 쌍을 생성하고 이를 파일로 저장하는 예시이다. 생성된 키는 안전한 곳에 보관해야 한다.

암호화 및 복호화

PGP 키 쌍을 생성한 후에는 암호화 및 복호화를 수행할 수 있다.

package main

import (
	"log"
	"os"
	"golang.org/x/crypto/openpgp"
)

func main() {
	// 키 파일 로드
	privateKeyRingFile, err := os.Open("privateKey")
	if err != nil {
		log.Fatal(err)
	}
	defer privateKeyRingFile.Close()
	
	privateEntityList, err := openpgp.ReadArmoredKeyRing(privateKeyRingFile)
	if err != nil {
		log.Fatal(err)
	}
	
	publicKeyRingFile, err := os.Open("publicKey")
	if err != nil {
		log.Fatal(err)
	}
	defer publicKeyRingFile.Close()
	
	publicEntityList, err := openpgp.ReadArmoredKeyRing(publicKeyRingFile)
	if err != nil {
		log.Fatal(err)
	}
	
	// 암호화
	plaintext, err := os.Create("plaintext.txt")
	if err != nil {
		log.Fatal(err)
	}
	defer plaintext.Close()
	plaintext.Write([]byte("Hello, Golang PGP!"))
	plaintext.Seek(0, 0)
	
	ciphertext, err := os.Create("ciphertext")
	if err != nil {
		log.Fatal(err)
	}
	defer ciphertext.Close()
	
	encryptor, err := openpgp.Encrypt(ciphertext, publicEntityList, nil, nil, nil)
	if err != nil {
		log.Fatal(err)
	}
	
	_, err = io.Copy(encryptor, plaintext)
	if err != nil {
		log.Fatal(err)
	}
	encryptor.Close()
	
	// 복호화
	ciphertext, err = os.Open("ciphertext")
	if err != nil {
		log.Fatal(err)
	}
	defer ciphertext.Close()
	
	md, err := openpgp.ReadMessage(ciphertext, privateEntityList, nil, nil)
	if err != nil {
		log.Fatal(err)
	}
	
	decoded, err := ioutil.ReadAll(md.UnverifiedBody)
	if err != nil {
		log.Fatal(err)
	}
	log.Println(string(decoded))
}

위의 코드는 키 파일을 로드하고, 텍스트를 암호화하여 복호화하는 과정을 나타낸다.

Golang을 사용하여 PGP 암호화를 구현하는 방법에 대해 간략히 알아보았다. PGP는 보안이 중요한 통신에 유용하게 활용될 수 있는 기술이다.

더 많은 정보와 라이브러리 사용법은 공식 Golang Cryptography 페이지에서 확인할 수 있다.