{"id":632,"date":"2025-05-28T15:50:17","date_gmt":"2025-05-28T18:50:17","guid":{"rendered":"https:\/\/difusao.tech\/blog\/?p=632"},"modified":"2025-05-28T15:50:22","modified_gmt":"2025-05-28T18:50:22","slug":"xor-criptografia-com-xor","status":"publish","type":"post","link":"https:\/\/difusao.tech\/blog\/xor-criptografia-com-xor\/","title":{"rendered":"XOR &#8211; Criptografia com XOR"},"content":{"rendered":"<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"290\" height=\"209\" src=\"https:\/\/difusao.tech\/blog\/wp-content\/uploads\/2025\/05\/image-6.png\" alt=\"\" class=\"wp-image-633\" style=\"width:337px;height:auto\"\/><\/figure>\n<\/div>\n\n\n<p>Neste artigo vamos aborda a porta l\u00f3gica XOR ou OU Exclusivo, para fins de realizar uma criptografia.<br>Antes de qualquer coisa vamos a algumas informa\u00e7\u00f5es te\u00f3ricas.<\/p>\n\n\n\n<p class=\"has-medium-font-size\"><strong>1 &#8211; Representa\u00e7\u00e3o dos dados<\/strong>.<\/p>\n\n\n\n<p>Oas dados podem ser representados em diferentes bases, um &#8216;A&#8217; precisa ser uma representa\u00e7\u00e3o num\u00e9rica da Base 2 ou bin\u00e1ria para que os computadores possam entend\u00ea-los. Abaixo uma tabela com direrentes tipos de representa\u00e7\u00e3o de um mesmo dado:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Codifica\u00e7\u00e3o\/Base<\/th><th>Representa\u00e7\u00e3o de &#8220;Oi&#8221;<\/th><th>Descri\u00e7\u00e3o<\/th><\/tr><\/thead><tbody><tr><td><strong>ASCII<\/strong><\/td><td>O (79), i (105)<\/td><td>Valores decimais ASCII de cada caractere<\/td><\/tr><tr><td><strong>Bin\u00e1rio (8 bits por caractere)<\/strong><\/td><td>01001111 01101001<\/td><td>Representa\u00e7\u00e3o bin\u00e1ria dos valores ASCII<\/td><\/tr><tr><td><strong>Decimal<\/strong><\/td><td>79 105<\/td><td>Valores decimais diretos dos caracteres ASCII<\/td><\/tr><tr><td><strong>Hexadecimal<\/strong><\/td><td>4F 69<\/td><td>Valores hexadecimais dos caracteres ASCII<\/td><\/tr><tr><td><strong>Base64<\/strong><\/td><td>T2k=<\/td><td>Representa\u00e7\u00e3o em Base64 da string &#8220;Oi&#8221;<\/td><\/tr><tr><td><strong>Octal<\/strong><\/td><td>117 151<\/td><td>Valores octais dos caracteres ASCII<\/td><\/tr><tr><td><strong>UTF-8<\/strong><\/td><td>O (U+004F), i (U+0069)<\/td><td>Ponto de c\u00f3digo Unicode<\/td><\/tr><tr><td><strong>URL Encoding<\/strong><\/td><td>%4F%69<\/td><td>Codifica\u00e7\u00e3o percentual para URLs<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<p>Agora que sabemos dessas formas de representa\u00e7\u00e3o de dados, vamos entender o XOR.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<p class=\"has-medium-font-size\"><strong>2 &#8211; XOR e tabela verdade<\/strong>.<\/p>\n\n\n\n<p>Um XOR (OU Exclusivo) \u00e9 uma porta l\u00f3gica usada em circuitos digitais, tamb\u00e9m conhecida como detector de desigualdade da eletr\u00f4nica digital.<\/p>\n\n\n\n<p>Ele \u00e9 formado por um conjunto de outros portas l\u00f3gicas (AND, OR e NOT) e as aplica\u00e7\u00f5es mais comuns s\u00e3o:<br>&#8211; Somadores bin\u00e1rios (Circuitos aritim\u00e9ticos).<br>&#8211; Detec\u00e7\u00e3o de diferen\u00e7as.<br>&#8211; Controle de paridade (Verifica\u00e7\u00e3o de erros).<br>&#8211; Criptogarfia (Opera\u00e7\u00f5es bit a bit).<\/p>\n\n\n\n<p>Sua tabela verdade \u00e9 a seguite:<br>Tabela verdade com duas entradas, A e B.<br>Sua saida sempre ser\u00e1 1 quando os valores das entradas forem diferentes e 0 quando forem iguais.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>A<\/th><th>B<\/th><th>Sa\u00edda<\/th><\/tr><\/thead><tbody><tr><td>0<\/td><td>0<\/td><td>0<\/td><\/tr><tr><td>0<\/td><td>1<\/td><td>1<\/td><\/tr><tr><td>1<\/td><td>0<\/td><td>1<\/td><\/tr><tr><td>1<\/td><td>1<\/td><td>0<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<p>Uma propriedade interessante do XOR \u00e9 que ele \u00e9 revers\u00edvel.<br>Com a sa\u00edda da tabela anterior conseguimos obter o valor de A apenas aplicando o XOR da sa\u00edda com o a entrada B.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Sa\u00edda da tabela anterior<\/th><th>B<\/th><th>A<\/th><\/tr><\/thead><tbody><tr><td>0<\/td><td>0<\/td><td>0<\/td><\/tr><tr><td>1<\/td><td>1<\/td><td>0<\/td><\/tr><tr><td>1<\/td><td>0<\/td><td>1<\/td><\/tr><tr><td>0<\/td><td>1<\/td><td>1<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<p>E o que isso tem a ver com criptografia?<\/p>\n\n\n\n<p class=\"has-medium-font-size\"><strong>3 &#8211; A criptografia!<\/strong><\/p>\n\n\n\n<p>O XOR \u00e9 uma maneira r\u00e1pida e barata de criptografar dados, vamos ver abaixo como fazer isso utilizando python.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import base64\n\ndata = 'difusaotech'\nkey = 'L'\n\n\nencrypted = ''.join(&#91;chr(ord(x) ^ ord(key)) for x in data])\nprint('Criptografado')\n\n#Saida direta do XOR\nprint(f\"XOR: {encrypted}\")\n\n#Saida em base64\nencrypted_b64 = base64.b64encode(encrypted.encode()).decode()\nprint(f\"XOR + Base64: {encrypted_b64}\\n\")\n\n\n#Descriptografado\nprint('Descriptografado')\ndecrypted = ''.join(&#91;chr(ord(x) ^ ord(key)) for x in encrypted])\nprint(decrypted)\n<\/code><\/pre>\n\n\n\n<p><\/p>\n\n\n\n<p>Explica\u00e7\u00e3o:<\/p>\n\n\n\n<p>A linha que faz a criptografia usa o operador XOR &#8220;^&#8221; do python para criptografar, por\u00e9m temos algumas passos a serem realizados antes.<\/p>\n\n\n\n<p>encrypted = &#8221;.join([chr(ord(x) ^ ord(key)) for x in data])<\/p>\n\n\n\n<p>A nossa palavra a ser criptografada deve estar em base num\u00e9rica para que o operador XOR consiga realizar a opera\u00e7\u00e3o, e a convers\u00e3o da letra em base num\u00e9rica \u00e9 feita pela linha abaixo:<\/p>\n\n\n\n<p>ord(x) : Onde x representa cada caracter sendo passado pelo for.<br>ord(key) : Onde key \u00e9 a palavra passe (Nossa senha) para a criptografia, no caso a letra &#8220;L&#8221;.<\/p>\n\n\n\n<p>Assim ord() converte cada letra no seu representante da tabela ASCII, no caso da palavra chave o valor 76 e as letras em &#8220;x&#8221; para cada representante correspondente.<br>Isso tudo sendo calculado bit a bit pelo XOR &#8220;^&#8221;.<\/p>\n\n\n\n<p>encrypted = &#8221;.join([chr(<strong><mark style=\"background-color:#abb8c3\" class=\"has-inline-color\">ord(x) ^ ord(key)<\/mark><\/strong>) for x in data])<\/p>\n\n\n\n<p>Em seguida o chr() pega o resultado de cada saida em sua forma num\u00e9rica e converte para caracter.<\/p>\n\n\n\n<p>encrypted = &#8221;.join([<strong><mark style=\"background-color:#abb8c3\" class=\"has-inline-color\">chr(ord(x) ^ ord(key)<\/mark><\/strong>) for x in data])<\/p>\n\n\n\n<p>O join junta todos os caracteres da saida do chr() para que possa formar a nossa palavra encriptada.<\/p>\n\n\n\n<p>encrypted = &#8221;.<strong><mark style=\"background-color:#abb8c3\" class=\"has-inline-color\">join([chr(ord(x) ^ ord(key))<\/mark><\/strong> for x in data])<\/p>\n\n\n\n<p>Foi utilizado tamb\u00e9m o base64 pois alguns caracteres podem n\u00e3o ser exibidos no console.<\/p>\n\n\n\n<p>encrypted_b64 = base64.b64encode(encrypted.encode()).decode()<\/p>\n\n\n\n<p><strong>4 &#8211; Descriptografia.<\/strong><\/p>\n\n\n\n<p>A parte da descriptografia ser\u00e1 feita da mesma forma sendo que de forma contraria, sendo que agora usamos a saida, a nossa palavra encriptada junto ao XOR e nossa senha.<\/p>\n\n\n\n<p>decrypted = &#8221;.join([chr(ord(x) ^ ord(key)) for x in encrypted])<\/p>\n\n\n\n<p><\/p>\n\n\n\n<p>Vou deixar abaixo o correspondente do c\u00f3digo agora em PHP:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>for ($i = 0; $i &lt; strlen($data); $i++) {\n\/\/ Aplica XOR entre o caractere atual e o caractere correspondente da chave\n        $encrypted .= chr(ord($data&#91;$i]) ^ ord($key&#91;$i % $keyLength]));\n    }<\/code><\/pre>\n\n\n\n<p><\/p>\n\n\n\n<p>Sabemos que isso \u00e9 apenas o b\u00e1sico, o c\u00f3digo pode ser melhorado para permitir chaves maiores entre outras melhorias.<\/p>\n\n\n\n<p>At\u00e9 a pr\u00f3xima.<\/p>\n\n\n\n<p>Para mais artigos sobre criptografia:<a href=\"https:\/\/difusao.tech\/blog\/criptografia\/\" target=\"_blank\" rel=\"noreferrer noopener\">\u00a0https:\/\/difusao.tech\/blog\/criptografia\/<\/a><\/p>\n\n\n\n<p>Qualquer sugest\u00e3o, vamos manter contato, siga: <a href=\"https:\/\/www.instagram.com\/leonardofcosta\/\">https:\/\/www.instagram.com\/leonardofcosta\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Neste artigo vamos aborda a porta l\u00f3gica XOR ou OU Exclusivo, para fins de realizar uma criptografia.Antes de<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[55],"tags":[137,290,291,292,130],"class_list":["post-632","post","type-post","status-publish","format-standard","hentry","category-seguranca-da-informacao","tag-criptografia","tag-criptografia-xor","tag-tabela-verdade","tag-tabela-verdade-xor","tag-xor"],"_links":{"self":[{"href":"https:\/\/difusao.tech\/blog\/wp-json\/wp\/v2\/posts\/632","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/difusao.tech\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/difusao.tech\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/difusao.tech\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/difusao.tech\/blog\/wp-json\/wp\/v2\/comments?post=632"}],"version-history":[{"count":2,"href":"https:\/\/difusao.tech\/blog\/wp-json\/wp\/v2\/posts\/632\/revisions"}],"predecessor-version":[{"id":636,"href":"https:\/\/difusao.tech\/blog\/wp-json\/wp\/v2\/posts\/632\/revisions\/636"}],"wp:attachment":[{"href":"https:\/\/difusao.tech\/blog\/wp-json\/wp\/v2\/media?parent=632"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/difusao.tech\/blog\/wp-json\/wp\/v2\/categories?post=632"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/difusao.tech\/blog\/wp-json\/wp\/v2\/tags?post=632"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}