【发布时间】:2014-06-05 23:48:36
【问题描述】:
尝试在 Go 中模拟一种基本上是 AES ECB 模式加密的算法。
这是我目前所拥有的
func Decrypt(data []byte) []byte {
cipher, err := aes.NewCipher([]byte(KEY))
if err == nil {
cipher.Decrypt(data, PKCS5Pad(data))
return data
}
return nil
}
我还有一个 PKCS5Padding 算法,它已经过测试并且可以工作,它首先填充数据。我在 Go AES 包中找不到任何关于如何切换加密模式的信息(绝对不在 the docs 中)。
我有这个代码是另一种语言的,这就是我知道这个算法不能正常工作的原因。
编辑:这是我在问题页面上解释的方法
func AESECB(ciphertext []byte) []byte {
cipher, _ := aes.NewCipher([]byte(KEY))
fmt.Println("AESing the data")
bs := 16
if len(ciphertext)%bs != 0 {
panic("Need a multiple of the blocksize")
}
plaintext := make([]byte, len(ciphertext))
for len(plaintext) > 0 {
cipher.Decrypt(plaintext, ciphertext)
plaintext = plaintext[bs:]
ciphertext = ciphertext[bs:]
}
return plaintext
}
这实际上并没有返回任何数据,也许我在将其从加密更改为解密时搞砸了
【问题讨论】:
-
错误说明了什么?你有/你能提供一个示例游乐场吗?
-
在加密之前填充明文,之后取消填充。而且你只对最后一个块这样做,而不是中间的任何地方。
-
@owlstead 我看到的实现实际上在解密之前填充了加密数据......这可能是正确的吗? github.com/martinp/pysnap/blob/master/pysnap/utils.py#L40
-
你这里特别需要ECB模式加密吗?您要加密什么/是否需要与 API 进行必要的互操作?
-
@Jameo 不,这不正确。这意味着您添加了一个完整的填充块(因为密文始终是块大小的 x 倍)。因此,明文将包含所有内容包括末尾的填充和一个随机垃圾块。所以它会解密,是的,但结果不正确。
标签: encryption go aes ecb