이번엔 Golang에서 제공되는 라이브러리를 이용하여 AES CFB 암호화를 하고 Base64로 인코딩 하였다.
암호화 이론은.... 설명할 수준까지는 안되기에 다른 자료나 블로그들을 참조하였다
CFB로 암호화하고 Binary 데이터를 String 형태로 변경하는 Base64까지 적용하였다.
실행할 때 Key값을 인자로 넣고 실행을 한다.
그 후, 암호화할 내용들을 입력하면 끝 !
Base64를 적용하지 않으려면 EncryptAESCFB까지만 진행하면 된다.
윈도우용으로 사용하려면 크로스 컴파일 하면 무난히 사용 가능할 듯 하다.
- 소스코드
// main.go
package main
import (
"bufio"
"crypto/aes"
"crypto/cipher"
"crypto/md5"
"encoding/base64"
"fmt"
"os"
)
var iv = []byte{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F}
func main() {
keyValue := os.Args[1]
key := make([]byte, 16)
md5Key := md5.Sum([]byte(keyValue))
for i, v := range md5Key {
key[i] = v
}
scanner := bufio.NewScanner(os.Stdin)
for scanner.Scan() {
ucl := scanner.Text()
fmt.Println("----------------------------------")
fmt.Println("Plain Data : ")
fmt.Printf("[")
for i, val := range ucl {
if i == len(ucl)-1 {
fmt.Printf("0x%02X", val)
} else {
fmt.Printf("0x%02X, ", val)
}
}
fmt.Printf("]\n")
fmt.Println(ucl)
encrypted := make([]byte, len(ucl))
err := EncryptAESCFB(encrypted, []byte(ucl), key, iv)
if err != nil {
panic(err)
}
fmt.Println("\nEncrypted Data : ")
fmt.Printf("[")
for i, val := range encrypted {
if i == len(encrypted)-1 {
fmt.Printf("0x%02X", val)
} else {
fmt.Printf("0x%02X, ", val)
}
}
fmt.Printf("]\n")
// fmt.Printf("[ 0x% X, ]\n", encrypted)
fmt.Println(string(encrypted))
sEnc := base64.StdEncoding.EncodeToString(encrypted)
fmt.Println("\nbase64 Data :")
fmt.Printf("[")
for i, val := range sEnc {
if i == len(sEnc)-1 {
fmt.Printf("0x%02X", val)
} else {
fmt.Printf("0x%02X, ", val)
}
}
fmt.Printf("]\n")
fmt.Println(sEnc)
}
}
func EncryptAESCFB(dst, src, key, iv []byte) error {
aesBlockEncrypter, err := aes.NewCipher([]byte(key))
if err != nil {
return err
}
aesEncrypter := cipher.NewCFBEncrypter(aesBlockEncrypter, iv)
aesEncrypter.XORKeyStream(dst, src)
return nil
}
func DecryptAESCFB(dst, src, key, iv []byte) error {
aesBlockDecrypter, err := aes.NewCipher([]byte(key))
if err != nil {
return nil
}
aesDecrypter := cipher.NewCFBDecrypter(aesBlockDecrypter, iv)
aesDecrypter.XORKeyStream(dst, src)
return nil
}
실행 화면
테스트는 실행할 때, ABCD라는 키값을 넣고 1234ABC 라는 평문을 넣었다.
CFB 암호화와 추가로 Base64 인코딩을 했을때 까지 단계별로 확인할 수 있다.
출력은 Hex와 String으로 모두 확인 가능하다.
혹여나 다른 프로그램 코드에서 IP 나 Port 등과 같은 정보들을 암호화 해서 하드코딩 했는데
다음에 변경하여야 할 경우 혹은 테스트용으로 잠시 변경해야할 경우...
나름 유용하게 쓸 수 있지 않을까...? 는.... 내가 몇번 잘 썻다...ㅎ
끝!
'지식저장소 > Golang' 카테고리의 다른 글
[Golang] Ping 테스트 (0) | 2023.07.25 |
---|---|
[Golang] File Compare - 파일 비교 (0) | 2023.03.23 |
[Golang] Byte Slice를 hex로 보기 쉽게 출력하기 (0) | 2020.11.10 |
[Golang] AES - CBC - pkcs7Pad 암호화 (0) | 2020.11.02 |
[Golang] 파일을 Hex Array로 변환하는 프로그램 (0) | 2020.10.16 |