如何利用异或运算进行简单加密解密

如何利用异或运算进行简单加密解密,第1张

利用“^”异或运算对字符串进行加密

思路:1.先碧碧仿创建字符串输入的Scanner

2.通过char[] array = password.toCharArray()// 获取字符数组;

3.遍历字符数组,按目前理解要用到遍历:数组所有元慧粗素进行访问,比如你要输出数组里所有的信息时,就要用到

4.进行异或运算

按位做“异或”运算是:位值相同得1,不同得0

例如:

<加密过程:>

原解释的二进制为 1 1 0 0 ----原文

设定的key的悔纤二进制为 0 1 1 0 ----密匙

两者做“异或”结果为 0 1 0 1 ----密文

<解密过程:>

0 1 0 1----密文

0 1 1 0----密匙

两者“异或”就得到了原文 1 1 0 0 ----原文

详细代码:

package com.lixiyu

import java.util.Scanner

public class Example {

public static void main(String[] args){

Scanner sca=new Scanner(System.in)

System.out.println("请输入一个英文字符串或解密字符串")

String line=sca.nextLine()//获取用户输入信息

char[] array=line.toCharArray()//获取字符数组

for (int i=0i<array.lengthi++){//历遍字符数组

array[i]=(char) (array[i]^20000)//对数组每个元素进行异或运算

}

System.out.println("加密解密结果如下:")

System.out.println(new String(array))//输出密钥

}

}

异或运算:

1 ^ 1 = 0

1 ^ 0 = 1

0 ^ 1 = 1

0 ^ 0 = 0

字符'A' 的ASCII编码为65 : 00000000 01000001

取整数7 : 00000000 00000000 00000000 00000111

XOR运算后 : 00000000 00000000 00000000 01000110

简单加密算法代码如下 :

public class Test {

public static final int KEY = 7

public static void main(String[] args) {

String str = "Hello World!"

StringBuffer str2 = new StringBuffer() //存储加密后的字符串

StringBuffer str3 = new StringBuffer() //存储解密后的字符串

//加密过程

for(int i=0i<str.length()i++)

{

char c = (char)(str.charAt(i) ^ KEY)

str2.append(c)

}

//解密过程

for(int i=0i<str2.length()i++)

{

char c = (char)(str2.charAt(i) ^ KEY)

str3.append(c)

}

System.out.println("原始 的字符串为:" + str)

System.out.println("加密后 的字符串为:" + str2)

System.out.println("解密后 的字符串为:" + str3)

}

}

输出:

原始 的字符串为:Hello World!

加密后 的字符串为:Obkkh'Phukc&

解密后 的字符串为:Hello World!

import java.io.File

import java.io.FileInputStream

import java.io.FileOutputStream

public class XorExample {

public static final byte XOR_CONST = 0X12

public static void main(String[] args) throws Exception {

File src = new File("level1.txt")

File dest = new File("level2.txt")

File dest2 = new File("level3.txt"老返)

xorEn(src, dest)

xorEn(dest, dest2)

}

/**

* 异或的一个特稿含搏点键祥: a^b = c c^b = a

* 所以简单点,这里的加解密都用一个函数就行了

* @param src

* @param dest

* @throws Exception

*/

public static void xorEn(File src, File dest) throws Exception {

// 文件不存在或为文件夹就不判断了

FileInputStream fis = new FileInputStream(src)

FileOutputStream fos = new FileOutputStream(dest)

byte[] bs = new byte[1024]

int len = 0

while ((len = fis.read(bs)) != -1) {

for (int i = 0i <leni++) {

bs[i] ^= XOR_CONST

}

fos.write(bs, 0, len)

}

fos.close()

fis.close()

}

}

对于加密要求不高的完全可以自己定义规则来进行加密。这种加密是很简单很自由的,例如你在存文件的时候可以将文件中的每个字符都加上一个数,然后读取该文件的时候再每个字符相应地减去那尺念个数,即可实现就简单的加密,这样你储存的文件看上去就是乱码了。只是这个规则太简单,规则你可以自己定,加密与解密对着来就行了。

下面程序用异或 *** 作对文件进行加密和解密

/******************设计思路******************/

//根据用户输入的加密/机密密码

//每次都拿原文灶困滚件和密码等长度的一个字符串和密码

//对应元素异或进行加密/解密

//另外因为是用异或方法,所以加密和解密就是同一个程序

//即按照同样的加密即是对文件的解密

#include

#include

#include

#include

#include

charfilename[256]//原文件

charpassword[256]//加密/解密密码

constcharfilenametemp[]="temp15435255435325432543.temp"//加密/解密中间文件

voidinputpass(char*pass)//密码输入以"******"显示

voidmain(){

FILE*fp//加密/解密的文件

FILE*fptemp//加密/解密过程临时文件

intpwdlen//密码长度

inti=0//计数器

charch=0//读入的字符

printf("请输入要加密/解密的文件名(全路径名):\n")

gets(filename)

if((fp=fopen(filename,"rb"))==NULL){

printf("找不到文件%s\n",filename)

exit(1)

}//if

printf("请输入要加密/解密的密码:\n")

inputpass(password)

pwdlen=strlen(password)

if(pwdlen==0){

printf("密码不能为空,加密/解密失败\n")

exit(1)

}//if

fptemp=fopen(filenametemp,"wb")//打开中间文件

while(1){

ch=fgetc(fp)//从原文件读入一个字符

if(feof(fp)){//已经读到文件尾

break//退出循环

}

ch^=password[i++]//对原字符和密码进行异或 *** 作

fputc(ch,fptemp)//将异或结果写入中间文件

if(i==pwdlen){//使得原文件每和密码长度相同的固定长度异或加密

i=0

}

}//while

fclose(fp)//关闭打开原文件

fclose(fptemp)//关闭打开中间文件

remove(filename)//删除原文件

rename(filenametemp,filename)//将隐余中间文件重命名为原文件

printf("加密/解密成功\n")//至此加密/解密成功

}

//密码输入以"******"显示

voidinputpass(char*pass){

inti=0

charc

while(isprint(c=getch())){

pass[i++]=c

//printf("*")

}

pass[i]='\0'

printf("\n")

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12467727.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存