加密,从大的方向来讲分为两类,即隐文和替换。
隐文 就是将密码隐藏起来,让人不能轻易发现,比如 中国的字谜便是经典的隐文术,将密文隐藏于一句看上去有点不知所谓的文字中。
替换从字面意思便可知道,就是将密文 替换成其他的约定的字符,莫尔斯密码是典型的替换密码,将字母用‘.’和‘-’代替。
我要讲的加密只用了隐文,加密原理非常简单,
首先是将密码变成双栏密码。将密文通过奇偶拆分成双栏然后重组。
通过如下代码可以将密文加密成双栏密码
<span style="white-space:pre"> </span>//获取密码的长度
int leng=pwd.length();
String dan="";//奇数
String shuang="";//偶数
String secret="";//加密后的密文
for(int i=1;i<leng+1;i++){
if(i%2!=0){
dan +=pwd.substring(i-1,i);
}else{
shuang+=pwd.substring(i-1, i);
}
然后在得到的奇数和偶数之间加入一些无意义的字符,可以提高安全性。
以下为生存随机字符的方法:
/***
* 得到指定长度的随机数字和字母的字符串
* @param char1
* @param char2
* @param len
* @return
*/
public static String getMultiStr(int len){
String str="";
for(int i=0;i<len;i++){
int j=1+(int)(Math.random()*3);//随机得到1-3的数
switch (j) {
case 1:
str+=(char)('0'+Math.random()*('9'-'1'+1));//随机的到0-9之间的数
break;
case 2:
str+=(char)('a'+Math.random()*('z'-'a'+1));//随机得到a-z之间的字符
break;
default:
str+=(char)('A'+Math.random()*('Z'-'A'+1));//随机的到A-Z之间的字符
break;
}
}
return str;
}
通过得到随机字符将密文加密,比如:
secret=getMultiStr(3)+shuang(偶数位)+getMultiStr(4)+dan(奇数位)+getMultiStr(5);
另发一个解密方法用于测试:
/***
* 密文解密成原码
* @param 密文
* @return 原码
*/
public static String restorePwd(String secret){
//密文长度
int leng=secret.length();
String dan="";//单数
String shuang="";//双数
String pwd="";//解密后的密码
//如果密文长度为双数,原码为双数
if(leng%2==0){
int i=(leng-12)/2;
shuang=secret.substring(3, 3+i);
dan=secret.substring(leng-5-i,leng-5);
}else{
int i=(leng-12+1)/2;
shuang=secret.substring(3,3+i-1);
dan=secret.substring(leng-5-i,leng-5);
}
String ToPwd=dan+shuang;//双栏密文
int p=ToPwd.length();//双栏密文的长度
int pp=0;
if(p%2==0){
pp=p/2;
for(int i=1;i<pp+1;i++){
pwd+=ToPwd.substring(i-1, i)+ToPwd.substring(i-1+pp,i+pp);
}
}else{
pp=(p+1)/2;
for(int i=1;i<pp;i++){
pwd+=ToPwd.substring(i-1, i)+ToPwd.substring(i-1+pp,i+pp);
}
pwd+=ToPwd.substring(pp-1,pp);
}
return pwd;
}
事实证明,加密方法比解密方法更容易地多,我在测试时没用到过解密,但还是发出来,和大家交流学习