思路: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.Fileimport 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")
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)