Ir ao conteúdo
  • Cadastre-se

Python Codificação em Python para criptografia no modelo XOR simétrico.


Ir à solução Resolvido por Midori,

Posts recomendados

Recebi uma tarefa de criptografia na matéria de matemática computacional. Segue o enunciado:

 

Codificar a mensagem “APROVADO” por criptografia simétrica pelo algoritmo elementar XOR utilizando como chave criptográfica o seu RU ou parte dele. Após a obtenção da cifra decodifica-la comprovando a reciprocidade do processo. Há um arquivo anexo contendo as algumas recomendações sobre a entrega da AP.

 

Iniciei a tarefa tentando bolar um algoritmo em Python, utilizei um modelo de criptografia transformando a palavra APROVADO, com os números correspondentes as letras na tabela ASCII e após passando os números correspondentes para binário. Eu utilizarei dois dígitos como chave codificadora, o número 33.

Consegui avançar o código até esse ponto, porém me falta conhecimento para prosseguir, no caso eu consegui criar um algoritmo que pede para o usuário a mensagem a ser codificada, ele transforma as letras da mensagem em números correspondentes da tabela ASCII e após passa esses números em binários. O próximo passo seria fazer a operação XOR com cada letra que foi transformado em dígitos binários, utilizando a chave de número 33 que também será passado para binário. Exemplo: 1000001(A) XOR 0010 0001('33').

 

<

frase= str(input('Digite a mensagem a ser criptografada: '))

list(frase)

i= 0

while i < len(frase):

        a= ord(frase[i])

        binario= bin(a)

        i= i+1 

        print(binario)

>

Ajudas são bem vindas.

Grato.

Link para o comentário
Compartilhar em outros sites

@Gabriel54  Acho que não precisa converter cada caractere para binário, basta fazer o xor no código ASCII. P.ex, só usei bin para mostrar o resultado,

 

a = ord('A')
y = ord('Y')
a_xor_y = a ^ y

print(str(a) + ', ' + str(bin(a)))
print(str(y) + ', ' + str(bin(y)))
print(str(a_xor_y) + ', ' + str(bin(a_xor_y)))

 

A saída será,

65, 0b1000001
89, 0b1011001
24, 0b11000

 

 

 

Link para o comentário
Compartilhar em outros sites

2 horas atrás, Midori disse:

@Gabriel54  Acho que não precisa converter cada caractere para binário, basta fazer o xor no código ASCII. P.ex, só usei bin para mostrar o resultado,

 


a = ord('A')
y = ord('Y')
a_xor_y = a ^ y

print(str(a) + ', ' + str(bin(a)))
print(str(y) + ', ' + str(bin(y)))
print(str(a_xor_y) + ', ' + str(bin(a_xor_y)))

 

A saída será,


65, 0b1000001
89, 0b1011001
24, 0b11000

 

 

 

Desde já, agradeço pelo seu tempo em me responder.

Eu tentei aplicar o seu algoritmo, mas ele se limita a uma letra definida já, não é? Ou eu não entendi o conceito e esteja falando besteira. Estou tentando fazer desta maneira, porém ele acusa um erro no tipo da variável.

image.png.4e32e0fb0911e3340b88b53909ea4419.png

 

Link para o comentário
Compartilhar em outros sites

  • Solução

@Gabegol4  Foi só um exemplo com uma letra. Para aplicar na frase e na chave, tem que pegar cada caractere da string no loop, p.ex,

 

frase = input('Mensagem: ')
chave = '33'
i = 0
while i < len(frase):
    c_frase = ord(frase[i])
    c_chave = ord(chave[i % len(chave)])
    print(chr(c_frase ^ c_chave))
    i += 1

 

 

  • Curtir 1
  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

  • 4 meses depois...

@Midoriobrigado pelas explicações, estou no mesmo trabalho que o amigo aí em cima. Porém só não entendi uma parte do código.

c_chave = ord(chave[i % len(chave)])

 

Poderia explicar porque o "[i % len(chave)]? Não entendi porque a iteração tem que ser módulo len(chave).

Link para o comentário
Compartilhar em outros sites

16 horas atrás, kampa896 disse:

Poderia explicar porque o "[i % len(chave)]? Não entendi porque a iteração tem que ser módulo len(chave).

Como a chave tem mais de um caractere é preciso alternar entre eles para cada letra da frase. O módulo serve para pega o resto da divisão entre o contador (i) e o tamanho da chave já que em uma divisão o resto sempre é menor que o divisor. Então p.ex se a chave tiver três caracteres o índice vai ficar alternando entre 0 e 2 (0, 1, 2, 0, 1, 2..)

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

  • 2 meses depois...

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Redes-Wi-Fi-capa-3d-newsletter.png

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!