目录
前言
随着技术的发展,密码加密技术已经越来越普遍越来越多样化,在我们生活中常见的加密算法包括了DES加密算法,AES加密算法,RSA加密算法,MD5加密算法等等。密码加密在我们国家社会生活中都起着非常重要的作用,它能保护我们的重要信息不被泄露,维护国家安全,使个人和国家和社会的利益得到良好的保障,因此加密技术的可靠性也变得越来越重要。
1.密码加密的主要方式
密码加解密简单的理解就是对字符串进行操作,通常我们的密码输入包括了大小写字母,数字,'.','_'字符,对于不同的字符可以通过产生随机数进行不同的处理,并将这些随机数与表达式相联系,通过某种方式来对随机数进行隐藏。此代码的大体处理过程对于大小写字母,先将大小写字母通过产生小于26位的随机数进行移位,比如当产生的随机数是7时,如果密码中有小写的字母a,则通过h来对a进行替代。这样就完成了第一步操作,为了更好的利用随机数再通过产生随机范围更大的随机数来对大小写字母进行移位,并将这些大小写字母移动到汉字所对应的ASCII上,以此步骤来对密码进行加密,而对随机数的处理,我们也可以通过相同的方式将随机数进行移位,而随机数移动的位数与大小写字母有一定的相关性,最后通过对不同的字符进行处理,就会得到通过随机数一位产生不同的汉字,并将这些汉字通过特定的方式组合在一起,最后就得到了密码加密的密钥了。对于密码解密过程,只需要进行反向逆推就可以得出。其中随机数可以大大的提高密钥的复杂程度,同一个密码通过加密可以得到不同的密钥。
2.代码的实现过程
3.整体代码
package zuopin;
import java.util.Arrays;
import java.util.Scanner;
class Dengluxitong {
//数字初始移动的位数
private int Cshuziyidongweishu;
//大写初始字母移动的位数
private int Cdaxiezimuyidongdeweishu;
//小写初始字母移动的位数
private int Cxiaoxiezimuyidongdeweishu;
//数字移动的位数
private int shuziyidongweishu;
//大写字母移动的位数
private int daxiezimuyidongdeweishu;
//小写字母移动的位数
private int xiaoxiezimuyidongdeweishu;
//密码
private StringBuilder mima;
//关键信息1代表大写字母2代表小写字母3代表数字4代表'.','_'
private int []sss=new int[16];
//重要信息1
private char []zhongyaoxinxi1=new char[8];
//未知数
private char []weizhishu=new char[4];
//设置初始密码
Dengluxitong() {
this.mima = new StringBuilder("################");
this.Cshuziyidongweishu=(int)(1000000+Math.random()*20000);
this.Cdaxiezimuyidongdeweishu=(int)(1000000+Math.random()*20000);
this.Cxiaoxiezimuyidongdeweishu=(int)(1000000+Math.random()*20000);
this.shuziyidongweishu=(int)(0+Math.random()*10);
this.daxiezimuyidongdeweishu=(int)(0+Math.random()*26);
this.xiaoxiezimuyidongdeweishu=(int)(0+Math.random()*26);
zhongyaochuli1();
}
//返回数字初始移动的位数
private int getCshuziyidongweishu() {
return Cshuziyidongweishu;
}
//返回大写初始字母移动的位数
private int getCdaxiezimuyidongdeweishu() {
return Cdaxiezimuyidongdeweishu;
}
//返回小写初始字母移动的位数
private int getCxiaoxiezimuyidongdeweishu() {
return Cxiaoxiezimuyidongdeweishu;
}
//返回数字移动的位数
private int getShuziyidongweishu() {
return shuziyidongweishu;
}
//返回大写字母移动的位数
private int getDaxiezimuyidongdeweishu() {
return daxiezimuyidongdeweishu;
}
//返回小写字母移动的位数
private int getXiaoxiezimuyidongdeweishu() {
return xiaoxiezimuyidongdeweishu;
}
//返回关键信息
private int[] getSss() {
return sss;
}
private void zhongyaochuli1(){
zhongyaoxinxi1[0]=(char)(1020005);
zhongyaoxinxi1[1]=(char)(1020002);
zhongyaoxinxi1[2]=(char)(1020000);
zhongyaoxinxi1[3]=(char)(1020001);
zhongyaoxinxi1[4]=(char)(1020003);
zhongyaoxinxi1[5]=(char)(1020001);
zhongyaoxinxi1[6]=(char)(1020004);
zhongyaoxinxi1[7]=(char)(1020020);
weizhishu[0]=(char) (1020189);
weizhishu[1]=(char) (1020270);
weizhishu[2]=(char) (1020361);
weizhishu[3]=(char) (1020452);
}
//密码输入
private void setMima() {
Scanner input=new Scanner(System.in);
System.out.println("提示:密码的位数为8~16位,且由大小写字母,数字,'.','_'组成。");
System.out.println("请输入密码:");
String A;
int B;
int C;
do {
C=0;
do {
A=input.next();
if(A.length()<8)
{
System.out.println("输入的密码位数太短!");
System.out.println("请重新输入:");
}
else
if(A.length()>16)
{
System.out.println("输入的密码位数太长!");
System.out.println("请重新输入:");
}
}while (A.length()<8||A.length()>16);
for(int i=0;i<A.length();i++)
{
B=0;
for(char j='0';j<='9';j++)
{
if(A.charAt(i)==j)
{
B=1;
sss[i]=3;
break;
}
}
if(B==0)
{
for(char j='A';j<='Z';j++)
{
if(A.charAt(i)==j)
{
B=1;
sss[i]=1;
break;
}
}
}
if(B==0)
{
for(char j='a';j<='z';j++)
{
if(A.charAt(i)==j)
{
B=1;
sss[i]=2;
break;
}
}
}
if(B==0)
{
if(A.charAt(i)=='.'||A.charAt(i)=='_')
{
B=1;
sss[i]=4;
}
}
if(B==0)
{
System.out.println("输入的密码格式不对!");
System.out.println("请重新输入:");
break;
}
if(i==A.length()-1)
{
C=1;
}
}
}while (C!=1);
mima= new StringBuilder(A);
}
//密码输出
private StringBuilder getMima() {
return mima;
}
//密码加密
private void mimajiami(){
int A=0;
for(int i=0;i<mima.length();i++)
{
if(mima.charAt(i)=='#')
A++;
}
if(A==16)
{
System.out.println("密码没有进行输入,无法进行加密!");
}
for(int i=0;i<mima.length();i++)
{
for(char j='A';j<='Z';j++)
{
if(mima.charAt(i)==j)
{
culi1(i);
break;
}
}
for(char j='a';j<='z';j++)
{
if(mima.charAt(i)==j)
{
culi2(i);
break;
}
}
for(char j='0';j<='9';j++)
{
if(mima.charAt(i)==j)
{
culi3(i);
break;
}
}
if(mima.charAt(i)=='.'||mima.charAt(i)=='_')
{
culi4(i);
}
}
}
//正向处理A~Z位的密码
private void culi1(int i){
char A;
A=(char)(mima.charAt(i)+Cdaxiezimuyidongdeweishu);
mima.setCharAt(i,A);
if(mima.charAt(i)+daxiezimuyidongdeweishu>(char)(90+Cdaxiezimuyidongdeweishu))
{
A=(char)(mima.charAt(i)+daxiezimuyidongdeweishu-26);
mima.setCharAt(i,A);
}
else
{
A=(char)(mima.charAt(i)+daxiezimuyidongdeweishu);
mima.setCharAt(i,A);
}
}
//正向处理a~z位的密码
private void culi2(int i){
char A;
A=(char)(mima.charAt(i)+Cxiaoxiezimuyidongdeweishu);
mima.setCharAt(i,A);
if(mima.charAt(i)+xiaoxiezimuyidongdeweishu>(char)(122+Cxiaoxiezimuyidongdeweishu))
{
A=(char) (mima.charAt(i)+xiaoxiezimuyidongdeweishu-26);
mima.setCharAt(i,A);
}
else
{
A=(char)(mima.charAt(i)+xiaoxiezimuyidongdeweishu);
mima.setCharAt(i,A);
}
}
//正向处理0~9位的密码
private void culi3(int i) {
char A;
A=(char) (mima.charAt(i)+Cshuziyidongweishu);
mima.setCharAt(i,A);
if(mima.charAt(i)+shuziyidongweishu>(char)(57+Cshuziyidongweishu))
{
A=(char)(mima.charAt(i)+shuziyidongweishu-10);
mima.setCharAt(i,A);
}
else
{
A=(char)(mima.charAt(i)+shuziyidongweishu);
mima.setCharAt(i,A);
}
}
//正向处理'.'和'_'
private void culi4(int i){
if(i%2==0)
{
if(mima.charAt(i)=='.')
{
mima.setCharAt(i,weizhishu[0]);
}
else
{
mima.setCharAt(i,weizhishu[1]);
}
}
else
{
if(mima.charAt(i)=='.')
{
mima.setCharAt(i,weizhishu[2]);
}
else
{
mima.setCharAt(i,weizhishu[3]);
}
}
}
//密码解密
private void mimajiemi(){
for(int i=0;i<mima.length();i++)
{
culi5(i);
}
}
//反向处理密码
private void culi5(int i) {
if(sss[i]==1)
{
char A;
if(mima.charAt(i)-daxiezimuyidongdeweishu<(char)(65+Cdaxiezimuyidongdeweishu))
{
A=(char) (mima.charAt(i)-daxiezimuyidongdeweishu+26);
mima.setCharAt(i,A);
}
else
{
A=(char)(mima.charAt(i)-daxiezimuyidongdeweishu);
mima.setCharAt(i,A);
}
A=(char)(mima.charAt(i)-Cdaxiezimuyidongdeweishu);
mima.setCharAt(i,A);
}
else
if(sss[i]==2)
{
char A;
if(mima.charAt(i)-xiaoxiezimuyidongdeweishu<(char)(97+Cxiaoxiezimuyidongdeweishu))
{
A=(char) (mima.charAt(i)-xiaoxiezimuyidongdeweishu+26);
mima.setCharAt(i,A);
}
else
{
A=(char)(mima.charAt(i)-xiaoxiezimuyidongdeweishu);
mima.setCharAt(i,A);
}
A=(char) (mima.charAt(i)-Cxiaoxiezimuyidongdeweishu);
mima.setCharAt(i,A);
}
else
if(sss[i]==3)
{
char A;
if(mima.charAt(i)-shuziyidongweishu<(char)(48+Cshuziyidongweishu))
{
A=(char) (mima.charAt(i)-shuziyidongweishu+10);
mima.setCharAt(i,A);
}
else
{
A=(char)(mima.charAt(i)-shuziyidongweishu);
mima.setCharAt(i,A);
}
A=(char)(mima.charAt(i)-Cshuziyidongweishu);
mima.setCharAt(i,A);
}
else
{
if(i%2==0)
{
if(mima.charAt(i)==weizhishu[0])
{
mima.setCharAt(i,'.');
}
else
{
mima.setCharAt(i,'_');
}
}
else
{
if(mima.charAt(i)==weizhishu[2])
{
mima.setCharAt(i,'.');
}
else
{
mima.setCharAt(i,'_');
}
}
}
}
//添加1
private void tianjia1(StringBuilder B,int B1){
B.append((char)B1);
}
//添加2
private void tianjia2(StringBuilder B,int B1){
B.append((char)(B1+1020200));
}
//总方法1
void shuchumiyao() {
Dengluxitong A=new Dengluxitong();
A.setMima();
A.mimajiami();
StringBuilder B=A.getMima();
int B1=A.getCshuziyidongweishu();
int B2=A.getCdaxiezimuyidongdeweishu();
int B3=A.getCxiaoxiezimuyidongdeweishu();
int C1=A.getShuziyidongweishu();
int C2=A.getDaxiezimuyidongdeweishu();
int C3=A.getXiaoxiezimuyidongdeweishu();
tianjia1(B,B1);
tianjia1(B,B2);
tianjia1(B,B3);
tianjia2(B,C1);
tianjia2(B,C2);
tianjia2(B,C3);
B.append(zhongyaoxinxi1[6]);
int []C;
C=A.getSss();
char []D=new char[C.length];
for(int i=0;i<D.length;i++)
{
if(C[i]==0)
{
D[i]=(char)(1020400);
}
else
if(C[i]==1)
{
D[i]=(char)(1020403);
}
else
if(C[i]==2)
{
D[i]=(char)(1020405);
}
else
if(C[i]==3)
{
D[i]=(char)(1020407);
}
else
{
D[i]=(char)(1020409);
}
}
B.append(D);
String E=B.toString();
System.out.println("输出的加密密码为:");
for(int i=0;i<E.length();i++)
{
System.out.print(E.charAt(i));
}
}
//总方法2
void shucuyuanma(){
Scanner input=new Scanner(System.in);
xiaoxiezimuyidongdeweishu=0;
daxiezimuyidongdeweishu=0;
shuziyidongweishu=0;
Cxiaoxiezimuyidongdeweishu=0;
Cdaxiezimuyidongdeweishu=0;
Cshuziyidongweishu=0;
System.out.println();
System.out.println("请输入加密密码:");
String A=input.next();
int B=15;
int S;
for(S=A.length()-1;S>=0;S--)
{
if(A.charAt(S)!=zhongyaoxinxi1[6])
{
if(A.charAt(S)==(char)(1020400))
{
sss[B]=0;
B--;
}
else
if(A.charAt(S)==(char)(1020403))
{
sss[B]=1;
B--;
}
else
if(A.charAt(S)==(char)(1020405))
{
sss[B]=2;
B--;
}
else
if(A.charAt(S)==(char)(1020407))
{
sss[B]=3;
B--;
}
else
if(A.charAt(S)==(char)(1020409))
{
sss[B]=4;
B--;
}
}
else
{
break;
}
}
S--;
xiaoxiezimuyidongdeweishu=A.charAt(S)-(char)1020200;
S--;
daxiezimuyidongdeweishu=A.charAt(S)-(char)1020200;
S--;
shuziyidongweishu=A.charAt(S)-(char)1020200;
S--;
Cxiaoxiezimuyidongdeweishu=A.charAt(S);
S--;
Cdaxiezimuyidongdeweishu=A.charAt(S);
S--;
Cshuziyidongweishu=A.charAt(S);
int D=0;
for(int i=0;i<16;i++)
{
if(sss[i]==0)
{
break;
}
else
{
D++;
}
}
for(int i=D-1;i>=0;i--)
{
mima.setCharAt(i,A.charAt(i));
}
mimajiemi();
for(int i=0;i<D;i++)
{
System.out.print(mima.charAt(i));
}
}
}
测试类
package helloworld;
class DengluxitongTest {
public static void main(String[] args) {
Dengluxitong A=new Dengluxitong();
A.shuchumiyao();
A.shucuyuanma();
}
}