PWR Arca

Almacenamiento cifrado con enlaces temporales. Sube archivos cifrados con las 6 capas criptograficas de Cuantica y genera enlaces de descarga con expiracion, limite de descargas y proteccion por password. PHP puro, sin dependencias externas.

Instalacion

Arca depende de Cuantica para el cifrado. Ambos archivos se cargan automaticamente.

PHP
require_once __DIR__ . '/core/arca.php';
// cuantica.php se carga automaticamente

Requisitos minimos

  • PHP 7.4 o superior
  • Extensiones openssl y sodium
  • Permisos de escritura en datos/arca/
  • Espacio en disco suficiente para los archivos cifrados

Inicio rapido

Sube un archivo, cifralo y genera un enlace temporal de descarga.

PHP
require_once 'core/arca.php';

$subida = pwr_arca_subir('/ruta/documento.pdf', 'mi_password');
$enlace = pwr_arca_crear_enlace($subida['id'], 'mi_password');
echo 'Descarga: ' . $enlace['url'];

Funciones

pwr_arca_subir()

Sube y cifra un archivo con las 6 capas de Cuantica. Almacena metadatos en el indice.

Firma
pwr_arca_subir(string $ruta_archivo, string $password, array $metadata_extra = []): array
ParametroTipoDescripcion
$ruta_archivostringRuta absoluta al archivo a subir
$passwordstringPassword para cifrar el archivo
$metadata_extraarrayMetadatos adicionales (etiquetas, descripcion, etc.)

Retorna: array con ok, id, nombre, tamano, tamano_cifrado.

pwr_arca_descargar()

Descifra y devuelve el contenido de un archivo almacenado.

Firma
pwr_arca_descargar(string $id, string $password): array
ParametroTipoDescripcion
$idstringID del archivo en el almacen
$passwordstringPassword de descifrado

Retorna: array con ok, contenido (datos binarios), nombre, mime.

pwr_arca_crear_enlace()

Genera un enlace temporal de descarga con expiracion, limite de descargas y password opcional.

Firma
pwr_arca_crear_enlace(string $id, string $password, array $opciones = []): array
ParametroTipoDescripcion
$idstringID del archivo
$passwordstringPassword de cifrado del archivo
$opcionesarrayOpciones: expira_horas, max_descargas, password_enlace

Retorna: array con ok, token, url, expira.

pwr_arca_verificar_enlace()

Verifica si un enlace temporal es valido (no expirado, no superado el limite de descargas).

Firma
pwr_arca_verificar_enlace(string $token): array

Retorna: array con ok, archivo_id, descargas_restantes, expira.

pwr_arca_listar()

Lista todos los archivos almacenados con sus metadatos (sin contenido descifrado).

Firma
pwr_arca_listar(): array

Retorna: array de archivos, cada uno con id, nombre, tamano, fecha_subida, mime.

pwr_arca_borrar()

Elimina un archivo cifrado y su entrada del indice.

Firma
pwr_arca_borrar(string $id): array

Retorna: array con ok y mensaje.

pwr_arca_info()

Devuelve informacion y metadatos de un archivo concreto sin descifrar su contenido.

Firma
pwr_arca_info(string $id): array

Retorna: array con metadatos del archivo: id, nombre, tamano, mime, fecha_subida.

pwr_arca_servir_enlace()

Sirve la descarga de un archivo a traves de un enlace temporal. Envia headers HTTP y el contenido descifrado.

Firma
pwr_arca_servir_enlace(string $token, string $password_enlace = null): void
ParametroTipoDescripcion
$tokenstringToken del enlace temporal
$password_enlacestring|nullPassword del enlace si fue creado con proteccion

pwr_arca_estadisticas()

Devuelve estadisticas globales del almacen: total de archivos, espacio usado, enlaces activos.

Firma
pwr_arca_estadisticas(): array

Retorna: array con total_archivos, espacio_usado, enlaces_activos, descargas_totales.

Configuracion

Arca utiliza constantes definidas en el propio archivo y rutas de almacenamiento en datos/arca/. Los metadatos se guardan en datos/arca_index.json y los enlaces en datos/arca_enlaces.json.

Estructura de directorios
datos/
  arca/                  // Archivos cifrados
  arca_index.json        // Indice de metadatos
  arca_enlaces.json      // Enlaces temporales activos
Seguridad: Los archivos cifrados se almacenan con nombres aleatorios (UUID). El nombre original solo existe en el indice JSON y en los metadatos cifrados dentro del propio archivo.

Ejemplos

Subir y compartir un archivo con enlace protegido

PHP
require_once 'core/arca.php';

// Subir archivo cifrado
$subida = pwr_arca_subir('/documentos/contrato.pdf', 'clave_maestra', [
    'etiqueta' => 'contratos',
    'descripcion' => 'Contrato firmado Q1 2025'
]);

// Crear enlace temporal: 24h, max 3 descargas, con password
$enlace = pwr_arca_crear_enlace($subida['id'], 'clave_maestra', [
    'expira_horas' => 24,
    'max_descargas' => 3,
    'password_enlace' => 'descarga2025'
]);

echo 'Enlace: ' . $enlace['url'];

Listar archivos y obtener estadisticas

PHP
require_once 'core/arca.php';

// Listar todos los archivos
$archivos = pwr_arca_listar();
foreach ($archivos as $archivo) {
    echo $archivo['nombre'] . ' - ' . $archivo['tamano'] . ' bytes' . "\n";
}

// Estadisticas globales
$stats = pwr_arca_estadisticas();
echo 'Total archivos: ' . $stats['total_archivos'];
echo 'Espacio usado: ' . $stats['espacio_usado'];

Servir descarga desde enlace temporal

descargar.php
require_once 'core/arca.php';

$token = $_GET['t'] ?? '';
$password = $_POST['password'] ?? null;

// Verificar validez del enlace
$valido = pwr_arca_verificar_enlace($token);
if (!$valido['ok']) {
    die('Enlace invalido o expirado');
}

// Servir archivo (envia headers + contenido)
pwr_arca_servir_enlace($token, $password);

Borrar archivos antiguos

PHP
require_once 'core/arca.php';

$archivos = pwr_arca_listar();
foreach ($archivos as $archivo) {
    // Borrar archivos de mas de 30 dias
    if (strtotime($archivo['fecha_subida']) < strtotime('-30 days')) {
        pwr_arca_borrar($archivo['id']);
    }
}