1
0
mirror of https://github.com/duke-git/lancet.git synced 2026-02-13 01:02:28 +08:00

fix: fix AesEcbEncrypt failed with key lenght is 24 or 32

This commit is contained in:
dudaodong
2023-02-16 11:45:08 +08:00
parent f3d73899b1
commit 0bd675340f
2 changed files with 24 additions and 10 deletions

View File

@@ -17,14 +17,23 @@ import (
// AesEcbEncrypt encrypt data with key use AES ECB algorithm // AesEcbEncrypt encrypt data with key use AES ECB algorithm
// len(key) should be 16, 24 or 32 // len(key) should be 16, 24 or 32
func AesEcbEncrypt(data, key []byte) []byte { func AesEcbEncrypt(data, key []byte) []byte {
cipher, _ := aes.NewCipher(generateAesKey(key)) size := len(key)
if size != 16 && size != 24 && size != 32 {
panic("key length shoud be 16 or 24 or 32")
}
cipher, _ := aes.NewCipher(generateAesKey(key, size))
length := (len(data) + aes.BlockSize) / aes.BlockSize length := (len(data) + aes.BlockSize) / aes.BlockSize
plain := make([]byte, length*aes.BlockSize) plain := make([]byte, length*aes.BlockSize)
copy(plain, data) copy(plain, data)
pad := byte(len(plain) - len(data)) pad := byte(len(plain) - len(data))
for i := len(data); i < len(plain); i++ { for i := len(data); i < len(plain); i++ {
plain[i] = pad plain[i] = pad
} }
encrypted := make([]byte, len(plain)) encrypted := make([]byte, len(plain))
for bs, be := 0, cipher.BlockSize(); bs <= len(data); bs, be = bs+cipher.BlockSize(), be+cipher.BlockSize() { for bs, be := 0, cipher.BlockSize(); bs <= len(data); bs, be = bs+cipher.BlockSize(), be+cipher.BlockSize() {
cipher.Encrypt(encrypted[bs:be], plain[bs:be]) cipher.Encrypt(encrypted[bs:be], plain[bs:be])
@@ -36,9 +45,14 @@ func AesEcbEncrypt(data, key []byte) []byte {
// AesEcbDecrypt decrypt data with key use AES ECB algorithm // AesEcbDecrypt decrypt data with key use AES ECB algorithm
// len(key) should be 16, 24 or 32 // len(key) should be 16, 24 or 32
func AesEcbDecrypt(encrypted, key []byte) []byte { func AesEcbDecrypt(encrypted, key []byte) []byte {
cipher, _ := aes.NewCipher(generateAesKey(key)) size := len(key)
if size != 16 && size != 24 && size != 32 {
panic("key length shoud be 16 or 24 or 32")
}
cipher, _ := aes.NewCipher(generateAesKey(key, size))
decrypted := make([]byte, len(encrypted)) decrypted := make([]byte, len(encrypted))
//
for bs, be := 0, cipher.BlockSize(); bs < len(encrypted); bs, be = bs+cipher.BlockSize(), be+cipher.BlockSize() { for bs, be := 0, cipher.BlockSize(); bs < len(encrypted); bs, be = bs+cipher.BlockSize(), be+cipher.BlockSize() {
cipher.Decrypt(decrypted[bs:be], encrypted[bs:be]) cipher.Decrypt(decrypted[bs:be], encrypted[bs:be])
} }

View File

@@ -2,15 +2,15 @@ package cryptor
import "bytes" import "bytes"
func generateAesKey(key []byte) []byte { func generateAesKey(key []byte, size int) []byte {
genKey := make([]byte, 16) aesKey := make([]byte, size)
copy(genKey, key) copy(aesKey, key)
for i := 16; i < len(key); { for i := size; i < len(key); {
for j := 0; j < 16 && i < len(key); j, i = j+1, i+1 { for j := 0; j < size && i < len(key); j, i = j+1, i+1 {
genKey[j] ^= key[i] aesKey[j] ^= key[i]
} }
} }
return genKey return aesKey
} }
func generateDesKey(key []byte) []byte { func generateDesKey(key []byte) []byte {