Maison >développement back-end >Golang >Pourquoi les implémentations My Go et PyCrypto AES-CFB produisent-elles des textes chiffrés différents ?

Pourquoi les implémentations My Go et PyCrypto AES-CFB produisent-elles des textes chiffrés différents ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-11 14:55:10596parcourir

Why Do My Go and PyCrypto AES-CFB Implementations Produce Different Ciphertexts?

Différents résultats en Go et Pycrypto avec AES-CFB

Cette question découle de la nécessité d'intégrer une application Go dans une base de code Python existante qui utilise PyCrypto pour le cryptage. Le problème se manifeste lorsque les implémentations Python et Go du cryptage AES-CFB produisent des textes chiffrés différents.

Exemple Python :

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

Échantillon Go :

aesBlock, err4 := aes.NewCipher(password)
cfbDecrypter := cipher.NewCFBEncrypter(aesBlock, iv)

En Go, la fonction NewCFBEncrypter utilise des segments de 16 bits par défaut, tandis qu'en Python, PyCrypto utilise des segments de 8 bits (CFB8). Pour résoudre cet écart et permettre à Go de déchiffrer le texte chiffré à l'aide des paramètres PyCrypto, l'implémentation de Go doit être modifiée pour prendre en charge CFB8.

Solution :

La recherche révèle que Go's Le code source de CFBDecrypter et CFBEncrypter peut être facilement adapté pour prendre en charge CFB8. La modification implique de changer la taille du segment dans les lignes suivantes :

Code original :

func (f *cfb) XORKeyStream(dst, src []byte)

Code modifié :

func (f *cfb) XORKeyStream(dst, src []byte) {
    for i := 0; i < len(src); i += 1 {
        f.b[0] = f.b[0] << 8 | src[i] >> 8
        f.b[1] = src[i]
        dst[i] = f.b[f.s] ^ f.update(f.b[0]^f.b[1])
    }
}

En implémentant cette modification, Go prendra en charge CFB8 et sera capable de déchiffrer le texte chiffré à l'aide de l'implémentation Python. paramètres.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn