Golang Go语言中的AES加密方法求解
Golang Go语言中的AES加密方法求解
要求如下:
str = `406BF0AD11310101220213481000320000`
key := `ER2Fb6ts3ECX`
通过 AES 加密(加解密算法 AES/工作模式 ECB /填充方式 NoPadding)并根据 base64
转码后字符串位:
rebZn7aj61hD3lfsUrhwFgVzPg4yYo9aseP/a4sNTRIh/Vtb0mziFfoHdOZBZ5uj
试过了论坛中一位大老的方法,出来的结果貌似不一样呀~
package xaes
import (
“bytes”
“crypto/aes”
“crypto/cipher”
“crypto/rand”
“crypto/sha256”
“encoding/base64”
“errors”
)
type Aes struct {
key []byte
}
func NewAes(key string) (*Aes) {
if key == “” {
panic(“aes key empty”)
}
sum := sha256.Sum256([]byte(key))
return &Aes{
key:sum[:],
}
}
func (a *Aes) Encrypt(encodeBytes []byte) (val string, err error) {
block, err := aes.NewCipher(a.key)
if err != nil {
return
}
blockSize := block.BlockSize()
encodeBytes = zeroPadding(encodeBytes, blockSize)
iv := make([]byte, blockSize)
_,err = rand.Read(iv)
if err != nil {
return
}
blockMode := cipher.NewCBCEncrypter(block, iv)
crypted := make([]byte, len(encodeBytes))
blockMode.CryptBlocks(crypted, encodeBytes)
iv = append(iv,crypted...)
val = base64.StdEncoding.EncodeToString(iv)
return
}
func (a *Aes) pkCS5Padding(ciphertext []byte, blockSize int) []byte {
padding := blockSize - len(ciphertext)%blockSize
padtext := bytes.Repeat([]byte{byte(padding)}, padding)
return append(ciphertext, padtext…)
}
func (a *Aes) Decrypt(decodeBytes []byte) (origData []byte,err error) {
//decodeBytes, err := base64.StdEncoding.DecodeString(decodeStr)
//if err != nil {
// return
//}
block, err := aes.NewCipher(a.key)
if err != nil {
return nil, err
}
if len(decodeBytes) < block.BlockSize() {
err = errors.New(“decodeBytes 长度不足”)
return
}
iv := decodeBytes[:block.BlockSize()]
decodeBytes = decodeBytes[block.BlockSize():]
blockMode := cipher.NewCBCDecrypter(block, iv)
origData = make([]byte, len(decodeBytes))
blockMode.CryptBlocks(origData, decodeBytes)
origData = zeroUnPadding(origData)
return
}
func (a *Aes) pkCS5UnPadding(origData []byte) []byte {
length := len(origData)
unpadding := int(origData[length-1])
return origData[:(length - unpadding)]
}
func zeroPadding(ciphertext []byte, blockSize int) []byte {
padding := blockSize - len(ciphertext)%blockSize
padText := bytes.Repeat([]byte{0}, padding)
return append(ciphertext, padText…)
}
func zeroUnPadding(origData []byte) []byte {
return bytes.TrimFunc(origData,
func(r rune) bool {
return r == rune(0)
})
}
调用方式
package main
import (
“awesomeProject/xaes”
“fmt”
)
func main() {
str := []byte(“406BF0AD11310101220213481000320000”)
xa := xaes.NewAes(“ER2Fb6ts3ECX”)
b,e:=xa.Encrypt(str)
if e != nil{
fmt.Println(e.Error())
return
}
fmt.Println(b)
}
更多关于Golang Go语言中的AES加密方法求解的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
我不知道呀,他给的文档中说的是 ecb…我就没向 cbc 上想呀
早上上班就看见你发了,晚上要睡了还没人回你 真是醉了go<br>package main<br><br>import (<br> "bytes"<br> "crypto/aes"<br> "encoding/base64"<br> "fmt"<br>)<br><br>func main() {<br> str := []byte("406BF0AD11310101220213481000320000")<br> key := make([]byte, 16)<br> oriKey := []byte("ER2Fb6ts3ECX")<br> for k, v := range oriKey {<br> key[k] = v<br> }<br> cipher, _ := aes.NewCipher(key)<br> chunks := arrChunk(str, len(key))<br> buf := make([]byte, len(key))<br> encryptData := make([]byte, 0, (len(chunks)+1)*len(key))<br> for _, chunk := range chunks {<br> if len(chunk) < len(key) {<br> chunk = append(chunk, bytes.Repeat([]byte{0}, len(key)-len(chunk))...)<br> }<br> cipher.Encrypt(buf, chunk)<br> encryptData = append(encryptData, buf...)<br> }<br> fmt.Println(base64.StdEncoding.EncodeToString(encryptData))<br>}<br>func arrChunk(arr []byte, size int) [][]byte {<br> chunks := make([][]byte, 0)<br> chunk := make([]byte, 0, size)<br> for i := 0; i < len(arr); i++ {<br> chunk = append(chunk, arr[i])<br> if len(chunk) >= size {<br> chunks = append(chunks, chunk)<br> chunk = make([]byte, 0, size)<br> }<br> }<br> chunks = append(chunks, chunk)<br> return chunks<br>}<br>
我真是服 这个代码格式化到底咋弄
3Q ,能加密出来相要有结果了
只有主题可以是 Markdown 的…
在Go语言中,AES(高级加密标准)加密通常使用标准库中的crypto/aes
和crypto/cipher
包来实现。以下是一个简单的AES加密和解密的示例代码,展示了如何使用这些包进行AES-256-CBC加密。
package main
import (
"crypto/aes"
"crypto/cipher"
"crypto/rand"
"encoding/base64"
"fmt"
"io"
)
func main() {
key := []byte("examplekey123456") // 必须是16, 24, 或 32字节长
plaintext := []byte("Hello, World!")
block, err := aes.NewCipher(key)
if err != nil {
panic(err)
}
ciphertext := make([]byte, aes.BlockSize+len(plaintext))
iv := ciphertext[:aes.BlockSize]
if _, err := io.ReadFull(rand.Reader, iv); err != nil {
panic(err)
}
stream := cipher.NewCBCEncrypter(block, iv)
stream.CryptBlocks(ciphertext[aes.BlockSize:], plaintext)
// 编码为base64以便存储或传输
encoded := base64.StdEncoding.EncodeToString(ciphertext)
fmt.Println("Encoded:", encoded)
// 解密过程类似,使用cipher.NewCBCDecrypter
// ...
}
注意:
- 密钥长度必须是16、24或32字节,分别对应AES-128、AES-192和AES-256。
- 初始化向量(IV)在加密时随机生成,并在解密时使用相同的IV。
- 加密后的数据通常使用base64编码以便存储或传输。
希望这个示例能帮助你理解Go语言中的AES加密方法。