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 }