Aqui está um algoritmo de cifra, baseado em cadeias hexadecimais que é implementado por XORing o texto simples fornecido, N número de vezes onde N é seu comprimento. Mas, o problema é que cada próxima operação XOR é feita após deslocar a entrada de texto simples consecutiva para a direita . Um exemplo de operação é mostrado abaixo:

Suponha que a senha seja 'abcd', então o texto hexadecimal é calculado como a1d0a1d por XORing a senha com ela mesma N vezes, ou seja, 4 vezes neste caso.

Da mesma forma, se a senha for '636f646572' , então



653cae8da8edb426052 é o texto hexadecimal.

Portanto, o enunciado do problema é criar um algoritmo de descriptografia (em qualquer linguagem de programação) e deduzir o texto simples da string hexadecimal fornecida.

Exemplos :

Entrada: a1d0a1d
Resultado: abcd
abcd uma vez codificado retornará a1d0a1d
Entrada: 653cae8da8edb426052
Saída: 636f646572

Abordagem: o ingrediente principal na criptografia e descriptografia está nas propriedades do XOR . XOR é uma operação bit a bit em que o resultado é 0 se as duas entradas possíveis forem iguais, mas 1 quando as entradas forem diferentes . A tabela XOR é fornecida abaixo para referência:

Entradas Saídas
X Y Z
0 0 0
0 1 1
1 0 1
1 1 0

Uma propriedade importante e útil de XOR que é amplamente popular em criptografia é que, no caso de XORing múltiplo de números (digamos, números M ), se conhecermos apenas os números M - 1 (um é desconhecido) junto com o resultado de XOR , então, pode calcular facilmente o número ausente por meio de XORing os números conhecidos e o resultado XOR. Esta propriedade é discutida com os seguintes números hexadecimais:

Estaremos usando a propriedade listada acima ao máximo no curso deste problema. Agora, se olharmos para o diagrama de criptografia de 'abcd' na base, ele é apenas o XORing repetido dos dígitos. O dígito mais à direita é d e o dígito mais à direita de 'abcd' também é d , então o último dígito do texto simples e hexstring é o mesmo . O próximo dígito é 1, que é calculado por XORing o segundo dígito direito de abcd e o dígito anterior, ou seja, 1 = d ^ c usando a propriedade que sabemos que o dígito de texto simples pode ser deduzido como d ^ 1 = c . Da mesma forma, o próximo dígito é um que é encontrado pord ^ c ^ b = a . Precisamos fazer isso apenas até a metade da string hexadecimal, pois o resto é simétrico, portanto, não são necessários .

Abaixo está a implementação da abordagem acima:

  
hex_s = '653cae8da8edb426052'
plain = '' 
x = 0
  
l = len(hex_s) 
for i in range(l - 1, int(l / 2) - 1, -1): 
      
    
    y = x^int(hex_s[i], 16) 
      
    
    x = x^y 
    plain = hex(y)[-1] + plain 
      
print(plain) 
Resultado:
636f646572