2 回答

TA贡献1836条经验 获得超3个赞
这不是一个移位问题,它是一个输出缓冲区大小问题,因为 iv 是加密数据的前缀。
IV 是一个空块 (0x00),因为它从未设置为值。它被添加到加密数据之前,这很常见。需要添加一个填充块,因为输入数据是块大小的精确倍数。
这个输出缓冲区需要是 iv 的大小 + 数据的大小 + 填充块的大小。(16 + 32 + 16 = 64)
向输出缓冲区添加另一个块大小:
ciphertext := make([]byte, aes.BlockSize + len(plaintext) + aes.BlockSize)

TA贡献1806条经验 获得超5个赞
PHP 版本正在编码一个额外的 16 字节的“空”字符串,该字符串用 16 秒填充!
p1 := "0000000000000tha"
p2 := "nkustackoverflow"
p1b := []byte(p1)
p2b := []byte(p2)
p3b, _ := hex.DecodeString("10101010101010101010101010101010")
fmt.Println(p3b)
key := []byte("abcdefghijklmnop")
block, _ := aes.NewCipher(key)
ciphertext := make([]byte, aes.BlockSize+16)
iv := ciphertext[:aes.BlockSize]
mode := cipher.NewCBCEncrypter(block, iv)
i := 0
for {
if i == 0 {
mode.CryptBlocks(ciphertext[aes.BlockSize:], p1b)
} else if i == 1 {
mode.CryptBlocks(ciphertext[aes.BlockSize:], p2b)
} else if i == 2 {
mode.CryptBlocks(ciphertext[aes.BlockSize:], p3b)
}
fmt.Printf("%x\n", ciphertext[16:])
i += 1
if i > 2 {
break
}
}
这段代码identical在 golang 中打印 php 的内容。
- 2 回答
- 0 关注
- 166 浏览
添加回答
举报