最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網 會員登陸 & 注冊

go 語言實現(xiàn)AES大量文本加密解密

2023-07-29 00:01 作者:極極及  | 我要投稿

原文地址: https://nages.cc/archives/1690558621083

因為AES加密算法一次只能加密16個字符, 所以超過16個就需要分批次加密, 以下是本人實現(xiàn)的分批次加密

密鑰對齊

將密鑰的長度對齊至16, 24, 32位

// fix AES Key
func checkKeyAES(key string) (cipher.Block, error) {
keyLen := len(key)
if keyLen <= 32 {
?if keyLen <= 16 {
? for i := 0; i < 16-keyLen; i++ {
? ?key += "0"
? }
?} else if keyLen <= 24 {
? for i := 0; i < 24-keyLen; i++ {
? ?key += "0"
? }
?} else if keyLen <= 32 {
? for i := 0; i < 32-keyLen; i++ {
? ?key += "0"
? }
?}
} else {
?return nil, errors.New("key len is max 32 size")
}
return aes.NewCipher([]byte(key))
}

加密

實現(xiàn)大量文本的加密, 少量也可使用

// EncryptAES AES 加密字符串, key最長32位. 不足位數(shù)補充0
func EncryptAES(key string, plaintext string) (string, error) {
c, err := checkKeyAES(key)
if err != nil {
?return "", err
}
plaintextBytes := []byte(plaintext)
plaintextLen := len(plaintextBytes)
if plaintextLen <= 16 {
?out := make([]byte, 16)
?c.Encrypt(out, plaintextBytes)
?return hex.EncodeToString(out), nil
} else {
?// aes一次只能加密16字節(jié), 超過16字節(jié)只能分批加密
?fetch := plaintextLen/16 + 1
?rs := ""
?for fetch > 0 {
? if fetch == 1 {
? ?out := make([]byte, 16)
? ?out2 := make([]byte, 16-plaintextLen)
? ?plaintextBytes = append(plaintextBytes, out2...)
? ?c.Encrypt(out, plaintextBytes)
? ?rs += hex.EncodeToString(out)
? } else {
? ?out := make([]byte, 16)
? ?c.Encrypt(out, plaintextBytes[:16])
? ?rs += hex.EncodeToString(out)
? ?plaintextBytes = plaintextBytes[16:]
? }
? plaintextLen -= 16
? fetch -= 1
?}
?return rs, nil
}
}

解密

實現(xiàn)大量文本的解密, 少量也可使用

// DecryptAES 解密文本
func DecryptAES(key string, encryptText string) (string, error) {
cipher1, err := checkKeyAES(key)
if err != nil {
?return "", err
}
decodeText, _ := hex.DecodeString(encryptText)
encryptTextLen := len(decodeText)

if encryptTextLen <= 16 {
?out := make([]byte, encryptTextLen)
?cipher1.Decrypt(out, decodeText)
?return string(out[:]), nil
} else {
?fetch := encryptTextLen / 16
?rs := make([]byte, 0)
?for fetch > 0 {
? if fetch == 1 {
? ?out := make([]byte, 16)
? ?decodeText = append(decodeText, make([]byte, 16-encryptTextLen)...)
? ?cipher1.Decrypt(out, decodeText)
? ?rs = append(rs, out...)
? } else {
? ?out := make([]byte, 16)
? ?cipher1.Decrypt(out, decodeText[:16])
? ?rs = append(rs, out...)
? ?decodeText = decodeText[16:]
? }
? encryptTextLen -= 16
? fetch -= 1
?}
?return string(rs), err
}
}

總體實現(xiàn)

package utils

import (
"crypto/aes"
"crypto/cipher"
"encoding/hex"
"errors"
)

