golang中Aes加密方法
阿新 • • 發佈:2018-12-15
因專案中go程式與java程式需要傳輸一些加密資料,以下為整理後的Aes(CBC模式)加密解密方法,因java中aes所用的填充演算法為PKCS5padding(具體內容可自行查閱),所以在本示例中也採用PKCS5padding
package encrypt import ( "crypto/cipher" "crypto/aes" "bytes" ) //加密 func AesEncryptSimple(origData []byte, key string, iv string) ([]byte, error) { return AesDecryptPkcs5(origData, []byte(key), []byte(iv)) } func AesEncryptPkcs5(origData []byte, key []byte, iv []byte ) ([]byte, error) { return AesEncrypt(origData, key, iv, PKCS5Padding) } func AesEncrypt(origData []byte, key []byte, iv []byte, paddingFunc func([]byte, int) []byte) ([]byte, error) { block, err := aes.NewCipher(key) if err != nil { return nil, err } blockSize := block.BlockSize() origData = paddingFunc(origData, blockSize) blockMode := cipher.NewCBCEncrypter(block, iv) crypted := make([]byte, len(origData)) blockMode.CryptBlocks(crypted, origData) return crypted, nil } //解密 func AesDecryptSimple(crypted []byte, key string, iv string) ([]byte, error) { return AesDecryptPkcs5(crypted, []byte(key), []byte(iv)) } func AesDecryptPkcs5(crypted []byte, key []byte, iv []byte) ([]byte, error) { return AesDecrypt(crypted, key, iv, PKCS5UnPadding) } func AesDecrypt(crypted, key []byte, iv []byte, unPaddingFunc func([]byte) []byte) ([]byte, error) { block, err := aes.NewCipher(key) if err != nil { return nil, err } blockMode := cipher.NewCBCDecrypter(block, iv) origData := make([]byte, len(crypted)) blockMode.CryptBlocks(origData, crypted) origData = unPaddingFunc(origData) return origData, nil } func PKCS5Padding(ciphertext []byte, blockSize int) []byte { padding := blockSize - len(ciphertext)%blockSize padtext := bytes.Repeat([]byte{byte(padding)}, padding) return append(ciphertext, padtext...) } func PKCS5UnPadding(origData []byte) []byte { length := len(origData) unpadding := int(origData[length-1]) if length < unpadding { return []byte("unpadding error") } return origData[:(length - unpadding)] }