[go] go 언어의 공개키 기반 암호화 시스템 활용

암호화는 현대 정보 보안에서 중요한 역할을 합니다. 공개키 기반 암호화 시스템은 암호화와 복호화에 다른 키를 사용하여 안전한 통신을 보장합니다. 여기서는 go 언어를 사용하여 이러한 암호화 시스템을 구현하는 방법에 대해 알아보겠습니다.

go 언어로 공개키 생성하기

먼저, go 언어에서 공개키를 생성하는 방법을 살펴보겠습니다. rsa 패키지를 사용하여 쉽게 공개키를 생성할 수 있습니다.

package main

import (
	"crypto/rand"
	"crypto/rsa"
	"crypto/x509"
	"encoding/pem"
	"os"
)

func generateKey() error {
	privateKey, err := rsa.GenerateKey(rand.Reader, 2048)
	if err != nil {
		return err
	}

	privateKeyPEM := &pem.Block{Type: "RSA PRIVATE KEY", Bytes: x509.MarshalPKCS1PrivateKey(privateKey)}
	file, err := os.Create("private_key.pem")
	if err != nil {
		return err
	}
	defer file.Close()
	err = pem.Encode(file, privateKeyPEM)
	if err != nil {
		return err
	}

	publicKey := &privateKey.PublicKey
	publicKeyPEM, err := x509.MarshalPKIXPublicKey(publicKey)
	if err != nil {
		return err
	}
	file, err = os.Create("public_key.pem")
	if err != nil {
		return err
	}
	defer file.Close()
	err = pem.Encode(file, &pem.Block{Type: "PUBLIC KEY", Bytes: publicKeyPEM})
	if err != nil {
		return err
	}

	return nil
}

func main() {
	err := generateKey()
	if err != nil {
		panic(err)
	}
}

위 코드는 rsa 패키지를 사용하여 2048비트의 RSA 키 쌍을 생성하고, 개인 키와 공개 키를 각각 private_key.pempublic_key.pem 파일로 저장합니다.

go 언어로 데이터 암호화 및 복호화하기

이제 생성한 공개키를 사용하여 데이터를 암호화하고, 해당 데이터를 개인키로 복호화하는 방법에 대해 살펴보겠습니다.

package main

import (
	"crypto/rand"
	"crypto/rsa"
	"crypto/x509"
	"encoding/pem"
	"fmt"
)

func encryptAndDecrypt() error {
	publicKeyFile, err := os.ReadFile("public_key.pem")
	if err != nil {
		return err
	}

	block, _ := pem.Decode(publicKeyFile)
	if block == nil {
		return fmt.Errorf("failed to decode public key")
	}

	publicKey, err := x509.ParsePKIXPublicKey(block.Bytes)
	if err != nil {
		return err
	}

	rsaPublicKey, ok := publicKey.(*rsa.PublicKey)
	if !ok {
		return fmt.Errorf("invalid public key")
	}

	// 데이터 암호화
	encryptedData, err := rsa.EncryptPKCS1v15(rand.Reader, rsaPublicKey, []byte("Hello, World!"))
	if err != nil {
		return err
	}

	privateKeyFile, err := os.ReadFile("private_key.pem")
	if err != nil {
		return err
	}

	block, _ = pem.Decode(privateKeyFile)
	if block == nil {
		return fmt.Errorf("failed to decode private key")
	}

	privateKey, err := x509.ParsePKCS1PrivateKey(block.Bytes)
	if err != nil {
		return err
	}

	// 데이터 복호화
	decryptedData, err := rsa.DecryptPKCS1v15(rand.Reader, privateKey, encryptedData)
	if err != nil {
		return err
	}

	fmt.Println(string(decryptedData))

	return nil
}

func main() {
	err := encryptAndDecrypt()
	if err != nil {
		panic(err)
	}
}

위 코드는 public_key.pem에서 공개키를 읽고, 이를 사용하여 “Hello, World!” 문자열을 암호화합니다. 그 다음 private_key.pem에서 개인 키를 읽고, 암호화된 데이터를 복호화하여 출력합니다.

go 언어를 사용하여 공개키 기반 암호화 시스템을 구현하는 방법을 알아보았습니다. 이러한 기술은 안전한 통신 및 데이터 보호에 중요한 역할을 합니다.

참고문헌: