Я работаю над проектом для удовольствия. Сервер golang и клиент python. Я хочу, чтобы передаваемые данные были зашифрованы, но, похоже, не работают две схемы шифрования. Я новичок, когда дело доходит до шифрования, поэтому, пожалуйста, объясните, как вы разговариваете с малышами.AES Шифрование Golang и Python
Вот мой golang функция шифрования:
import (
"crypto/aes"
"crypto/cipher"
"crypto/rand"
"errors"
"io"
"fmt"
)
func Encrypt(key, text []byte) (ciphertext []byte, err error) {
var block cipher.Block
if block, err = aes.NewCipher(key); err != nil {
return nil, err
}
ciphertext = make([]byte, aes.BlockSize+len(string(text)))
iv := ciphertext[:aes.BlockSize]
fmt.Println(aes.BlockSize)
if _, err = io.ReadFull(rand.Reader, iv); err != nil {
return
}
cfb := cipher.NewCFBEncrypter(block, iv)
cfb.XORKeyStream(ciphertext[aes.BlockSize:], text)
return
}
func Decrypt(key, ciphertext []byte) (plaintext []byte, err error) {
var block cipher.Block
if block, err = aes.NewCipher(key); err != nil {
return
}
if len(ciphertext) < aes.BlockSize {
err = errors.New("ciphertext too short")
return
}
iv := ciphertext[:aes.BlockSize]
ciphertext = ciphertext[aes.BlockSize:]
cfb := cipher.NewCFBDecrypter(block, iv)
cfb.XORKeyStream(ciphertext, ciphertext)
plaintext = ciphertext
return
}
и вот моя реализация Python:
class AESCipher:
def __init__(self, key):
self.key = key
print "INIT KEY" + hexlify(self.key)
def encrypt(self, raw):
print "RAW STRING: " + hexlify(raw)
iv = Random.new().read(AES.block_size)
cipher = AES.new(self.key, AES.MODE_CFB, iv)
r = (iv + cipher.encrypt(raw))
print "ECRYPTED STRING: " + hexlify(r)
return r
def decrypt(self, enc):
enc = (enc)
iv = enc[:16]
cipher = AES.new(self.key, AES.MODE_CFB, iv)
x=(cipher.decrypt(enc))
print "DECRYPTED STRING: " + hexlify(x)
return x
я наклоняю достаточно выяснить, выход из моих функций питона либо. Мои ходы работают отлично. Но я хочу, чтобы иметь возможность шифровать в Go дешифровать в python и наоборот.
Пример вывода из Python:
INIT KEY61736466617364666173646661736466
RAW STRING: 54657374206d657373616765
ECRYPTED STRING: dfee33dd40c32fbaf9aac73ac4e0a5a9fc7bd2947d29005dd8d8e21a
dfee33dd40c32fbaf9aac73ac4e0a5a9fc7bd2947d29005dd8d8e21a
DECRYPTED STRING: 77d899b990d2d3172a3229b1b69c6f2554657374206d657373616765
77d899b990d2d3172a3229b1b69c6f2554657374206d657373616765
wØ™¹�ÒÓ*2)±¶œo%Test message
Как вы можете увидеть сообщение расшифрованы, но заканчивается в конце строки?
EDIT: Образец выходного расшифровки с GO. Если я попытаться расшифровать с GO ниже (генерируемся с Python)
ECRYPTED STRING: (Test Message) 7af474bc4c8ea9579d83a3353f83a0c2844f8efb019c82618ea0b478
Я получаю
Decrypted Payload: 54 4E 57 9B 90 F8 D6 CD 12 59 0B B1
Decrypted Payload: TNW�����Y�
Странная части является первым символом всегда правильно
здесь являются полными проектами :
Я настоятельно рекомендую вам использовать https://godoc.org/golang.org/x/crypto/nacl/secretbox и https://pynacl.readthedocs.org/en/latest/ (для Python), если вам нужно зашифровать сообщения. – elithrar