AES-Encryption

En esta pagina enseñare como funciona una tool desarollada por mi para poder encriptar archivos usando la libreria tiny-aes

Este codigo no se puede usar en producción ya que es necesario remover tanto la clave hardcodeada y eliminar cualquier printf que muestre secretos

Definiciones iniciales

  • WIN32_LEAN_AND_MEAN reduce macros innecesarias del windows.h

  • bcrypt.h se usa para BCryptGenRandom (RNG de Windows)

  • crypto/aes.h es la API de tiny-aes que se usa (proporciona AES_ctx, AES_init_ctx_iv, AES_CBC_encrypt_buffer)

checkPadding

bool checkPadding(unsigned char payload[], size_t sizePayload) {
    return (sizePayload % 16 == 0)
               ? true
               : false;
}
  • Devuelve true si sizePayload ya es múltiplo de 16 (tamaño de bloque AES), false si no

  • AES-CBC en tiny-aes requiere que el buffer a cifrar tenga longitud múltiplo de 16 bytes

fillPadding

void fillPadding(unsigned char payload[], size_t sizePayload, unsigned char **newPayload, size_t *newSize) {
    size_t size = ((sizePayload + (15)) / 16) * 16;

    unsigned char *pNewpayload = (unsigned char *) malloc(size);

    if (!pNewpayload) {
        *newPayload = NULL;
        *newSize = 0;
        return;
    }

    memcpy(pNewpayload, payload, sizePayload);

    memset(pNewpayload + sizePayload, 0x00, size - sizePayload);

    *newSize = size;
    *newPayload = pNewpayload;
}
  • Calcula el siguiente múltiplo de 16 para sizePayload

  • Reserva size bytes con malloc

  • Copia sizePayload bytes desde payload a la nueva área

  • Rellena el resto con ceros (0x00)

  • Devuelve el puntero en *newPayload y tamaño en *newSize

encriptar

  • Comprueba encryptedPayload y encryptedPayloadSize no nulos. Bien evitar writes a punteros nulos

  • No comprueba must_free (se asume que es válido si se pasa)

A continuación proporciono el enlace al código completo en mi github

Última actualización