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)
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.