2010-10-27 9 views
10

Necesito algunos punteros o un ejemplo práctico sobre cómo encriptar una int a otra int, y se necesitaría una clave secreta para descifrar el valor.entero simétrico a la encripción entera

Algo así como:

encrypt(1, "secret key") == 67123571122 
decrypt(67123571122, "secret key") == 1 

Este individuo pide más o menos la misma pregunta: Symmetric Bijective Algorithm for Integers
sin embargo yo siendo un total de cifrado "n00b" Me gustaría algunos ejemplos más prácticos, en Python, si es posible.

entiendo que necesito utilizar algún tipo de cifrado de bloques, pero estoy bastante perdido por parte de mantener el resultado cifrado todavía ser numérico y un poco corto (quizás mucho en lugar de un int)

Cualquier punteros? Gracias

ACTUALIZACIÓN- ¿Por qué quiero hacer esto?
Tengo un servicio web en la que cada "objeto" consigue un URL, por ejemplo .: example.com/thing/123456/

En este momento, esas identificaciones son secuenciales. Quiero ocultar el hecho de que son secuenciales (ID de base de datos).

Las cosas en esas páginas no son "de alto secreto" ni nada por el estilo, pero no debería ser tan fácil para alguien husmear en algún otro objeto aleatorio como simplemente incrementar esa ID en la URL.

Por lo tanto, con algún tipo de cifrado numérico bidireccional, los ID de URL no serán secuenciales en absoluto, y le tomaría a alguien bastante tiempo encontrar más de estos objetos. (Además, las solicitudes se aceleran)

Y la única razón por la que quiero mantener este número en lugar de una cadena arbitraria es para que el cambio sea un reemplazo total, y todo funcionará sin ningún otro cambio de código.

Además, no puedo simplemente generar nuevas ID de bases de datos aleatorias. Tengo que manejar este cifrado/descifrado en la aplicación.

+2

¿Por qué haces esto? ¿Cuál es el objetivo? Es muy peligroso crear tu propia criptografía. Incluso cosas engañosamente simples como "solo use cifrado X" pueden tener ramificaciones de seguridad inesperadas. –

+0

Buen punto. Actualicé la pregunta – adamJLev

+0

[Formato que preserva el cifrado] (http://en.wikipedia.org/wiki/Format-preserving_encryption) –

Respuesta

3

Depende de la seguridad criptográfica que desee. Para no muy seguro (en el sentido criptográfico, probablemente sea bueno para el uso diario si realmente no se espera un ataque serio), entonces funcionará XOR con una clave secreta fija. Solo ten en cuenta que será vulnerable a algunos criptoanálisis bastante básicos.

Si desea una encriptación real, probablemente tenga que usar un cifrado de flujo como RC4. Puede tomar 32 bits de keystream y XOR con su valor para encriptarlo. Siempre y cuando obtenga un nuevo flujo de claves de 32 bits para cada valor, estará bien.

RC4 tiene algunas advertencias, sin embargo, así que lee primero.

Las cifras de bloque no serán su amiga en este caso, ya que todas tienen tamaños de bloque de 64 bits o más. Esto significa que debe rellenar su entero de 32 bits a 64 bits y obtendrá 64 bits de vuelta ... pero no puede elegir qué 32 conservar. No podrá descifrarlo con solo la mitad de los bits. Si te agrada mover a longs entonces puedes usar 3DES o Blowfish.

Todo depende exactamente de lo que está encriptando y por qué, por lo que es difícil dar una respuesta definitiva. Espero que esto dé una idea de por dónde empezar, al menos.

+1

+1 para el cifrado de bloques de 64 bits. Tengo un ejemplo de código aquí: http://stackoverflow.com/questions/3569783/query-string-parameter-obfuscation/3571165#3571165 También un número entero de 64 bits representado como hex tiene solo 16 caracteres y debería estar bien para usar en una URL. –

0

¿Desea cifrar solo un número 'int', es decir, q 32/64 bit?
Entonces la forma más fácil es simplemente XOR con una clave secreta de 32/64bit.

+0

Alternativamente, XOR con una clave más pequeña, repetida en el lapso del número. –

+0

¿Cómo sería el código de este, más o menos? – adamJLev

+0

tenga cuidado con xor directo porque con solo 64 ejemplos existe la posibilidad de que el usuario pueda descifrar la clave. –

1

Puede consultar este documento: Perfect Block Ciphers with Small Blocks y the slides de la presentación en la conferencia FSE 2007.

El documento explica cómo seleccionar al azar una permutación de n elementos (por ejemplo, el entero entre 0 y n-1) que se puede ver como un cifrado para este conjunto de n elementos.

1

La respuesta que publiqué a esa pregunta se aplica también a la suya: use un cifrado de bloque corto. Asumiendo que sus identificadores son de 64 bits, de hecho, simplemente puede usar el cifrado XTEA tal como está, con un entero de 64 bits como bloque de datos.

+0

Eso suena lo suficientemente bueno, y el código para XTEA parece lo suficientemente simple como para ser fácilmente portado a Python. Thx voy a dar una oportunidad – adamJLev

0

El XOR simple no se puede llamar cifrado. Ofuscación es una palabra más apropiada para ello. He desarrollado un algoritmo compacto, rápido y con suerte seguro que lo llamo Ayden. Está en dominio público y can be downloaded from Github. Espero que sea útil.