应用JAVA进行密码加密的一种算法
发表于《河北科技大学学报》(2007-7 Vol.28,P122)
摘要:在这篇文章中将要介绍一种简单的密码不可逆加密算法的实现,代码采用的是java语言。现在网络的很多功能都要求网络用户在进行注册后,登陆才有权使用。一般来说注册信息中都要包含用户名、密码、电子邮箱等内容。对于密码,一般要进行不可逆的加密存储,也就是说从密码可以演算到密文,但从密文不能够反演出密码。
关键词:密码;加密;java;算法
中图分类号:TP301. 6 文献标识码:A 文章编号:
1 代码的功能及密码到密文的算法
下面对代码每一部分功能及如何实现密文不能反演出密码的算法。
Main()主方法的主要功能是输入密码,显示输入的密码,输出演算出的密文。演算密码的功能将在方法transf(char c,int i)和方法cryptograph(int[] n,int i)中实现。
方法transf(char c)的功能是将密码进行初步的转换,将密码中的每个字符分类并按照不同的类型将密码的每个字符的ASCII码加上一个干扰的偏移量,这里偏移量的取法为:若该为字符为“0”~“9”的数字则将其ASCII码加上数字1,若该为字符为“a”~“z”的数字则将其ASCII码加上数字2,若该为字符为“A”~“Z”的数字则将其ASCII码加上数字3。这将对反演密码带来一定的干扰。通过调用方法transf(char c)可以得到int[]类型的数组,其值为密码的ASCII码加上相应的偏移量。真正实现密文不能反演出密码的过程是通过方法cryptograph(int[] n,int i)来实现的。
方法cryptograph(int[] n,int i),主要实现了密文无法反演出密码的功能。主要算法如下:在处理第j(其含义见此方法中的变量j)位密码时对由方法transf(char c)算得的转译数组除第j个元素外的其他元素的值累加到int 类型变量modnumber中 ;然后对变量
modnumber进行校验,分析其是奇数还是偶数,根据分析结果再进行下一步的处理;(1)若modnumber为偶数则将对应位的密码移
位3位小写英文字母,处理过程为,将转译数组的j个元素安位不带符号的右移4位(将原有内容进行隐藏)再加上变量modnumber,得到新的变量rightn,取变量rightn对25(英文字母共26个,将26减去1)的余数加上97(小写英文字母a的ASCII码值),将得到的数值转换成字符放到密文的对应位置(由变量numch决定);(2)若modnumber为奇数,与(1)相同得到变量rightn的值,取变量rightn对9(阿拉伯数字共10个,将10减1)的余数加上48(阿拉伯数字0的ASCII码值),将得到的数值转换成字符放到密文的对应位置(由变量numch决定)。经过方法cryptograph(int[] n,int i)的处理后密文将很难再被演算成密码,因为在从密码演算密文的过程中已经将密码的一些信息丢弃。
2 用JAVA语言对算法的实现
import java.io.*;
public class Encrypt {
public static void main(String args[]){
int nch[]=new int[20]; //密文中间变量
int slong=0; //s 的长度
String s; //存储密码(英文字符),密码长度不超过20个英文字符
String cryp; //存放密文
char ch[]=new char[20]; //存放密码的每个字符
BufferedReader in= new BufferedReader(new InputStreamReader(System.in));
try{
s=in.readLine(); //获取密码
slong=s.length(); //获取字符串长度
if(slong>20){
slong=20;
s=s.substring(0,20); //如果密码长度大于20个字符,只取前20个字符
}
System.out.println("s="+s); //显示输入的密码
ch=s.toCharArray(); //将密码付值给字符数组
}catch(IOException e){
System.out.println(e);
}
for(int i=0;i<slong;i++){
nch[i]=transf(ch[i],i); // 获得密文钥匙
}
cryp=cryptograph(nch,slong);
System.out.println("cryp="+cryp); //输出密文
}
public static int transf(char c){ //演算密文钥匙
if(c>='0'&&c<='9'){
return c+1;
}
else if(c>='a'&&c<='z'){
return c+2;
}
else if(c>='A'&&c<='Z'){
return c+3;
}
else return c;
}
public static String cryptograph(int[] n,int i){ //演算密文
int j; //用于循环
int numch=0; //数组ch[]中圆熟的实际最大元素个数
int modnumber=0;
char[] ch=new char[i*3];
String s="";
String sch;
for(j=0;j<i;j++){
for(int k=1;k<i;k++){
modnumber+=n[(i-(j-k))%i];
}
int rightn=0;
if(modnumber%2==0){
rightn=modnumber+(n[j]>>>4);
ch[numch++]=(char)(rightn%25+97);
rightn=rightn/10;
ch[numch++]=(char)(rightn%25+97);
ch[numch++]=(char)(modnumber%25+97);
}
else{
rightn=modnumber+(n[j]>>>4);
ch[numch++]=(char)(rightn%9+48);
rightn=rightn/10;
ch[numch++]=(char)(rightn%9+48);
ch[numch++]=(char)(modnumber%9+48);
}
}
for(j=0;j<numch;j++){
s=s+ch[j];
}
return s;
}
}
3 结束语
这里提供一种简单密码加密的解决方案,我们在电工电子实验网上教学平台的学生注册和学生登陆页面上采用了此算法,运行可靠。
参考文献:
[1] 丁振凡 主编Java语言实用教程[M]. 北京邮电大学出版社. 2005年2月. 第一版
[2] [美]James Gosling,Bill Joy,Guy Steele著,蒋国新 朱暄 李洪伟译 Java语言规范[M]. 北京大学出版社. 1997年12月第一版