github.com/angenalZZZ/gofunc@v0.0.0-20210507121333-48ff1be3917b/f/crypto_aes.go (about)

     1  package f
     2  
     3  import (
     4  	"crypto/aes"
     5  	"crypto/cipher"
     6  )
     7  
     8  // CryptoAesCBCEncrypt AES/CBC/PKCS5Padding+key(16/24/32bytes)+iv(16/24/32bytes)-Encrypt.
     9  // encryptedBytes := CryptoAesCBCEncrypt(origData, key, iv)
    10  // encryptedString := hex.EncodeToString(encryptedBytes)
    11  // encryptedString := base64.StdEncoding.EncodeToString(encryptedBytes)
    12  func CryptoAesCBCEncrypt(origData, key, iv []byte) []byte {
    13  	MustBytes(key, 16, 24, 32)
    14  	MustBytes(iv, 16, 24, 32)
    15  	blockMode, blockSize := CryptoAesBlockMode(key, iv, cipher.NewCBCEncrypter)
    16  	origData = CryptoPKCS5Padding(origData, blockSize)
    17  	encrypted := make([]byte, len(origData))
    18  	blockMode.CryptBlocks(encrypted, origData)
    19  	return encrypted
    20  }
    21  
    22  // CryptoAesCBCEncryptWithHmacSHA1 AES/CBC/PKCS5Padding+key(16/24/32bytes)+salt(8bytes)+iv(16/24/32bytes)+iterations(1000)+outLen(32).
    23  func CryptoAesCBCEncryptWithHmacSHA1(origData, key, salt, iv []byte, iterations, outLen int) []byte {
    24  	password := CryptoSecretKeyPBKDF2WithHmacSHA1(key, salt, iterations, outLen)
    25  	return CryptoAesCBCEncrypt(origData, password[0:32], iv)
    26  }
    27  
    28  // CryptoAesCBCEncryptWithHmacSHA256 AES/CBC/PKCS5Padding+key(16/24/32bytes)+salt(8bytes)+iv(16/24/32bytes)+iterations(1000)+outLen(32).
    29  func CryptoAesCBCEncryptWithHmacSHA256(origData, key, salt, iv []byte, iterations, outLen int) []byte {
    30  	password := CryptoSecretKeyPBKDF2WithHmacSHA256(key, salt, iterations, outLen)
    31  	return CryptoAesCBCEncrypt(origData, password[0:32], iv)
    32  }
    33  
    34  // CryptoAesCBCDecrypt aes AES/CBC/PKCS5Padding+key(16/24/32bytes)+iv(16/24/32bytes)-Decrypt.
    35  // encryptedBytes, err := hex.DecodeString(encryptedString)
    36  // encryptedBytes, err := base64.StdEncoding.DecodeString(encryptedString)
    37  // origData := CryptoAesCBCEncrypt(encryptedBytes, key, iv)
    38  func CryptoAesCBCDecrypt(encrypted, key, iv []byte) []byte {
    39  	MustBytes(key, 16, 24, 32)
    40  	MustBytes(iv, 16, 24, 32)
    41  	blockMode, _ := CryptoAesBlockMode(key, iv, cipher.NewCBCDecrypter)
    42  	origData := make([]byte, len(encrypted))
    43  	blockMode.CryptBlocks(origData, encrypted)
    44  	return CryptoPKCS5UnPadding(origData)
    45  }
    46  
    47  // CryptoAesCBCDecryptWithHmacSHA1 AES/CBC/PKCS5Padding+key(16/24/32bytes)+salt(8bytes)+iv(16/24/32bytes)+iterations(1000)+outLen(32).
    48  func CryptoAesCBCDecryptWithHmacSHA1(encrypted, key, salt, iv []byte, iterations, outLen int) []byte {
    49  	password := CryptoSecretKeyPBKDF2WithHmacSHA1(key, salt, iterations, outLen)
    50  	return CryptoAesCBCDecrypt(encrypted, password[0:32], iv)
    51  }
    52  
    53  // CryptoAesCBCDecryptWithHmacSHA256 AES/CBC/PKCS5Padding+key(16/24/32bytes)+salt(8bytes)+iv(16/24/32bytes)+iterations(1000)+outLen(32).
    54  func CryptoAesCBCDecryptWithHmacSHA256(encrypted, key, salt, iv []byte, iterations, outLen int) []byte {
    55  	password := CryptoSecretKeyPBKDF2WithHmacSHA256(key, salt, iterations, outLen)
    56  	return CryptoAesCBCDecrypt(encrypted, password[0:32], iv)
    57  }
    58  
    59  // CryptoAesBlockMode New Aes BlockMode Method+key(16/24/32bytes)+iv(16/24/32bytes).
    60  // blockMode, blockSize := CryptoAesBlockMode(key, iv, cipher.NewCBCEncrypter)
    61  // blockMode, blockSize := CryptoAesBlockMode(key, iv, cipher.NewCBCDecrypter)
    62  func CryptoAesBlockMode(key, iv []byte, f func(cipher.Block, []byte) cipher.BlockMode) (cipher.BlockMode, int) {
    63  	block, err := aes.NewCipher(key)
    64  	Must(err)
    65  	blockSize := block.BlockSize()
    66  	return f(block, iv[:blockSize]), blockSize
    67  }
    68  
    69  // CryptoAesStream New Aes Stream Method+key(16/24/32bytes)+iv(16/24/32bytes).
    70  // stream := CryptoAesStream(key, iv, cipher.NewCFBDecrypter)
    71  // stream := CryptoAesStream(key, iv, cipher.NewCFBEncrypter)
    72  func CryptoAesStream(key, iv []byte, f func(cipher.Block, []byte) cipher.Stream) cipher.Stream {
    73  	block, err := aes.NewCipher(key)
    74  	Must(err)
    75  	return f(block, iv)
    76  }