
Criptografia a partir de Morfismos de Feixes Não Lineares sobre Grafos
Criptografia Pós-Quântica Baseada em Feixes via Permutações de Corpo Finito com Valores Vetoriais
Uma primitiva criptográfica baseada no Problema de Inversão de Morfismo de Feixe Não Linear (NL-SMIP): um sistema polinomial com coeficientes secretos acoplados por cohomologia de feixes sobre grafos.
Artigo (v3): L. Alaniz Pintos, "A Cifra Alaniz v3: Criptografia Pós-Quântica Baseada em Feixes via Permutações de Corpo Finito com Valores Vetoriais", 2026.
A versão 2 introduziu σ_SPN para derrotar o ataque de escalonamento que quebrou a v1. No entanto, a v2 é, por si só, quebrada por um ataque mais geral que combina interpolação polinomial com computação de base de Gröbner: qualquer criptografia determinística da forma c = As + Bσ(As) com σ de grau polinomial limitado permite um ataque de recuperação de chave CPA. Veja a Seção 3 do artigo e experiments/02_cpa_attack_analysis.py.
A versão 3 aborda isso no nível estrutural:
| Característica | v2 | v3 |
|---|---|---|
| Criptografia | Determinística | Probabilística (nonce + PRG) |
| σ | SPN componente a componente sobre F_p | Com valores vetoriais: π_e(x) = x^e em F_{p^d} |
| Chave secundária | Matriz B_v ∈ GL(d, F_p) | Escalar β_v ∈ F_{p^d}^* |
| Descriptografia | Força bruta sobre F_p^d | Fatoração univariada em F_{p^d}[τ] |
| Uniformidade diferencial de σ | δ ≥ 2p (~34 para p=17) | δ ∈ {2, 4} (APN ou quase-APN) |
| Alvo IND-CCA | Não aplicável | Alcançado via transformação FO |
14 configurações de semi-regularidade testadas, 14 correspondem exatamente às previsões de Hilbert-Poincaré. Nenhuma vulnerabilidade MinRank pelo Teorema 6.5 (argumento centralizador). Nenhuma chave fraca detectada em 69 configurações.
As mensagens são codificadas como seções globais de um feixe celular em um grafo com posto cíclico β_1 ≥ 1. Criptografia por nó:
r_v = PRG(nonce, v)
u_v = ι(A_v · s_v + r_v) ∈ F_{p^d}
w_v = β_v · u_v + (β_v − 1) · (L · u_v + 1)^e
c_v = ι^{-1}(w_v) − r_v
onde A_v ∈ GL(d, F_p), β_v ∈ F_{p^d}^*, e L ∈ F_{p^d}^* é público. A descriptografia se reduz a encontrar raízes de γ·τ^e + α·τ − (c′ + α) = 0 em F_{p^d}[τ] via Cantor-Zassenhaus, depois filtrando via consistência cohomológica em todos os n − 1 vértices não raiz.
| Conjunto | d | log₂ p | n | e | |sk| | |pk| | |c| | Segurança | |---|---|---|---|---|---|---|---|---|---| | Demonstração | 2 | 4 | 4 | 17 | 30 B | 10 B | 16 B | não segura | | Acadêmico | 3 | 16 | 8 | 17 | 0.3 KB | 30 B | 96 B | ~80 bits clássico | | PQ-128 | 6 | 61 | 32 | 17 | 16 KB | 64 B | 1.5 KB | ≥128 pós-Grover | | PQ-256 | 8 | 127 | 64 | 17 | 170 KB | 128 B | 8 KB | ≥256 pós-Grover |
git clone https://github.com/QuantuSync/alaniz-cipher.git
cd alaniz-cipher
pip install -e .[test]
# Run the v2 demo (historical)
python -m alaniz.demo.demo_basic
# Run all tests
pytest tests/ -v
# Run v3 verification experiments
python experiments/07_semi_regularity.py
python experiments/08_weak_keys.py
python experiments/09_nonce_robustness.py
python experiments/10_centralizer.py
python experiments/11_kem_verification.py
from alaniz.core.field import FiniteField
from alaniz.core.graph import Graph
from alaniz.core.sheaf import Sheaf
from alaniz.crypto.protocol import ProtocolV3, PublicParamsV3
from alaniz.crypto.kem import KEM
Fp = FiniteField(17)
graph = Graph.cycle(4)
sheaf = Sheaf.random_with_cohomology(graph, dv=2, Fp=Fp)
proto = ProtocolV3(PublicParamsV3.generate(sheaf))
kem = KEM(proto)
sk = kem.keygen()
K, ct = kem.encaps(sk) # sender: random message + shared key
K_recv = kem.decaps(sk, ct) # receiver: same K if valid
assert K == K_recv
alaniz-cipher/
├── alaniz/
│ ├── core/
│ │ ├── field.py # Aritmética F_p (v2, ainda usado pela v1/v2)
│ │ ├── field_ext.py # Aritmética F_{p^d} via galois (v3)
│ │ ├── graph.py # Topologias de grafo (árvores, ciclos, etc.)
│ │ └── sheaf.py # Feixes celulares + restrições de cohomologia
│ ├── crypto/
│ │ ├── sigma.py # Mapas σ: monomial_power (v3), id_spn (v2), cube/inverse (v1)
│ │ ├── protocol.py # Protocolo (v2), ProtocolV3 (v3)
│ │ ├── prg.py # PRG SHAKE-256 para derivação de nonce (v3)
│ │ └── kem.py # Fujisaki-Okamoto → KEM IND-CCA (v3)
│ └── demo/
│ └── demo_basic.py # demonstração v2 (histórica)
├── experiments/
│ ├── 01-06_*.py # análises v1 (históricas, Apêndice do artigo v2)
│ ├── 14_v2_redteam.py # teste de penetração v2 (histórico)
│ ├── 07_semi_regularity.py # v3: verificação de Hilbert-Poincaré
│ ├── 08_weak_keys.py # v3: varredura de chave fraca com 69 configurações
│ ├── 09_nonce_robustness.py # v3: Teorema 6.7
│ ├── 10_centralizer.py # v3: Teorema 6.5
│ └── 11_kem_verification.py # v3: testes empíricos de KEM IND-CCA
├── tests/
│ ├── test_protocol.py # testes v2 (mantidos para regressão)
│ └── test_protocol_v3.py # testes v3
├── pyproject.toml
└── README.md
v1: Quebrada pelo ataque de escalonamento de Langa em σ_cube(λy) = λ³ σ_cube(y) (Alaniz 2026, Apêndice A do artigo v3). Recuperação em O(d) consultas.
v2: Quebrada por ataque de interpolação polinomial + Gröbner contra qualquer c = As + Bσ(As) determinística com σ de grau limitado. Para d=2, p=17, recuperação completa da chave em 20 consultas CPA e ~5,7s de computação SymPy em 10/10 instâncias aleatórias. Veja experiments/02_cpa_attack_analysis.py e Seção 3 do artigo.
As classes v1 e v2 permanecem acessíveis neste repositório para reprodutibilidade histórica. Para qualquer novo uso, use ProtocolV3.
@misc{alaniz2026cipherv3,
author = {Alaniz Pintos, Lucas},
title = {The Alaniz Cipher v3: Sheaf-Based Post-Quantum Encryption
via Vector-Valued Finite Field Permutations},
year = {2026},
url = {https://github.com/QuantuSync/alaniz-cipher}
}
A. Rodríguez Langa (INECO) pela criptoanálise da v1 que motivou o caminho de redesenho levando à v2 e, finalmente, à v3.
Lucas Alaniz Pintos Divisão de Produtos Inteligentes, INECO [email protected] ORCID: 0009-0008-5179-2534
MIT