Go语言 AES删除块填充

cuxqih21  于 2022-12-16  发布在  Go
关注(0)|答案(1)|浏览(141)

我有一个解密密文的程序(我不控制它),使用的例子来自go docs:https://pkg.go.dev/crypto/cipher#NewCBCDecrypter
问题出在这一部分:

// If the original plaintext lengths are not a multiple of the block
// size, padding would have to be added when encrypting, which would be
// removed at this point. For an example, see
// https://tools.ietf.org/html/rfc5246#section-6.2.3.2

我原来的明文长度确实 * 不是 * 块大小的倍数,所以我需要去掉填充,怎么做呢?如果我不去掉填充,我不能解压缩纯文本,因为https://github.com/golang/go/issues/47809的去维护人员明确表示,是非常严格的gzip符合性的目的。目前我的解决方法是调用gunzip作为shell命令,它可以成功地解压缩纯文本(忽略尾部填充)。
我检查了IETF链接,但没有找到任何示例(或者至少没有Go示例)

jckbn6z7

jckbn6z71#

事实证明,加密器和解密器必须事先就填充方案达成一致,在我的例子中,加密器使用的是下面描述的填充方案:https://www.rfc-editor.org/rfc/rfc5652#section-6.3
换句话说,如果有一个字节的填充,则用0x01填充明文,如果有2个字节的填充,则用0x02 0x02填充明文,以此类推。
例如,假设块大小为4字节,下面是一些明文示例:

plaintext ... plaintext with padding
01            01 03 03 03
01 02         01 02 02 02
01 02 03      01 02 03 01
01 02 03 04   01 02 03 04 04 04 04 04

因此,我能够使用以下命令远程填充明文:

func removePadding(pt []byte) []byte {
    padLength := int(pt[len(pt)-1])
    return pt[:len(pt)-padLength]
}

另请参阅:https://crypto.stackexchange.com/a/2805

相关问题