如何为python AES CBC模式编写golang代码?

如何为python AES CBC模式编写golang代码?,python,encryption,go,cryptography,ccavenue,Python,Encryption,Go,Cryptography,Ccavenue,我试图为下面的支付网关python代码编写golang代码 def pad(data): length = 16 - (len(data) % 16) data += chr(length)*length return data def encrypt(plainText, workingKey): iv = '\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f' plainT

我试图为下面的支付网关python代码编写golang代码

def pad(data):
    length = 16 - (len(data) % 16)
    data += chr(length)*length
    return data

def encrypt(plainText, workingKey):
    iv = '\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f'
    plainText = pad(plainText)
    encDigest = md5.new ()
    encDigest.update(workingKey)
    enc_cipher = AES.new(encDigest.digest(), AES.MODE_CBC, iv)
    encryptedText = enc_cipher.encrypt(plainText).encode('hex')
    return encryptedText
下面是相关的golang代码

func Pad(text string) string {
    length := aes.BlockSize - (len(text) % aes.BlockSize)
    pad := string(length)
    for i := 0; i < length; i++ {
        text += pad
    }
    return text
}

func Encrypt(text, key string) string {
    iv := "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
    text = Pad(text)
    h := md5.New()
    h.Write([]byte(key))
    block, err := aes.NewCipher([]byte(fmt.Sprintf("%x", h.Sum(nil))))
    if err != nil {
        return "ollo"
    }
    ciphertext := make([]byte, len([]byte(text)))   
    mode := cipher.NewCBCEncrypter(block, []byte(iv))
    mode.CryptBlocks(ciphertext, []byte(text))
    return fmt.Sprintf("%x", ciphertext)
}

此处密文和加密文本不匹配。有什么问题吗?

md5使用钥匙是有史以来最糟糕的主意!您正在将加密函数的域缩减为有限集!!!Python摘要方法似乎返回校验和原始值,即16个字符字节的字符串。在Go中,您正在使用%x格式化校验和,这将是不同的。但不确定这是否是唯一的问题。James说:Python使用的是已消化密钥的原始字节,而Go使用的是将其转换为十六进制。Python encryptx,y返回e7ab4afaff5922927868be0eb177f9a7。必须从Crypto.Cipher导入AES并导入md5才能运行它。取出Sprintf后,Go Encryptx,y返回相同的结果。呃,这里是必须的游乐场链接:谢谢JamesHenstridge,twotwotwo,这解决了我的问题@tomwilde,实际上我正在为我的应用程序实现ccavenue的支付网关,因为他们没有Golang的包。