Puede usar cualquier cifrado simétrico que funcione generando un flujo de bytes dependiente de la clave que luego se XORed con los datos para cifrar. Este es el caso de la mayoría de los cifrados de flujo ; esto también se aplica a un cifrado de bloque en modo CTR (que prácticamente convierte un cifrado de bloque en una secuencia cifrado).
Dichos cifrados son un poco delicados de usar, porque nunca reutilizará una secuencia determinada dependiente de la clave (que sería el infame "pad dos veces"). Esto significa que una clave dada se usará para cifrar solo un mensaje un , o que usted usa un cifrado de flujo con un vector de inicialización que necesitará su propia gestión. Crucialmente , en su caso, esto significa que no se debe permitir que los atacantes potenciales observen E (k1, t) , E (k2, t) y E (k1, E (k2, t)) , porque esto les permitiría recuperar t (es decir, al XORAR las tres secuencias juntas).
Si su escenario específico hace que la solución de cifrado de flujo no sea aplicable, entonces tendría que usar soluciones más esotéricas que no son estándar, por lo que no se pueden recomendar en la práctica (pero están bien para investigación). Por ejemplo, dados parámetros del grupo Diffie-Hellman (un módulo p y un generador g que es tal que g q = 1 mod p para un primo q que divide p-1 ), un elemento de subgrupo (un gx para algún entero x ) se puede "cifrar" con la clave a elevándola a la potencia a ( E (a, h) = h a mod p ). "Descifrado" implica subir a potencia 1 / a mod q (el módulo inverso q se calcula con algoritmo euclidiano extendido ). Con este algoritmo de "encriptación", obtiene la conmutatividad que busca ( E (a, E (b, h)) = E (b, E (a, h)) ) Y puede publicar E (a, h) , E (b, h) y E (a, E (b, h)) sin revelar h .
... pero eso es solo una variante de Diffie-Hellman. La buena pregunta es entonces: ¿por qué quieres tu cifrado conmutativo? ¿Qué estás tratando de hacer, que Diffie-Hellman no puede hacer?