Thiago, li o repositório inteiro (README + bioemergent.py v2.2.0). Você pediu crítica, então vai.
Não é pós-quântica
A cifragem é XOR(plaintext, SHA256-CTR(seed)). SHA-256 é problema matemático. Grover reduz a busca da seed pela metade dos bits, igual a qualquer construção baseada em hash. A "validação semântica" por cosseno roda depois do XOR e não participa da confidencialidade contra observador passivo. Dizer "imune a ataques quânticos por ausência de problema matemático" não fecha: o problema continua lá, só foi renomeado.
PQC tem definição formal. NIST padronizou ML-KEM (FIPS 203), ML-DSA (FIPS 204) e SLH-DSA (FIPS 205) em 2024. Vender isso como "solução PQC" sem dialogar com nada disso atrai um escrutínio que o sistema não aguenta.
A "ausência de chave" também não procede
O vetor P(t) é a chave. É objeto estático em RAM, serializável em texto claro via exportar(), copiável, transmissível. gerar_par() faz c._estado.vetor = s._estado.copiar(), ou seja, copia a chave. Renomear "chave" para "estado" não muda o que a coisa é. O próprio README admite: "Comprometer servidor → equivale a acesso root". Isso é a definição de chave simétrica.
Bugs, em ordem de gravidade
1. Nonce reuse
self._contador incrementa só em decifrar() quando a similaridade passa. Em cifrar() nunca incrementa. Duas mensagens em sequência sem decifrar no meio usam a mesma máscara. Two-time pad: C1 XOR C2 = P1 XOR P2, recuperável com análise de frequência trivial.
2. Sem autenticação
XOR sem MAC, sem AEAD. Atacante flipa bits no ciphertext e o plaintext flipa nos mesmos bits. A similaridade por cosseno roda depois do decrypt, então não impede injeção. O atacante não precisa passar na similaridade pra causar dano.
3. hash(msg) no _encode
Python tem hash randomization por processo. O mesmo msg produz vetores diferentes em processos diferentes. Cliente e servidor em máquinas distintas nunca convergem na similaridade. E hash() retorna 64 bits, não é função criptográfica.
4. derivar_semente com baixa entropia
int(np.dot(self.vetor, self.vetor[::-1]) * 1e12) colapsa 256 floats em uns 40 bits úteis (precisão de float64 truncada). Entropia real muito menor do que o vetor sugere.
5. except: nu no decifrar
Engole KeyboardInterrupt e tudo o mais.
6. exportar() serializa o vetor em texto claro
Sem wrapping, sem derivação. Quem pega o arquivo tem a chave.
A ideia não é nova
"Estado compartilhado que evolui a cada mensagem validada" tem nome: ratcheting. O Signal Protocol (Double Ratchet, 2013) resolve esse problema. HKDF em cada passo, DH ratchet pra forward secrecy real, AEAD em cada mensagem, prova de segurança no modelo padrão. Vale ler o spec antes de continuar iterando, porque ele cobre os mesmos problemas que você está tentando resolver intuitivamente.
A similaridade de cosseno como "validação metabólica" é interessante, mas o lugar dela é como camada de detecção de anomalia em cima de um AEAD padrão, não no lugar dele. Aí vira contribuição original.
Sobre o framing
Wheeler, Penrose, Hawking, Bohm, Zeilinger no rodapé, mais a retórica de "irreversibilidade do tempo" e "linguagem que só existe entre eles": a comunidade de cripto associa isso a projeto amador na hora. Sistema sério se vende com prova de redução a problema computacional. Esse não tem. Esse framing afasta justamente quem poderia te dar feedback técnico de qualidade.
Se quiser continuar
- Tira "pós-quantico" do título. Não é.
- Reposiciona como "experimento de ratcheting com validação semântica".
- Substitui o XOR caseiro por ChaCha20-Poly1305 com nonce derivado de contador.
- Move a similaridade de cosseno pra camada de anomalia em cima do AEAD.
- Lê o paper do Double Ratchet do Signal.
Não é pra desanimar. É pra você não publicar como PQC e levar bronca de desconhecidos na net.