[go] 파일 경로에서 파일 암호화하기

파일을 암호화하는 방법 중 하나는 Golang을 사용하여 파일을 읽고 쓰는 동안 간단한 암호화/복호화 작업을 수행하는 것입니다. 이를 위해 우리는 crypto 패키지를 사용할 것입니다.

파일 암호화 구현

먼저, 공개키와 비밀키를 생성해야 합니다. 그런 다음 공개키를 사용하여 파일을 암호화하고 비밀키를 사용하여 해당 파일을 복호화할 것입니다. 아래 예제에서 이러한 작업을 수행하는 방법을 살펴보겠습니다.

package main

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

func generateKeyPair() (*rsa.PrivateKey, []byte, error) {
	privKey, err := rsa.GenerateKey(rand.Reader, 2048)
	if err != nil {
		return nil, nil, err
	}

	privDER := x509.MarshalPKCS1PrivateKey(privKey)

	privBlock := &pem.Block{
		Type:  "RSA PRIVATE KEY",
		Bytes: privDER,
	}

	privFile, err := os.Create("private.pem")
	if err != nil {
		return nil, nil, err
	}

	if err := pem.Encode(privFile, privBlock); err != nil {
		return nil, nil, err
	}

	privFile.Close()

	pubKey := &privKey.PublicKey
	pubDER, err := x509.MarshalPKIXPublicKey(pubKey)
	if err != nil {
		return nil, nil, err
	}

	pubBlock := &pem.Block{
		Type:  "RSA PUBLIC KEY",
		Bytes: pubDER,
	}

	pubFile, err := os.Create("public.pem")
	if err != nil {
		return nil, nil, err
	}

	if err := pem.Encode(pubFile, pubBlock); err != nil {
		return nil, nil, err
	}

	pubFile.Close()

	return privKey, pubDER, nil
}

func encryptFile(inFile string, outFile string, pubKey []byte) error {
	data, err := ioutil.ReadFile(inFile)
	if err != nil {
		return err
	}

	block, _ := pem.Decode(pubKey)
	if block == nil {
		return errors.New("failed to decode public key")
	}

	pub, err := x509.ParsePKIXPublicKey(block.Bytes)
	if err != nil {
		return err
	}
	rsaPub, ok := pub.(*rsa.PublicKey)
	if !ok {
		return errors.New("failed to parse public key")
	}

	ciphertext, err := rsa.EncryptPKCS1v15(rand.Reader, rsaPub, data)
	if err != nil {
		return err
	}

	if err = ioutil.WriteFile(outFile, ciphertext, 0644); err != nil {
		return err
	}

	return nil
}

func decryptFile(inFile string, outFile string, privKey *rsa.PrivateKey) error {
	ciphertext, err := ioutil.ReadFile(inFile)
	if err != nil {
		return err
	}

	plainText, err := rsa.DecryptPKCS1v15(rand.Reader, privKey, ciphertext)
	if err != nil {
		return err
	}

	if err = ioutil.WriteFile(outFile, plainText, 0644); err != nil {
		return err
	}

	return nil
}

func main() {
	privKey, pubKey, err := generateKeyPair()
	if err != nil {
		panic(err)
	}

	err = encryptFile("input.txt", "encrypted.txt", pubKey)
	if err != nil {
		panic(err)
	}

	err = decryptFile("encrypted.txt", "decrypted.txt", privKey)
	if err != nil {
		panic(err)
	}
}

위의 예제에서는 generateKeyPair, encryptFile, 및 decryptFile 함수를 정의하여 키 쌍을 생성하고 파일을 암호화/복호화합니다. 그 후에 main 함수에서 이러한 함수들을 호출하여 암호화된 파일을 생성하고 다시 복호화합니다.

위 코드를 실행하면 “input.txt” 파일이 암호화되어 “encrypted.txt” 파일로 생성되고, 다시 “decrypted.txt” 파일로 복호화됩니다.

이제 Golang을 사용하여 파일을 암호화하고 복호화하는 간단한 방법을 살펴봤습니다. 이러한 기술을 사용하여 데이터를 안전하게 보호할 수 있습니다!