Estoy buscando una funcionalidad de ofuscación muy simple (como cifrar y descifrar, pero no necesariamente segura) para algunos datos. No es de misión crítica. Necesito algo para mantener a la gente honesta honesta, pero algo un poco más fuerte que ROT13 o Base64 .
Prefiero algo que ya está incluido en .NET Framework 2.0, por lo que no tengo que preocuparme por ninguna dependencia externa.
Realmente no quiero tener que perder el tiempo con las claves públicas / privadas, etc. No sé mucho sobre el cifrado, pero sé lo suficiente como para saber que cualquier cosa que escribí sería menos que inútil ... De hecho, Probablemente arruinaría las matemáticas y haría trivial el crack.
c#
obfuscation
Matt Dawdy
fuente
fuente
Respuestas:
Otras respuestas aquí funcionan bien, pero AES es un algoritmo de cifrado más seguro y actualizado. Esta es una clase que obtuve hace unos años para realizar el cifrado AES que he modificado con el tiempo para que sea más amigable con las aplicaciones web (por ejemplo, he creado métodos de cifrado / descifrado que funcionan con cadenas compatibles con URL). También tiene los métodos que funcionan con matrices de bytes.
NOTA: ¡debe usar diferentes valores en las matrices Key (32 bytes) y Vector (16 bytes)! ¡No querría que alguien descubriera sus claves simplemente asumiendo que utilizó este código tal como está! Todo lo que tiene que hacer es cambiar algunos de los números (deben ser <= 255) en las matrices Clave y Vector (dejé un valor no válido en la matriz Vector para asegurarme de que haga esto ...). Puede usar https://www.random.org/bytes/ para generar un nuevo conjunto fácilmente:
Key
Vector
Usarlo es fácil: simplemente crea una instancia de la clase y luego llama (generalmente) EncryptToString (string StringToEncrypt) y DecryptString (string StringToDecrypt) como métodos. No podría ser más fácil (o más seguro) una vez que tenga esta clase en su lugar.
fuente
Limpié SimpleAES (arriba) para mi uso. Métodos de cifrado / descifrado contorneados fijos; métodos separados para codificar buffers de bytes, cadenas y cadenas compatibles con URL; hizo uso de las bibliotecas existentes para la codificación de URL.
El código es pequeño, más simple, más rápido y el resultado es más conciso. Por ejemplo,
[email protected]
produce:Código:
fuente
Sí, agregue el
System.Security
ensamblado, importe elSystem.Security.Cryptography
espacio de nombres. Aquí hay un ejemplo simple de un cifrado de algoritmo simétrico (DES):fuente
Solo pensé en agregar que he mejorado el SimplerAES de Mud al agregar un IV aleatorio que se devuelve dentro de la cadena encriptada. Esto mejora el cifrado ya que cifrar la misma cadena dará como resultado una salida diferente cada vez.
Y prueba de unidad de bonificación
fuente
System.Random
como RNG. 2) Esto está completamente roto contra los ataques de texto cifrado elegidos (en particular los oráculos de relleno)Una variante de respuesta de Marcas (excelente)
Espero que esto ayude
fuente
[EDITAR] Años después, he vuelto para decir: ¡no hagas esto! Consulte ¿Qué tiene de malo el cifrado XOR?para detalles.
Un cifrado bidireccional muy simple y fácil es el cifrado XOR.
mypass
.mypassmypassmypass...
)mypassmypassmypass...
).fuente
Combiné lo que encontré mejor de varias respuestas y comentarios.
Código:
Actualización 2015-07-18: Se corrigió el error en el método privado Encrypt () mediante comentarios de @bpsilver y @Evereq. IV fue encriptado accidentalmente, ahora se antepone en texto claro como se esperaba por Decrypt ().
fuente
return _encryptor.TransformFinalBlock(inputBuffer, 0, inputBuffer.Length);
byte [] inputBuffer = _encryptor.TransformFinalBlock(buffer, 0, buffer.Length); return _rijndael.IV.Concat(inputBuffer).ToArray();
Si solo desea un cifrado simple (es decir, es posible que se rompa un cracker determinado, pero que bloquea a la mayoría de los usuarios ocasionales), simplemente elija dos frases de contraseña de igual longitud, por ejemplo:
y xor sus datos con ambos (bucle de las frases de contraseña si es necesario) (a) . Por ejemplo:
Alguien que busque en su binario puede pensar que la cadena de ADN es una clave, pero es poco probable que piense que el código C es algo más que memoria no inicializada guardada con su binario.
(a) Tenga en cuenta que este es un cifrado muy simple y, según algunas definiciones, puede no considerarse en absoluto cifrado (ya que la intención del cifrado es evitar acceso no autorizado en lugar de simplemente dificultarlo). Aunque, por supuesto, incluso el cifrado más fuerte es inseguro cuando alguien está parado sobre los llaveros con una tubería de acero.
Como se indicó en la primera oración, este es un medio para dificultar lo suficiente al atacante casual que seguirán adelante. Es similar a la prevención de robos en su hogar: no es necesario que sea inexpugnable, solo necesita que sea menos prevenible que la casa de al lado :-)
fuente
El cifrado es fácil: como otros han señalado, hay clases en el espacio de nombres System.Security.Cryptography que hacen todo el trabajo por usted. Úselos en lugar de cualquier solución local.
Pero el descifrado también es fácil. El problema que tiene no es el algoritmo de cifrado, sino proteger el acceso a la clave utilizada para el descifrado.
Usaría una de las siguientes soluciones:
DPAPI usando la clase ProtectedData con el alcance CurrentUser. Esto es fácil ya que no necesita preocuparse por una clave. Los datos solo pueden ser descifrados por el mismo usuario, por lo que no son buenos para compartir datos entre usuarios o máquinas.
DPAPI usando la clase ProtectedData con alcance LocalMachine. Bueno, por ejemplo, para proteger los datos de configuración en un único servidor seguro. Pero cualquiera que pueda iniciar sesión en la máquina puede cifrarlo, por lo que no sirve de nada a menos que el servidor sea seguro.
Cualquier algoritmo simétrico. Normalmente uso el método estático SymmetricAlgorithm.Create () si no me importa qué algoritmo se usa (de hecho, es Rijndael por defecto). En este caso, debe proteger su clave de alguna manera. Por ejemplo, puede ofuscarlo de alguna manera y ocultarlo en su código. Pero tenga en cuenta que cualquiera que sea lo suficientemente inteligente como para descompilar su código probablemente podrá encontrar la clave.
fuente
Quería publicar mi solución ya que ninguna de las soluciones anteriores es tan simple como la mía. Déjame saber lo que piensas:
Opcional
Esto supone que la MachineKey del servidor utilizado para cifrar el valor es la misma que la utilizada para descifrar el valor. Si lo desea, puede especificar una MachineKey estática en Web.config para que su aplicación pueda descifrar / cifrar datos independientemente de dónde se ejecute (por ejemplo, servidor de desarrollo frente a servidor de producción). Puede generar una clave de máquina estática siguiendo estas instrucciones .
fuente
El espacio de nombres
System.Security.Cryptography
contiene las clasesTripleDESCryptoServiceProvider
yRijndaelManaged
No olvide agregar una referencia al
System.Security
ensamblaje.fuente
Usando TripleDESCryptoServiceProvider en System.Security.Cryptography :
fuente
Cambié esto :
a esto:
fuente
Usando la biblioteca de criptografía .Net incorporada, este ejemplo muestra cómo usar el Estándar de cifrado avanzado (AES).
fuente
Sé que dijiste que no te importa lo seguro que es, pero si eliges DES, también podrías tomar AES , es el método de cifrado más actualizado.
fuente
He estado usando la respuesta aceptada por Mark Brittingham y me ha ayudado mucho. Recientemente tuve que enviar texto cifrado a una organización diferente y ahí surgieron algunos problemas. El OP no requiere estas opciones, pero como esta es una pregunta popular, estoy publicando mi modificación (
Encrypt
yDecrypt
funciones prestadas desde aquí ):RijndaelManaged
valores predeterminados y otro para los valores de propiedad que se pueden especificar (según un acuerdo mutuo entre las partes de cifrado y descifrado)Aquí está la clase (muestra de prueba al final):
y..
Aquí está la muestra de prueba:
fuente
¡Creo que este es el más simple del mundo!
Prueba
fuente