Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Invertir operadores binarios

Estas en el tema de Invertir operadores binarios en el foro de C/C++ en Foros del Web. Hola amigos ¿alguien me puede explicar si se pueden invertir los operadores binarios y como? O sea, imaginen que tenemos: a & b =c Y ...
  #1 (permalink)  
Antiguo 15/10/2016, 16:45
 
Fecha de Ingreso: febrero-2015
Mensajes: 389
Antigüedad: 2 años, 9 meses
Puntos: 3
Invertir operadores binarios

Hola amigos ¿alguien me puede explicar si se pueden invertir los operadores binarios y como?
O sea, imaginen que tenemos:
a & b =c
Y ahora me dan el valor de b y de c y quiero recuperar el valor de a.
Lo mismo para el operador |.
¿Pueden ayudarme?
  #2 (permalink)  
Antiguo 16/10/2016, 03:10
 
Fecha de Ingreso: febrero-2015
Mensajes: 389
Antigüedad: 2 años, 9 meses
Puntos: 3
Respuesta: Invertir operadores binarios

Es que tengo esta función la cual desencripta una cadena y quiero invertirla para poder encriptar cadenas y no veo el modo. Este es el código:

Código C++:
Ver original
  1. void __fastcall TForm1::Button2Click(TObject *Sender)
  2. {
  3.     DWORD valor;
  4.     DWORD tamCadena;
  5.     DWORD contador;
  6.     DWORD aux;
  7.     AnsiString buffer;
  8.  
  9.     contador = 0;
  10.     tamCadena = Edit1->Text.Length();
  11.     buffer = Edit1->Text.c_str();
  12.  
  13.     do {
  14.         valor = buffer[contador+1];
  15.         if (valor >= 0x40) {
  16.             valor -=0x41;
  17.             asm{cdq};
  18.             valor = valor % 0xA;
  19.             valor += 0x30;
  20.             buffer[contador+1]=(char)valor;
  21.         } else {
  22.             aux = contador;
  23.             aux &= 0x80000003;
  24.             if(aux < 0){
  25.                 aux--;
  26.                 aux |= 0xfffffffc;
  27.                 aux++;
  28.             }
  29.             valor -= aux;
  30.             buffer[contador+1]=(char)valor;
  31.         }
  32.         ++contador;
  33.         --tamCadena;
  34.     } while (tamCadena);
  35.  
  36.     Edit2->Text=buffer;
  37. }
  #3 (permalink)  
Antiguo 18/10/2016, 15:59
 
Fecha de Ingreso: septiembre-2010
Mensajes: 475
Antigüedad: 7 años, 2 meses
Puntos: 10
Respuesta: Invertir operadores binarios

Hola:

Yo diría que no se puede, porque hay varios valores que dan el mismo resultado.

Para el operador &:

x & 0 = 0 (x puede ser 0 o 1)

Y para el operador |

x | 1 = 1 (x puede ser 0 o 1)

Saludos (a ver si me equivoco y alguien te da mejor respuesta)
__________________
Mi calculadora en Qt
  #4 (permalink)  
Antiguo 19/10/2016, 00:21
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 3 años, 2 meses
Puntos: 204
Respuesta: Invertir operadores binarios

1 & 1 = 1
0 & X = 0

El único caso que vas a poder descifrar seguro es cuando tengas un uno... Claro que en ese caso no te hace falta ni la clave jejeje. En el caso de encontrarte un cero pueden suceder dos cosas:

  • La clave es un '1', en cuyo caso el valor a descifrar es un '0'
  • La clave es un '0', en cuyo caso el valor a descifrar puede ser tanto '0' como '1'... ¿qué tal se te dan las apuestas de azar?

Y algo similar pasa con OR binario.

Este problema no lo vas a encontrar con XOR, yo te diría de empezar a trastear con este otro operador. Luego puedes pasar a desplazar bits.

Un saludo
__________________
La ayuda se paga con esfuerzo o con dinero. Si no estás dispuesto a esforzarte y quieres que te hagan los deberes pide presupuesto, al menos así ahorrarás tiempo.

Última edición por eferion; 19/10/2016 a las 03:55
  #5 (permalink)  
Antiguo 19/10/2016, 14:01
 
Fecha de Ingreso: febrero-2015
Mensajes: 389
Antigüedad: 2 años, 9 meses
Puntos: 3
Respuesta: Invertir operadores binarios

Es que el código no es mio y quería poder revertir lo para ver unas cadenas a ver si podía ver que ponía. Ya pude hacerlo y os doy la razón siempre que se traten de caracteres desde 0x40. Por ejemplo los números se encriptan y desencriptan sin problemas y las letras desde la A a la J pero todos los que pasen de la J son convertidos en caracteres desde la A a la J. Cuando pueda pongo mu código para que vean a ver si hago algo mal. En principio la cadena desencriptada la encripto y desencripto todas las veces que desee y siempre obtengo la cadena desencriptada correcta aunque la encriptada ya le haya cambiado los caracteres por los de la A a la J.
Osea:
ABCDEFGHIJ
KLMNOPQRST
UVWXYZ[\]^
...

El primer carácter de todas las filas producen el mismo resultado, igual que todas las segundas y así todas.
No entiendo bien porque ocurre justo con 10 caracteres y no creo que tenga mucha solución.

Última edición por aguml; 19/10/2016 a las 14:09
  #6 (permalink)  
Antiguo 20/10/2016, 03:27
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 3 años, 2 meses
Puntos: 204
Respuesta: Invertir operadores binarios

Código C:
Ver original
  1. valor = valor % 0xA;

Esa línea se está quedando con el resto de la dividir el valor entre 10... lo que nos da un rango de 0 a 9.

Si numeramos las letras:
A->0, B->1, C->2, D->3, E->4, F->5, G->6, H->7, I->8, J->9, k->fuera del rango

Esa es la razón por la que únicamente eres capaz de recuperar caracteres de la A a la J.

Un saludo.
__________________
La ayuda se paga con esfuerzo o con dinero. Si no estás dispuesto a esforzarte y quieres que te hagan los deberes pide presupuesto, al menos así ahorrarás tiempo.
  #7 (permalink)  
Antiguo 20/10/2016, 14:23
 
Fecha de Ingreso: febrero-2015
Mensajes: 389
Antigüedad: 2 años, 9 meses
Puntos: 3
Respuesta: Invertir operadores binarios

Es verdad! Muchas gracias por las aclaraciones. Eso quiere decir que si uso este código y el mio para por ejemplo encriptar y desencriptar un serial para una aplicación que cree admitiría muchos seriales como válidos aunque no sea idéntico al que yo quiera.
No me sirve para mi propósito pero es interesante.

Etiquetas: invertir, operadores
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 18:31.