encriptacion - encriptar y desencriptar c#
Uso de trazos de lápiz con algoritmo de tolerancia difusa como clave de cifrado (7)
¿Cómo puedo encriptar / desencriptar con tolerancia difusa?
Quiero poder utilizar un trazo en un InkCanvas como clave para mi cifrado, pero al descifrar de nuevo el usuario no debería tener que dibujar exactamente el mismo símbolo, solo similar. ¿Se puede hacer esto en .NET C #?
--- Actualización (9 sep) ---
Lo que idealmente quiero es un algoritmo de encriptación que acepte cualquier clave en un cierto rango de teclas basado en alguna clave base y una función que defina las diferencias permitidas.
Estoy haciendo todo el cifrado / descifrado localmente, así que no necesitaré enviar nada por un cable de forma segura. Y no quiero almacenar la clave utilizada para el cifrado, así que no tendré nada con qué compararme. Podría encontrar algún método para generar la misma clave para cada golpe similar, pero no es fácil si quiero aceptar cualquier tipo de símbolo (no solo letras). La otra opción es si la clave de cifrado de alguna manera podría aceptar claves similares por diseño, que no sé si es posible ...?
El problema aquí es que la clave que se utiliza para el cifrado (el trazo o algo derivado del trazo) se debe enviar junto con el mensaje cifrado. De lo contrario, no hay forma de que el protocolo de descifrado compare el trazo de descifrado con el original.
Entonces, supongamos que Alicia quiere encriptar algún mensaje M
Ella es la única persona que debe descifrar el mensaje, por lo que Bob no está en la imagen. Alice genera una clave de cifrado difusa Ke
y encripta M
para convertirse en Me
: Encrypt(M,Ke) = Me
. El mensaje que se envía es (Ke,Me)
. En el lado de recepción, Alice produce la clave de descifrado borrosa Kd
. Algún algoritmo comprueba que Ke ~ Kd
y Me
están descifrados: Decrypt(Me,Ke) = M
Tenga en cuenta que esto es una encriptación simétrica; Kd
solo se usa para verificar que es "suficientemente igual" a Ke
.
Por supuesto, el problema es que Ke
se envía en texto claro junto con el mensaje para que Eve simplemente tome la llave y Me
descifre. Sin embargo, se necesita Ke
en el lado receptor para compararlo con Kd
. Entonces, ¿cómo enviamos a Ke
junto con el mensaje sin que Eve pueda escuchar a escondidas? Podríamos crear un hash de Ke
y enviarlo a través de la línea: (Hash(Ke),Me)
. Sin embargo, en el lado receptor no habría forma de verificar la "igualdad suficiente" entre Ke
y Kd
base a Hash(Ke)
.
Podríamos usar algún algoritmo que genere un valor basado en Ke
tal que si Ke ~ Kd -> V(Ke) ~ V(Kd)
(si Ke
y Kd
son similares, los valores generados son similares). Enviamos el mensaje (V(Ke),Me)
al receptor. Sin embargo, ahora sería relativamente fácil para Eva determinar Ke
basado en V(Ke)
. Ella comienza con una clave candidata aleatoria: KeC
y usando nuestro algoritmo, determina una V(KeC)
. Si no se parece en nada a la V(Ke)
del mensaje, realiza algunos cambios drásticos en el candidato KeC
e intenta de nuevo. A medida que se acerca al V(Ke)
del mensaje, realiza pequeños cambios en KeC
, etc.
Por lo tanto, es imposible crear un esquema de cifrado seguro si permitimos que se envíe Ke
junto con el mensaje. Esto significa que Ke
debe ser entregado a Trent , el tercero de confianza. En este caso, Trent puede ser la base de datos de la aplicación. Entonces ahora el esquema se convierte en lo siguiente:
Alice genera Ke
, un mensaje M
y un identificador de Id
único. Ke
se almacena con Trent, nuestra base de datos, junto con Id
. M
se cifra utilizando un esquema de cifrado regular que utiliza Ke
como clave: Me = Encrypt(M,Ke)
. El mensaje enviado al receptor es (Me,Id)
.
En el lado de recepción, Alice recibe el mensaje (Me,Id)
. Alice genera Kd
. Basado en Id
, obtenemos el Ke
correspondiente de Trent y lo comparamos con Kd
. Si hay una coincidencia, desciframos Me
: M = Decrypt(Me,Ke)
.
El único problema ahora es cuando tienes un intruso Mallory con acceso a Trent. Él puede pedirle a Trent valores de Ke
basados en identificaciones aleatorias. Para evitar esto, no debe incluir Id
en el mensaje para que el mensaje simplemente se convierta en (Me)
. Ahora tendrías que idear una estrategia para obtener candidatos Ke
de Trent solo usando Kd
. Esto, por supuesto, es posible porque puede comparar Kd
con todos los Ke
en la base de datos, devolver el Ke
más "similar" e intentarlo como la clave de descifrado. Esta estrategia supone que el trazo (o Ke) de cada persona es suficientemente diferente.
La estrategia anterior se toma prestada del cifrado biométrico en el que almacena datos biométricos en una base de datos y los utiliza para identificar o autenticar individuos. Intenta buscar en Google cifrado biométrico para obtener información adicional.
Hay una serie de esquemas de encriptación que permiten secretos difusos. Con frecuencia, estos esquemas se desarrollan para proteger los secretos con información biométrica (es decir, huellas dactilares, escaneos de retina), pero los esquemas subyacentes son más generalmente aplicables. Un ejemplo de tal esquema es un esquema de bóveda difusa propuesto por Juels y Sudán.
Utilice alguna forma de reconocimiento óptico de caracteres ( OCR ) para convertir el trazo en texto normal y luego use ese texto como la clave. Siempre que el usuario dibuje cualquier cosa que obtenga OCR-ed en el mismo texto, podrá descifrarlo nuevamente.
Como señalé en un comentario, no sé que el cifrado difuso es un tema maduro , así que pensemos de manera lateral. Ya que está encriptando / descifrando localmente, ¿qué tal una implementación de hardware? Es decir, usted compra una tableta para hacer los datos biométricos y consolida una clave de cifrado convencional dentro de ella. Sería así:
- La tableta está configurada en modo kiosco , es decir, tiene un endurecimiento básico para evitar que la IU cambie de aplicación. También está protegido contra el robo y la manipulación física (por ejemplo, se almacena en una bóveda)
- El usuario conecta una llave USB que contiene el archivo encriptado.
- Tablet PC detecta qué dibujo esperar de un campo de metadatos (por ejemplo, del certificado X509 utilizado para el cifrado, si no le importa la sobreingeniería ).
- Tablet PC autentica al usuario a través de la magia biométrica adecuada.
- Tablet PC descifra el archivo y ofrece almacenarlo o explorarlo en la pantalla.
Tenga en cuenta que el paso 5 es el punto débil de la cadena de seguridad, ya que los ataques contra los lectores de documentos (por ejemplo, Acrobat Reader) son cada vez más frecuentes . Mejor utilizar algún tipo de esquema de sandboxing como una instancia de VMWare.
DE ACUERDO. Vamos a dividir tu problema en dos.
1) Fuzzy 2) Encriptación
La realidad es que ambos conceptos son relativamente antiguos y su implementación ha estado ahí por años. Cada uno trata muy bien el problema, pero esto no significa que la combinación de estos dos sea una buena idea. Creo que debes tener tu solución como un enfoque de dos etapas.
En primer lugar, los estándares de encriptación son excelentes para proteger los datos usando una tecla SIMPLE EXACTA. En su caso necesita algos de encriptación simétrica como AES o Rijndael.
La parte borrosa de la solución tampoco es tan difícil. Al igual que cualquier otra técnica de reconocimiento difuso, debe hacer una extracción de características y crear un vector para pasarlo al algoritmo de encriptación. Necesita crear confusión en sus características. Por ejemplo, número de golpes, cuadrante del punto de inicio para cada golpe, un factor de agitación para cada golpe y similares. Esto será suficiente para construir un vector de 32 bits para pasar al algoritmo de encriptación.
ACTUALIZAR
Trataré de hacerlo más ilustrativo:
2 bits para el número de golpes: 1, 2, 3, +3 que se traduce en 00, 01, 10 y 11
2 bits para el cuadrante del inicio del primer trazo: TopLeft, TopRight, BottomLeft, BottomRightt codifican a 00, 01, 10 y 11
2 bits para el cuadrante del final del primer trazo: ídem
2 bits para el cuadrante del inicio del segundo trazo: ídem. Si no hay un segundo trazo, entonces 00.
2 bits para el cuadrante del final del segundo trazo: ídem. Si no hay un segundo trazo, entonces 00.
2 bits para el cuadrante del inicio del tercer trazo: ídem. Si no hay un tercer trazo, entonces 00.
2 bits para el cuadrante del final del segundo trazo: ídem. Si no hay un tercer trazo, entonces 00.
2 bits para la agilidad del primer golpe: recto-> 00 ... Ronda agradable-> 11. Esto no va a ser muy fácil y puede reducir los grados de agitación a 2 y usar solo un bit, pero es un "chupar y ver".
Entonces esto es 16 bits. Puedes dejar el resto como cero por ahora e intentar ver cómo funciona.
Espero que esto ayude.
Una manera simple de hacerlo es codificar en su lugar mucha información sobre la clave, y luego averiguar con qué precisión coincide. Información de ejemplo, suponiendo que puede convertir la entrada del usuario en una aproximación de líneas / arcos / puntos:
Número de líneas rectas
Número de regiones cerradas
Cantidad de dibujo utilizado.
Desviación estándar de puntos en el eje x.
Desviación estándar de puntos en el eje y.
Desviación estándar del tamaño de las formas dibujadas.
Lista ordenada de áreas de las regiones adjuntas.
Etc.
Por lo tanto, en lugar de representar la imagen, estás representando las propiedades de la imagen. La falta de claridad será que le dé a cada una de estas propiedades un puntaje de precisión, agregue o multiplique, o bien combine el nivel de precisión total, y acepte la contraseña si supera cierto umbral.
Si codifica sus trazos como imágenes, existen algoritmos difusos para detectar similitudes entre las imágenes . Por supuesto, si usara este enfoque, debería usar un método de cifrado bidireccional en lugar de un hash unidireccional para que la imagen original se pueda recuperar.