python - 在 Golang 中解密在 Python AES CFB 中加密的内容

标签 python go cryptography aes

基于Golang documentation on CFB decryption我写了一个最小的工作示例来解密用 AES CFB 加密然后用 python3 编码的 base 64 的字符串。

当消息在 Golang 中加密时(使用 Golang 文档示例中的加密函数),golang 解密工作正常。 但是,当我使用 python 加密包在 python 脚本中加密消息时,我无法在 golang 脚本中成功解密它。我没有得到正确的字节。

$ python3 stack.py 
Going to encrypt and base64 "This is not encrypted" result:
b'jf9A5LCxKWPuNb1XiH+G3APAgR//'

Now going to call the Golang script:
b'Hello from Golang, going to decrypt: jf9A5LCxKWPuNb1XiH+G3APAgR//
Result:  Tl!\xca/\xf1\xc0\xb2\xd01Y\x02V\xec\xdf\xecy\xd38&\xd9\n'

两种 AES 实现的 block 大小默认为 16。

那么问题来了:出了什么问题?

Golang 脚本:

package main

import (
    "crypto/aes"
    "crypto/cipher"
    "encoding/base64"
    "fmt"
    "os"

)

func main() {
    key := []byte("TfvY7I358yospfWKcoviZizOShpm5hyH")
    iv := []byte("mb13KcoviZizvYhp")
    payload_python := os.Args[1]

    fmt.Println("Hello from Golang, going to decrypt: "+payload_python+" Result: "+string(decrypt(key, payload_python, iv)))
}


func decrypt(key []byte, cryptoText string, iv []byte) []byte {
    ciphertext, _ := base64.StdEncoding.DecodeString(cryptoText)    //decode base64 coding

    //prepare decryption based on key and iv
    block, _ := aes.NewCipher(key)
    stream := cipher.NewCFBDecrypter(block, iv)

    //decrypt
    stream.XORKeyStream(ciphertext, ciphertext)

    return ciphertext
}

Python 脚本:

 #!/usr/bin/env python3
import base64
from Crypto.Cipher import AES
from subprocess import check_output


original_message = 'This is not encrypted'

key = 'TfvY7I358yospfWKcoviZizOShpm5hyH'
iv = 'mb13KcoviZizvYhp'

#prepare encryption
cfb_cipher_encrypt = AES.new(key, AES.MODE_CFB, iv)
#encrypt and base64 encode
encryptedpayload = base64.b64encode(cfb_cipher_encrypt.encrypt(original_message))

print('Going to encrypt and base64 "{}" result:\n{}\n'.format(original_message,encryptedpayload))

print('Now going to call the Golang script:')
print(check_output('go run stack.go {}'.format(encryptedpayload.decode()),shell=True))

最佳答案

尝试像这样从 Python 加密。

然后可以成功地从 Go 中解密结果。

 #!/usr/bin/env python3
import base64
from Crypto.Cipher import AES

MODE = AES.MODE_CFB
BLOCK_SIZE = 16
SEGMENT_SIZE = 128

def _pad_string(value):
    length = len(value)
    pad_size = BLOCK_SIZE - (length % BLOCK_SIZE)
    return value.ljust(length + pad_size, '\x00')

def encrypt(key, iv, plaintext):
    aes = AES.new(key, MODE, iv, segment_size=SEGMENT_SIZE)
    plaintext = _pad_string(plaintext)
    encrypted_text = aes.encrypt(plaintext)
    return encrypted_text

key = 'TfvY7I358yospfWKcoviZizOShpm5hyH'
iv = 'mb13KcoviZizvYhp'
original_message = 'This is not encrypted'

encryptedpayload = base64.b64encode(encrypt(key, iv, original_message))

print('Going to encrypt and base64 "{}" result:\n{}\n'.format(original_message,encryptedpayload))

来源:http://chase-seibert.github.io/blog/2016/01/29/cryptojs-pycrypto-ios-aes256.html

关于python - 在 Golang 中解密在 Python AES CFB 中加密的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44850023/

相关文章:

python - 如何检查python中两个列表之间的公共(public)元素

python - 根据列表从具有重复列的 DF 中选择行

python - 在 Python 中使用尽可能少的行获取第一个元素之前是否可以检查列表是否为空?

go - 何时在 Go 中刷新文件?

google-app-engine - 使用 golang 在 google app engine 数据存储上进行 "IN Array"查询

mongodb - 如何获取mongodb中所有具有对象id的记录

python - 如何在Python中使用十六进制进行异或

Python非对称加密: Using pre-generated prv/pub keys

python - 逐帧可视化 3D-numpy-array

ssl - Golang 证书验证