English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Introdução ao XOR: XOR é uma operação de bit binário baseada, representada pelo símbolo XOR ou ^, suas regras de operação são que para cada bit binário dos números operados, se os valores forem iguais, eles são 0, e se forem diferentes, eles são1.
Entenda simplesmente que é uma adição sem avanço, como1+1=0,0+0=0,1+0=0=1.
Descrição das necessidades
Na era da informação, a criptografia de dados é um tópico muito importante, durante o processo de projeto, eu também implementei um algoritmo de criptografia complexo, mas devido ao caráter secreto da tecnologia envolvida, aqui eu implemento uma versão mais simples, que utiliza o fluxo de entrada e saída de arquivos e operação XOR para criptografar qualquer arquivo, sobre o algoritmo de descriptografia, é muito simples, pense nisso sozinho.
Princípio matemático
Este algoritmo de criptografia utiliza a função XOR de dois números, para simplificar, vamos falar sobre o princípio do XOR, XOR na verdade é uma operação no código binário do arquivo, para simplificar, é quando dois bits binários são iguais, eles são 0, e quando são diferentes, eles são1Veja o exemplo a seguir:
//7representação binária: 00000111 //2representação binária: 00000010 //O resultado do XOR dos dois: 00000101 //ou seja, o número5 //--------------------------- //O resultado do XOR novamente com2XOR //5representação binária: 00000101 //2representação binária: 00000010 //O resultado do XOR dos dois: 00000111 //ou seja7Isso não é incrível? Volta para7então?
Implementação do código
import java.io.*; class FileSecret { public static void main(String[] args) throws Exception { //Encontre o arquivo a ser criptografado, especifique o disco rígido você mesmo, a entrada e saída não precisam estar no mesmo disco rígido File inFile = new File(" drive:\\o arquivo criptografado"); //O arquivo a ser criptografado será salvo no disco rígido especificado File outFile = new File(" drive:\\o arquivo descriptografado"); //Estabeleça o canal de dados, permitindo que os dados binários da imagem fluam FileInputStream input = new FileInputStream(inFile); FileOutputStream output = new FileOutputStream(outFile); //Durante a leitura, o dado lido será XOR com um número, esse número deve ser gerado por algum algoritmo de criptografia, aqui apenas criei um número simples928(Meu aniversário), então faça a operação XOR, e os dados obtidos serão exibidos int content = 0 ; //Esta variável é usada para armazenar os dados lidos, claro que aqui pode-se usar tipos de dados mais longos como long, claro que também podemos usar outros tipos de dados, desde que os tipos de dados em ^ possam ser convertidos uns nos outros, pelo menos possam ser convertidos forçadamente while((content=input.read())!=})-1) // Se não chegarmos ao final do arquivo, continuaremos a ler dados, e os dados lidos serão armazenados na variável content.-1Para o marcador de fim de arquivo { output.write(content^928); //Escrever no fluxo de saída } //Fechar recursos input.close(); output.close(); } }
Avaliação da função do código
Para este código, a função básica já pode atender às necessidades, mas há algumas deficiências, a primeira é que não usamos algoritmos de criptografia para gerar o outro número XOR, a segunda é que eu não implementei a descriptografia do arquivo, na verdade, a descriptografia é muito simples, basta ler cuidadosamente a parte da matemática para saber como escrever o algoritmo de descriptografia, na verdade, a criptografia e a descriptografia não são implementadas no mesmo lugar ao mesmo tempo, mas usam o mesmo algoritmo de criptografia para calcular.
Melhoria do algoritmo com números aleatórios
No processo acima, na verdade, usamos um valor dado para XOR com o arquivo binário lido, então podemos substituir essa convenção por um número aleatório? A resposta é sim, primeiramente usamos uma variável do tipo int para armazenar, então o intervalo que pode ser representado é: positivo e negativo21O número de dígitos que podem ser representados por bilhões, o código específico é o seguinte:
//Método para gerar números aleatórios import java.util.*; public class RandomTest{ public static void main(String[] args){ Random random = new Random(); int num = random.nextInt(11);//representa 0-10entre esses números aleatórios, o número aleatório gerado deve ser salvo, para uso pelos criptografadores e descriptografadores System.out.println("Número aleatório: "+num); } }
Algoritmo de criptografia melhorado
Código do lado de criptografia:
import java.io.*; import java.util.*; class FileSecret { public static void main(String[] args) throws Exception { //Encontre o arquivo a ser criptografado, especifique o disco rígido você mesmo, a entrada e saída não precisam estar no mesmo disco rígido File inFile = new File(" drive:\\o arquivo criptografado"); //O arquivo a ser criptografado será salvo no disco rígido especificado File outFile = new File(" drive:\\o arquivo descriptografado"); //Estabeleça o canal de dados, permitindo que os dados binários da imagem fluam FileInputStream input = new FileInputStream(inFile); FileOutputStream output = new FileOutputStream(outFile); //Gere outro número para XOR de criptografia Random random = new Random(); int num = random.nextInt(11); //representa 0-10entre esses números aleatórios, o número aleatório gerado deve ser salvo, para uso pelos criptografadores e descriptografadores System.out.println("Número aleatório: "+num); //Durante a leitura, o dado lido será XOR com um número, esse número deve ser gerado por algum algoritmo de criptografia, aqui apenas criei um número simples928(Meu aniversário), então faça a operação XOR, e os dados obtidos serão exibidos int content = 0 ; //Esta variável é usada para armazenar os dados lidos, claro que aqui pode-se usar tipos de dados mais longos como long, claro que também podemos usar outros tipos de dados, desde que os tipos de dados em ^ possam ser convertidos uns nos outros, pelo menos possam ser convertidos forçadamente while((content=input.read())!=})-1) // Se não chegarmos ao final do arquivo, continuaremos a ler dados, e os dados lidos serão armazenados na variável content.-1Para o marcador de fim de arquivo { output.write(content^num); //Escrever no fluxo de saída } //Fechar recursos input.close(); output.close(); } }
O lado de criptografia precisa informar o num gerado pelo código acima ao lado de descriptografia, caso contrário, não será possível descriptografar o arquivo.
Código do lado de descriptografia:
import java.io.*; class FileSecret { public static void main(String[] args) throws Exception { //Encontre o arquivo a ser criptografado, especifique o disco rígido você mesmo, a entrada e saída não precisam estar no mesmo disco rígido File inFile = new File(" drive:\\o arquivo criptografado"); //O arquivo a ser criptografado será salvo no disco rígido especificado File outFile = new File(" drive:\\o arquivo descriptografado"); //Estabeleça o canal de dados, permitindo que os dados binários da imagem fluam FileInputStream input = new FileInputStream(inFile); FileOutputStream output = new FileOutputStream(outFile); //Durante a leitura, o dado lido será XOR com um número, esse número deve ser gerado por algum algoritmo de criptografia, aqui apenas criei um número simples928(Meu aniversário), então faça a operação XOR, e os dados obtidos serão exibidos int content = 0 ; //Esta variável é usada para armazenar os dados lidos, claro que aqui pode-se usar tipos de dados mais longos como long, claro que também podemos usar outros tipos de dados, desde que os tipos de dados em ^ possam ser convertidos uns nos outros, pelo menos possam ser convertidos forçadamente while((content=input.read())!=})-1) // Se não chegarmos ao final do arquivo, continuaremos a ler dados, e os dados lidos serão armazenados na variável content.-1Para o marcador de fim de arquivo { output.write(content ^ número de criptografia recebido do lado de criptografia); //Escrever no fluxo de saída } //Fechar recursos input.close(); output.close(); } }
Mais uma melhoria
Na verdade, no nosso código, a chave de criptografia padrão deve ser gerada aleatoriamente e incluir letras, números e todos os tipos de símbolos. Então, como geramos tal string de criptografia? Após a geração dessa string de criptografia, como a convertemos em código binário? Forneço uma ideia: podemos usar expressões regulares do Java para gerar qualquer string que você quiser, e então usar métodos de conversão de string para gerar o código binário correspondente. Eu implementei um método de geração de criptografia extremamente complexo, mas não posso publicá-lo, pois envolve informações de projetos de laboratório e há muitos algoritmos de criptografia clássicos no campo de criptografia que podem ser utilizados.
Resumo
Isso é tudo sobre a explicação detalhada da operação XOR no Java e o princípio de criptografia de arquivos e uso neste artigo. Espero que ajude a todos. Os amigos interessados podem continuar a consultar nosso site:
Exemplo de código de algoritmo de criptografia/descriptografia simples usando XOR no Java
Exemplo de código de operação XOR de string hexadecimal em Java
Análise de código de problemas de XOR no Java
Se houver点什么不足之处,欢迎留言指出。感谢朋友们对本站的支持!
Declaração: O conteúdo deste artigo é extraído da Internet, pertence ao respectivo proprietário, é contribuído e carregado voluntariamente pelos usuários da Internet, o site não possui direitos de propriedade, não foi editado manualmente e não assume responsabilidade legal relevante. Se você encontrar conteúdo suspeito de violação de direitos autorais, por favor, envie um e-mail para: notice#oldtoolbag.com (ao enviar e-mail, substitua # por @ para denunciar, e forneça provas relevantes. Apenas se confirmado, o site deletará o conteúdo suspeito de infringência de direitos autorais.}