Golang Go语言中的AES加密方法求解

发布于 1周前 作者 gougou168 来自 Go语言

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

7 回复

他这不是 cbc ?

更多关于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) &lt; 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 &lt; len(arr); i++ {<br> chunk = append(chunk, arr[i])<br> if len(chunk) &gt;= 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/aescrypto/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
	// ...
}

注意:

  1. 密钥长度必须是16、24或32字节,分别对应AES-128、AES-192和AES-256。
  2. 初始化向量(IV)在加密时随机生成,并在解密时使用相同的IV。
  3. 加密后的数据通常使用base64编码以便存储或传输。

希望这个示例能帮助你理解Go语言中的AES加密方法。

回到顶部