python - 使用 AES-CFB 时 Go 和 Pycrypto 的不同结果

标签 python encryption go pycrypto

我正在向现有的 python 代码库添加一个 go 应用程序。我在处理语言之间的加密时遇到了麻烦。这是使用 go 1.2.1 和 Python 2.7.x/PyCrypto 2.7a1。

这是 Python 示例:

import Crypto.Cipher
import Crypto.Hash.HMAC
import Crypto.Hash.SHA256
import Crypto.PublicKey.RSA
from binascii import hexlify, unhexlify

#encrypt
payload =  unhexlify("abababababababababababababababababababababababababababababababab")
password = unhexlify("0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF")
iv = unhexlify("00000000000000000000000000000000")

print "IV: ", hexlify(iv), "len: ", len(iv)
print "Password length: ", len(password)


cipher = Crypto.Cipher.AES.new(
            key=password, 
            mode=Crypto.Cipher.AES.MODE_CFB, 
            IV=iv)

payload = cipher.encrypt(payload)

print hexlify(payload) #dbf6b1877ba903330cb9cf0c4f530d40bf77fe2bf505820e993741c7f698ad6b

这是 Go 示例:

package main

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

// encrypt
func main() {
    payload, err1 := hex.DecodeString("abababababababababababababababababababababababababababababababab")
    password, err2 := hex.DecodeString("0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF")
    iv, err3 := hex.DecodeString("00000000000000000000000000000000")

    if err1 != nil {
        fmt.Printf("error 1: %v", err1)
        return
    }

    if err2 != nil {
        fmt.Printf("error 2: %v", err2)
        return
    }

    if err3 != nil {
        fmt.Printf("error 3: %v", err3)
        return
    }

    aesBlock, err4 := aes.NewCipher(password)

    fmt.Printf("IV length:%v\n", len(iv))
    fmt.Printf("password length:%v\n", len(password))

    if err4 != nil {
        fmt.Printf("error 4: %v", err4)
        return
    }

    cfbDecrypter := cipher.NewCFBEncrypter(aesBlock, iv)
    cfbDecrypter.XORKeyStream(payload, payload) 

    fmt.Printf("%v\n", hex.EncodeToString(payload)) // db70cd9e6904359cb848410bfa38d7d0a47b594f7eff72d547d3772c9d4f5dbe
}

这是 golang link ,我找不到安装了 PyCrypto 的 Python pastebin。

正如标题和来源所暗示的,这两个片段产生了不同的密文:
python :dbf6b1877ba903330cb9cf0c4f530d40bf77fe2bf505820e993741c7f698ad6b
Golang:db70cd9e6904359cb848410bfa38d7d0a47b594f7eff72d547d3772c9d4f5dbe

两种语言都可以解密它们的“ native ”密文,但都不能解密其他语言。由于 python 实现已经存在,我正在寻找一种解决方案,允许 Go 解密使用示例 PyCrypto AES 设置和 key 大小加密的密文。

最佳答案

对当前系统的研究表明,我们的 python 系统使用的是 CFB8(8 位段)。 Go 不支持开箱即用,但当前 CFBDecrypter/CFBEncrypter 中使用的源代码看起来可以相当容易地进行调整。

关于python - 使用 AES-CFB 时 Go 和 Pycrypto 的不同结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23897809/

相关文章:

python - 获取错误将错误的 SQL 语句打印到标准输出 python

java - 安全性:将 javax.mail.Message 加密写入文件

go - 使用路径变量在 golang 中调用 GET REST API

go - 正确等待全局变量初始化

go - 允许使用 gorilla 处理程序的来源

python - Heroku教程运行python manage.py syncdb更新本地数据库报错

python - 子数组的总和

Python:如何检查数据框中带有空格的条目?

JavaScript消息系统加密

c# - C#中的二进制到.Beep方法