| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141 |
- package utility
- import (
- "bytes"
- "crypto/aes"
- "crypto/cipher"
- "crypto/md5"
- "crypto/rand"
- "encoding/base64"
- "encoding/hex"
- "fmt"
- "golang.org/x/crypto/sha3"
- "io"
- "strings"
- )
- // 암호화
- var key = []byte{0x17, 0xc0, 0xcc, 0x00, 0x32, 0x88, 0x11, 0xa1, 0x51, 0xfe, 0xff, 0x81, 0x9c, 0xdc, 0x9f, 0xea, 0x60, 0x2f, 0x71, 0x28, 0x16, 0x1f, 0x41, 0x7a, 0xa5, 0xc4, 0xac, 0xdd, 0x50, 0x78, 0x08, 0x3f}
- func HashPassword(pw string) string {
- bin := sha3.Sum256([]byte(pw))
- str := hex.EncodeToString(bin[:])
- return str
- }
- func Encrypt(buff []byte) ([]byte, error) {
- block, err := aes.NewCipher(key)
- if err != nil {
- return nil, err
- }
- ciphertext := make([]byte, aes.BlockSize+len(buff))
- iv := ciphertext[:aes.BlockSize]
- if _, err := io.ReadFull(rand.Reader, iv); err != nil {
- return nil, err
- }
- cfb := cipher.NewCFBEncrypter(block, iv)
- cfb.XORKeyStream(ciphertext[aes.BlockSize:], buff)
- return ciphertext, nil
- }
- func EncryptString(s string) (string, error) {
- result, err := Encrypt([]byte(s))
- if err != nil {
- return "", err
- }
- return hex.EncodeToString(result), nil
- }
- func Decrypt(buff []byte) ([]byte, error) {
- block, err := aes.NewCipher(key)
- if err != nil {
- return nil, err
- }
- if len(buff) < aes.BlockSize {
- return nil, fmt.Errorf("ciphertext too short")
- }
- iv := buff[:aes.BlockSize]
- buff = buff[aes.BlockSize:]
- cfb := cipher.NewCFBDecrypter(block, iv)
- cfb.XORKeyStream(buff, buff)
- return buff, nil
- }
- func DecryptString(s string) (string, error) {
- buf, err := hex.DecodeString(s)
- if err != nil {
- return "", err
- }
- result, err := Decrypt(buf)
- if err != nil {
- return "", err
- }
- return string(result), nil
- }
- func MakeMD5(text string) string {
- hasher := md5.New()
- hasher.Write([]byte(text))
- return string(hasher.Sum(nil))
- }
- func AesEncrypt(plainText string, key string, iv string) (string, error) {
- if strings.TrimSpace(plainText) == "" {
- return plainText, nil
- }
- block, err := aes.NewCipher([]byte(key))
- if err != nil {
- return "", err
- }
- encrypter := cipher.NewCBCEncrypter(block, []byte(iv))
- paddedPlainText := padPKCS7([]byte(plainText), encrypter.BlockSize())
- cipherText := make([]byte, len(paddedPlainText))
- // CryptBlocks 함수에 데이터(paddedPlainText)와 암호화 될 데이터를 저장할 슬라이스(cipherText)를 넣으면 암호화가 된다.
- encrypter.CryptBlocks(cipherText, paddedPlainText)
- return base64.StdEncoding.EncodeToString(cipherText), nil
- }
- func AesDecrypt(cipherText string, key string, iv string) (string, error) {
- if strings.TrimSpace(cipherText) == "" {
- return cipherText, nil
- }
- decodedCipherText, err := base64.StdEncoding.DecodeString(cipherText)
- if err != nil {
- return "", err
- }
- block, err := aes.NewCipher([]byte(key))
- if err != nil {
- return "", err
- }
- decrypter := cipher.NewCBCDecrypter(block, []byte(iv))
- plainText := make([]byte, len(decodedCipherText))
- decrypter.CryptBlocks(plainText, decodedCipherText)
- trimmedPlainText := trimPKCS5(plainText)
- return string(trimmedPlainText), nil
- }
- func padPKCS7(plainText []byte, blockSize int) []byte {
- padding := blockSize - len(plainText)%blockSize
- padText := bytes.Repeat([]byte{byte(padding)}, padding)
- return append(plainText, padText...)
- }
- func trimPKCS5(text []byte) []byte {
- padding := text[len(text)-1]
- return text[:len(text)-int(padding)]
- }
|