一个关于加密、解密的问题。

80后大叔爱学习
领域专家: 大数据技术领域
2007-12-13 08:51:02
package thb;

public class ceshi1 {
public static void main(String[] args){
char a1='十',a2='点';
char secret='9'; //为什么secret只能取值是(0~9),大于9以后就报错???
a1=(char)(a1^secret);
a2=(char)(a2^secret);
System.out.println("密文:"+a1+a2);//为什么+a1+a2前面一定要有点东西呢???单独的用(+a1+a2)显示的是数字也不报错。
a1=(char)(a1^secret);
a2=(char)(a2^secret);
System.out.println("原文:"+a1+a2);
}

}
本人菜鸟一个希望GGJJ给与解答,很是不理解。
...全文
147 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
谢谢了,明白了,结贴了!!
  • 打赏
  • 举报
回复
为什么secret只能取值是(0~9),大于9以后就报错???______________________________________________

char中只能放一个字符,如果要放两个或多个字符的话就要使用String,或者用char数组。

=================== 分 = 隔 = 符 ===================

为什么2个代码相同这个显示的是加密的,下面那个是解密的呢__________________________________________________

这是由^(异或)决定的,异或运算是按二进制位来做的,即:相同的位异或为“0”,不同的位异或为“1”。

它的特点,就是:

1,某一个数值(a)与另一数值(b)异或的结果(c),c再与b进行异或最终得出的还是a,
  如果我们把b作为密钥,把a作为原文,这样就是加密了,如果没有b,那也就不能把密文给还原了;

2,两个相同数,异或的结果为0。

因为 (a^b)^b = a^(b^b),由于b^b=0,所以 a^(b^b) = a^0 = a

不知道这样说你明白了吗?
  • 打赏
  • 举报
回复
你的问题,楼上两位都回答得很清楚了,如果想要加密字符串的话,可以参考下面的代码。

public class Test {

public static void main(String[] args) {
String plainText = "walykyy(斌斌),walykyy(斌斌)";
// 加密
String crypt = encrypt(plainText, 1233210);
System.out.println(crypt);
// 解密
String plain = encrypt(crypt, 1233210);
System.out.println(plain);
}

private static String encrypt(String plain, int key) {
char[] chars = plain.toCharArray();
char[] crypt = new char[chars.length];
for(int i = 0, k = chars.length; i < k; i++) {
// 随便扰乱一下,为了让相同的字符,出现密文也不同
key ^= key * key + i;
// 这里之所以要强转成char,是因为对于char来说,^计算出来的结果是int
// int 的范围要大于char,所以就要强转(PS:char也是一个数值,对应着
// 一个字符的Unicode值。char占两个字节,从0~65535)。
crypt[i] = (char)(chars[i] ^ key);
}
return new String(crypt);
}
}
  • 打赏
  • 举报
回复
char secret='9'; //为什么secret只能取值是(0~9),大于9以后就报错???

a1=(char)(a1^secret);
a2=(char)(a2^secret);
System.out.println("密文:"+a1+a2);//为什么2个代码相同这个显示的是加密的,下面那个是解密的呢
a1=(char)(a1^secret);
a2=(char)(a2^secret);
System.out.println("原文:"+a1+a2);
runshine 2007-12-13
  • 打赏
  • 举报
回复
你的a1、a2是char

当你注释的地方前面加上一个字符串的时候,编译器会把a1、a2转换为String,然后进行连接操作,但是当你前面没加字符串的时候,编译器就只会把a1、a2转换为int型数据进行相加然后输出

62,623

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