클라우드 타고 포트와 파도
article thumbnail

개요

이번 테스트에서는 Go 언어와 nCipher HSM을 연동해, RSA 공개키로 메시지를 암호화하고, 개인키로 복호화하는 과정을 직접 구현해봤습니다.

이전 글에서 사용했던 RSA 키쌍(label: test2)을 그대로 사용하며, pkcs11 인터페이스를 통해 다음과 같은 흐름으로 작업을 진행합니다:

  1. 메시지 파일 생성
  2. 공개키로 암호화
  3. 개인키로 복호화 (HSM 내부 연산)

RSA 암복호화는 개인키가 절대로 외부로 노출되지 않아야 하는 보안 상황에서 매우 유용합니다. 특히 복호화는 반드시 HSM 내부에서 수행되어야 하며, 개인키는 HSM 장비 밖으로 가져올 수 없습니다.

 

테스트 메시지 준비

테스트에 사용할 평문 메시지를 생성합니다:

sudo bash -c 'echo "이건 RSA 암호화 테스트 메시지입니다." > message.txt'

생성된 message.txt는 뒤에서 암호화할 대상 파일이며, 테스트 완료 후 복호화 결과(decrypted.txt)와 동일해야 합니다.

🔐 참고: RSA는 짧은 길이의 데이터(수백 byte 이하)만 직접 암호화 가능합니다. 긴 데이터는 일반적으로 AES 대칭키로 암호화하고, 그 키를 RSA로 암호화하는 하이브리드 방식을 사용합니다.

 

공개키 암호화 (encrypt.go)

이전 테스트에서 추출한 test_pub.pem 공개키 파일을 사용해 메시지를 암호화합니다.

주요 처리 흐름:

  • 공개키 PEM 파일(test_pub.pem) 로딩
  • 메시지 파일(message.txt) 로딩
  • RSA PKCS#1 v1.5 방식으로 암호화
  • 암호문(enc_data.bin)으로 저장
// 공개키 로딩
pubBytes, _ := ioutil.ReadFile("test_pub.pem")
block, _ := pem.Decode(pubBytes)
rsaPub, _ := x509.ParsePKIXPublicKey(block.Bytes)

 

// 암호화 및 저장
enc, _ := rsa.EncryptPKCS1v15(rand.Reader, rsaPub.(*rsa.PublicKey), msg)
os.WriteFile("enc_data.bin", enc, 0644)

Go 표준 라이브러리 crypto/rsa 패키지를 활용해 암호화를 수행합니다. 이 라이브러리는 공개키 암호화를 위한 EncryptPKCS1v15 함수를 제공하며, 보안적으로 안전한 랜덤 소스를 사용합니다.

공개키는 누구나 접근 가능하기 때문에, 메시지를 암호화하는 작업은 HSM 없이도 수행할 수 있습니다.

 

HSM 복호화 (decrypt.go) 

복호화는 반드시 HSM 내부에서 수행되어야 하며, 개인키는 장비 외부로 절대 추출되지 않습니다. Go에서 miekg/pkcs11 라이브러리를 사용하여 HSM과 통신합니다.

  • nCipher PKCS#11 모듈 초기화
  • label이 test2인 RSA 개인키 검색 
  • 암호문 로딩 
  • CKM_RSA_PKCS 메커니즘으로 복호화
  • 결과를 decrypted.txt에 저장
// 개인키 객체 찾기
template := []*pkcs11.Attribute{
    pkcs11.NewAttribute(pkcs11.CKA_LABEL, "test2"),
    pkcs11.NewAttribute(pkcs11.CKA_CLASS, pkcs11.CKO_PRIVATE_KEY),
}
p.FindObjectsInit(session, template)
objs, _, _ := p.FindObjects(session, 1)

 

// 복호화 수행
p.DecryptInit(session, []*pkcs11.Mechanism{
    pkcs11.NewMechanism(pkcs11.CKM_RSA_PKCS, nil),
}, objs[0])
dec, _ := p.Decrypt(session, enc)
os.WriteFile("decrypted.txt", dec, 0644)
복호화 연산은 HSM 내부에서만 실행되며, 외부에서는 복호화할 수 없습니다.

 

결과 확인 

정상적으로 암호화와 복호화가 수행되었다면, 다음과 같은 출력이 나타납니다:

공개키 암호화 완료 → enc_data.bin  
HSM 복호화 완료 → decrypted.txt

복호화된 파일 확인:

cat decrypted.txt
# 출력: 이건 RSA 암호화 테스트 메시지입니다.

 

정리 및 결론

항목 설명
키 생성 기존 RSA 키쌍(test2) 사용
암호화 공개키로 메시지를 암호화 (Go crypto/rsa)
복호화 HSM 내부의 개인키로만 복호화 수행
보안성 개인키는 절대 외부로 추출되지 않음

이번 테스트를 통해, HSM의 비밀키 보호 특성과 Go 언어로 암복호화 전 과정을 자동화할 수 있는 능력을 확인할 수 있었습니다. 금융, 인증 시스템 등 민감한 정보 보호가 필요한 분야에서 강력한 보안 방안을 적용할 수 있습니다.

profile

클라우드 타고 포트와 파도

@cloudwave

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!