// EncryptAES AES 加密字符串, key最長32位. 不足位數(shù)補充0
func EncryptAES(key string, plaintext string) (string, error) {
c, err := checkKeyAES(key)
if err != nil {
?return "", err
}
plaintextBytes := []byte(plaintext)
plaintextLen := len(plaintextBytes)
if plaintextLen <= 16 {
?out := make([]byte, 16)
?c.Encrypt(out, plaintextBytes)
?return hex.EncodeToString(out), nil
} else {
?// aes一次只能加密16字節(jié), 超過16字節(jié)只能分批加密
?fetch := plaintextLen/16 + 1
?rs := ""
?for fetch > 0 {
? if fetch == 1 {
? ?out := make([]byte, 16)
? ?out2 := make([]byte, 16-plaintextLen)
? ?plaintextBytes = append(plaintextBytes, out2...)
? ?c.Encrypt(out, plaintextBytes)
? ?rs += hex.EncodeToString(out)
? } else {
? ?out := make([]byte, 16)
? ?c.Encrypt(out, plaintextBytes[:16])
? ?rs += hex.EncodeToString(out)
? ?plaintextBytes = plaintextBytes[16:]
? }
? plaintextLen -= 16
? fetch -= 1
?}
?return rs, nil
}
}

// DecryptAES 解密文本
func DecryptAES(key string, encryptText string) (string, error) {
cipher1, err := checkKeyAES(key)
if err != nil {
?return "", err
}
decodeText, _ := hex.DecodeString(encryptText)
encryptTextLen := len(decodeText)

if encryptTextLen <= 16 {
?out := make([]byte, encryptTextLen)
?cipher1.Decrypt(out, decodeText)
?return string(out[:]), nil
} else {
?fetch := encryptTextLen / 16
?rs := make([]byte, 0)
?for fetch > 0 {
? if fetch == 1 {
? ?out := make([]byte, 16)
? ?decodeText = append(decodeText, make([]byte, 16-encryptTextLen)...)
? ?cipher1.Decrypt(out, decodeText)
? ?rs = append(rs, out...)
? } else {
? ?out := make([]byte, 16)
? ?cipher1.Decrypt(out, decodeText[:16])
? ?rs = append(rs, out...)
? ?decodeText = decodeText[16:]
? }
? encryptTextLen -= 16
? fetch -= 1
?}
?return string(rs), err
}
}

// fix AES Key
func checkKeyAES(key string) (cipher.Block, error) {
keyLen := len(key)
if keyLen <= 32 {
?if keyLen <= 16 {
? for i := 0; i < 16-keyLen; i++ {
? ?key += "0"
? }
?} else if keyLen <= 24 {
? for i := 0; i < 24-keyLen; i++ {
? ?key += "0"
? }
?} else if keyLen <= 32 {
? for i := 0; i < 32-keyLen; i++ {
? ?key += "0"
? }
?}
} else {
?return nil, errors.New("key len is max 32 size")
}
return aes.NewCipher([]byte(key))
}

測試

package main

import (
"fmt"
"go_utils/utils"
)

func 測試加密() {
key := "1111111111111111111111"
value := "This is a secret:123456, 這是一段中文文本"

fmt.Println("key", key)
fmt.Println("value", value)
fmt.Println("=======================================================")

//value = base64.StdEncoding.EncodeToString([]byte(value))
fmt.Println(value)

aes, err := utils.EncryptAES(key, value)
if err != nil {
?panic(err)
}
fmt.Println(aes)

encryptAES, err := utils.DecryptAES(key, aes)
if err != nil {
?panic(err)
}
fmt.Println(encryptAES)
}

func main() {
測試加密()
}

測試截圖



go 語言實現(xiàn)AES大量文本加密解密的評論 (共 條)

分享到微博請遵守國家法律
大关县| 田林县| 江华| 远安县| 甘德县| 贵定县| 和林格尔县| 达日县| 略阳县| 拉萨市| 军事| 灵寿县| 宁远县| 织金县| 勐海县| 平昌县| 黎平县| 工布江达县| 胶州市| 理塘县| 泰州市| 丰县| 七台河市| 温州市| 绥棱县| 西青区| 教育| 张家口市| 兴国县| 本溪市| 衡东县| 芮城县| 蚌埠市| 唐海县| 娄烦县| 平泉县| 丹阳市| 新密市| 五峰| 阿克苏市| 西宁市|