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

huangapple go评论65阅读模式
英文:

Decrypt in Golang what was encrypted in Python AES CFB

问题

根据Golang关于CFB解密的文档,我编写了一个最小工作示例,用于解密使用AES CFB加密并在python3中进行base64编码的字符串。

当消息在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实现的块大小默认为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))
英文:

Based on the Golang documentation on CFB decryption I wrote a minimal working example to decrypt a string that was encrypted with AES CFB and then base 64 encoded in python3.

The golang decryption works fine when the message was encrypted within Golang (with the encryption function from the Golang doc example).
However when I encrypt the message in a python script using the python crypto package, I am unable to decrypt it in the golang script successfully. I don't get the right bytes back.

$ 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'

Blocksize is 16 by default for both AES implementations.

So the question: What is going wrong?

Golang script:

<!-- language: lang-go -->

package main

import (
	&quot;crypto/aes&quot;
	&quot;crypto/cipher&quot;
	&quot;encoding/base64&quot;
	&quot;fmt&quot;
	&quot;os&quot;

)

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

	fmt.Println(&quot;Hello from Golang, going to decrypt: &quot;+payload_python+&quot; Result: &quot;+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 script:

<!-- language: lang-python -->

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


original_message = &#39;This is not encrypted&#39;

key = &#39;TfvY7I358yospfWKcoviZizOShpm5hyH&#39;
iv = &#39;mb13KcoviZizvYhp&#39;

#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(&#39;Going to encrypt and base64 &quot;{}&quot; result:\n{}\n&#39;.format(original_message,encryptedpayload))

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

答案1

得分: 5

尝试使用以下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

英文:

Try encrypting from Python like this.

The result can then be unencrypted from Go successfully.

 #!/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, &#39;\x00&#39;)

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 = &#39;TfvY7I358yospfWKcoviZizOShpm5hyH&#39;
iv = &#39;mb13KcoviZizvYhp&#39;
original_message = &#39;This is not encrypted&#39;

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

print(&#39;Going to encrypt and base64 &quot;{}&quot; result:\n{}\n&#39;.format(original_message,encryptedpayload))

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

huangapple
  • 本文由 发表于 2017年6月30日 23:27:38
  • 转载请务必保留本文链接:https://go.coder-hub.com/44850023.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定