es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Equivalente en Python3 de Java AES/CBC/NOPADDING

Estoy trabajando en un protocolo personalizado que funciona a través de UDP. Los paquetes enviados a través de la red están codificados con el algoritmo AES/CBC/NOPADDING en un cliente JAVA.

Estoy usando un cliente de python3, así que necesito descifrar estos paquetes. Mi pregunta es si hay alguna implementación de AES/CBC/NOPADDING en python3.

Actualmente estoy usando esto para decodificar en python:

def decrypt(key, data):
from Crypto.Hash.MD5 import MD5Hash
if data is None:
return None
cipher = AES.new(key.encode('utf8'), AES.MODE_CBC, bytes([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]))
return cipher.decrypt(data)

Pero el resultado de los datos es aleatorio y no está bien decodificado.

Sin embargo, puedo descifrar los paquetes con éxito en java de la siguiente manera:

Cipher cipher;

    try {
        cipher = Cipher.getInstance("AES/CBC/NOPADDING");
        try {
            cipher.init(Cipher.DECRYPT_MODE, aesKey, new IvParameterSpec(iv));
            try {
                cipher.doFinal(buffer, *** ...);            
            } catch (ShortBufferException | IllegalBlockSizeException | BadPaddingException e) {
                e.printStackTrace();
            }
        } catch (InvalidKeyException | InvalidAlgorithmParameterException e) {
            e.printStackTrace();
        }
    } catch (NoSuchAlgorithmException | NoSuchPaddingException e) {
        e.printStackTrace();
    }
}

Aquí pongo un ejemplo de trabajo:
Primero, cifro en java:

import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.io.UnsupportedEncodingException;
import java.util.List;

import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
import javax.crypto.ShortBufferException;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;

public class MyClass {
public static void main(String args[]) {
String keyBytes = "UfrGUmAJq86pVtkd";
String text_to_encrypt = "topotatopotatota";

    SecretKey aesKey = new SecretKeySpec(keyBytes.getBytes(), "AES");
    byte [] iv = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
    Cipher cipher;
    try {
        cipher = Cipher.getInstance("AES/CBC/NOPADDING");
        try {
            cipher.init(Cipher.ENCRYPT_MODE, aesKey, new IvParameterSpec(iv));
            try {
                String test = Base64.getEncoder().encodeToString(cipher.doFinal(text_to_encrypt.getBytes("UTF-8")));  
                System.out.println(test);
            } catch (IllegalBlockSizeException | UnsupportedEncodingException | BadPaddingException e ) {
                e.printStackTrace();
            }
        } catch (InvalidKeyException | InvalidAlgorithmParameterException e) {
            e.printStackTrace();
        }
    } catch (NoSuchAlgorithmException | NoSuchPaddingException e) {
        e.printStackTrace();
    }
}

}

Luego decodifico en python:

from hashlib import md5
from base64 import b64decode
from base64 import b64encode

from Crypto.Cipher import AES
from Crypto.Random import get_random_bytes
from Crypto.Util.Padding import pad, unpad

class AESCipher:
def init(self, key):
self.key = md5(key.encode('utf8')).digest()

def decrypt(self, data):
    raw = b64decode(data)
    self.cipher = AES.new(self.key, AES.MODE_CBC, bytes([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]))
    return self.cipher.decrypt(raw)

if name == 'main':
key = "UfrGUmAJq86pVtkd"
expectedt_result = "topotatopotatota"
encrypted_data = "ynCF3bJejxlLn1aAk8vcAw=="
cipher = AESCipher(key)
decrypted_data = cipher.decrypt(encrypted_data)
print(decrypted_data)

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Sí, hay una implementación de AES/CBC/NOPADDING en Python3 utilizando la librería PyCrypto. Sin embargo, el código proporcionado para la decriptación en Python parece ser incorrecto, lo que lleva a datos decriptados aleatorios. Se proporciona un ejemplo de trabajo para la encriptación en Java y la decriptación en Python utilizando la implementación correcta en los fragmentos de código. El código de Java encripta el texto “topotatapotatota” con la clave “UfrGUmAJq86pVtkd” utilizando el algoritmo AES/CBC/NOPADDING, y devuelve el texto cifrado codificado en base64. El código de Python toma el texto cifrado codificado en base64 y la misma clave, y utiliza la librería PyCrypto para decriptar el texto cifrado y devolver el texto original. La función de decriptación en Python rellena el texto cifrado antes de la decriptación utilizando la función unpad de la librería PyCrypto.

Comments are closed.