이번엔 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 등과 같은 정보들을 암호화 해서 하드코딩 했는데

다음에 변경하여야 할 경우 혹은 테스트용으로 잠시 변경해야할 경우...

나름 유용하게 쓸 수 있지 않을까...? 는.... 내가 몇번 잘 썻다...ㅎ

끝!

 

반응형

KISA에서 제공하는 ARIA 암호화 예제를 이용한 간단한 암호화를 해보았다. 

 

16바이트로 딱 떨어지지 않는 데이터라도 제로 패딩을 하고 암호화를 하도록 기존의 함수를 조합한 정도뿐이지만...

개인적으로 함수 하나만 넣으면 결과를 얻을 수 있어 사용하기 편하게 만들었다.

 

기존 EncKeySetup 함수와 DeckeySetup 함수를 그대로 이용하였고 단순히 128비트 암호화를 사용하기 쉽게 함수만 2개 추가하였다 

 

사용한 master_key는 단순히 16 바이트로 단순히 1~16까지 넣었다. 

추가한 함수는 EnCrypt와 DeCrypt 이다. 

EnCrypt는 다음과 같다. 

암호화할 데이터와 결과를 얻을 버퍼, 평문의 길이를 넣으면 암호화된 결과의 길이가 리턴된다. 

 

DeCrypt는 다음과 같다. 

복호화 할 데이터와 결과를 얻을 버퍼, 복호화할 데이터의 길이를 넣으면 복호화 된 길이가 리턴된다.

 

해당 두 함수를 이용하여 ARIA128_test 함수를 만들었다

실행결과는 다음과 같다.

암호화를 하고 복호화를 해도 원래 데이터가 잘 나오는 것을 확인하였지만... 

검색을 통해 알아낸 ARIA 암. 복호화 모듈로 검증을 해보았다. 

 

EnCrypt
Decrypt

암.복호화 모두 일치하는 것을 확인을 했다.

 

더 많은 테스트가 필요하겠지만.. 일단은 성공...?

반응형

+ Recent posts