网络安全常见的四种加密解密算法.docx
《网络安全常见的四种加密解密算法.docx》由会员分享,可在线阅读,更多相关《网络安全常见的四种加密解密算法.docx(19页珍藏版)》请在冰点文库上搜索。
网络安全常见的四种加密解密算法
packagemima;
importjava.io.BufferedReader;
importjava.io.IOException;
importjava.io.InputStreamReader;
importjava.util.Scanner;
publicclassMainer{
StringBufferMStr=newStringBuffer("");//加密字符串
StringBufferCStr=newStringBuffer("");//解密字符串
publicstaticvoidmain(String[]args){
System.out.print("请输入密钥:
");
Scanners=newScanner(System.in);
intkey=s.nextInt()%26;//%26的意义是获取密钥的偏移值
Mainerks=newMainer();
ks.E(key);//加密
ks.D(key);//解密
}
/**
*加密公式
*/
voidE(intk){
try{
System.out.println("请输入一段明文:
");
charb[];
BufferedReaderbr2=newBufferedReader(newInputStreamReader(System.in));
Stringstr2=br2.readLine();
b=str2.toCharArray();
charch='';
for(inti=0;iif(b[i]>='a'&&b[i]<='z'){
ch=(char)((b[i]-'a'+k)%26+'a');
}
if(b[i]>='A'&&b[i]<='Z'){
ch=(char)((b[i]-'A'+k)%26+'A');
}
if(b[i]>='0'&&b[i]<='9')
{
if(b[i]+k%10<='9')
{
ch=(char)(b[i]+k%10);//当提取的字符在9之前的n位时
}
else
{ch=(char)('0'+((b[i]-('9'-k)-1)%10));//孤立出来的n个字符
}ch=b[i];}
MStr.append(ch);//拼接字符串
}
System.out.println("密文为:
"+MStr+"密匙为:
"+k);
}catch(IOExceptione){
System.out.println(e.getMessage());
}
}
/**
*解密公式
*/
voidD(intk){
try{
charb[];
b=MStr.toString().toCharArray();
charch='';
for(inti=0;iif(b[i]>='a'&&b[i]<='z'){
ch=(char)((b[i]-'a'+26-k)%26+'a');
}
if(b[i]>='A'&&b[i]<='Z'){
ch=(char)((b[i]-'A'+26-k)%26+'A');
}
if(b[i]>='0'&&b[i]<='9'){
if(b[i]-k%10>='0')//当提取的字符在0之前的n个时
{ch=(char)(b[i]-k%10);}
else{
ch=(char)('9'-((b[i]-(k-'0')-1)%10));//操作孤立出来的n个字符
}
ch=b[i];}
CStr.append(ch);//拼接字符串
}
System.out.println("明文:
"+CStr);
}catch(Exceptione){
System.out.println(e.getMessage());
}
}
}
publicstaticvoidmain(String[]args){
System.out.print("1.移位加密;2移位解密");
Scannerresult=newScanner(System.in);
intr=result.nextInt();
System.out.print("请输入密钥:
");
Scanners=newScanner(System.in);
intkey=s.nextInt()%26;//%26的意义是获取密钥的偏移值
yiweiks=newyiwei();
if(r==1){ks.E(key);}//加密
elseif(r==2)
{ks.D(key);}//解密
elseSystem.out.print("请选择正确选项(1或2)");
}
移位:
packagemima;
importjava.io.BufferedReader;
importjava.io.IOException;
importjava.io.InputStreamReader;
importjava.util.Scanner;
publicclassMainer{
StringBufferMStr=newStringBuffer("");//加密字符串
StringBufferCStr=newStringBuffer("");//解密字符串
publicstaticvoidmain(String[]args){
System.out.print("请输入密钥:
");
Scanners=newScanner(System.in);
intkey=s.nextInt()%26;//%26的意义是获取密钥的偏移值
Mainerks=newMainer();
ks.E(key);//加密
ks.D(key);//解密
}
/**
*加密公式
*/
voidE(intk){
try{
System.out.println("请输入一段明文:
");
charb[];
BufferedReaderbr2=newBufferedReader(newInputStreamReader(System.in));
Stringstr2=br2.readLine();
b=str2.toCharArray();
charch='';
for(inti=0;iif(b[i]>='a'&&b[i]<='z'){
ch=(char)((b[i]-'a'+k)%26+'a');
}
if(b[i]>='A'&&b[i]<='Z'){
ch=(char)((b[i]-'A'+k)%26+'A');
}
if(b[i]>='0'&&b[i]<='9')
{
if(b[i]+k%10<='9')
{
ch=(char)(b[i]+k%10);//当提取的字符在9之前的n位时
}
else
{ch=(char)('0'+((b[i]-('9'-k)-1)%10));//孤立出来的n个字符
}}
MStr.append(ch);//拼接字符串
}
System.out.println("密文为:
"+MStr+"密匙为:
"+k);
}catch(IOExceptione){
System.out.println(e.getMessage());
}
}
/**
*解密公式
*/
voidD(intk){
try{
charb[];
b=MStr.toString().toCharArray();
charch='';
for(inti=0;iif(b[i]>='a'&&b[i]<='z'){
ch=(char)((b[i]-'a'+26-k)%26+'a');
}
if(b[i]>='A'&&b[i]<='Z'){
ch=(char)((b[i]-'A'+26-k)%26+'A');
}
if(b[i]>='0'&&b[i]<='9'){
if(b[i]-k%10>='0')//当提取的字符在0之前的n个时
{ch=(char)(b[i]-k%10);}
else{
ch=(char)('9'-((b[i]-(k-'0')-1)%10));//操作孤立出来的n个字符
}}
CStr.append(ch);//拼接字符串
}
System.out.println("明文:
"+CStr);
}catch(Exceptione){
System.out.println(e.getMessage());
}
}
}
vigenere
packagemima;
importjava.util.Scanner;
publicclassvigenere{
publicstaticvoidmain(String[]args){
//TODOAuto-generatedmethodstub
@SuppressWarnings("resource")
Scannerinput=newScanner(System.in);
System.out.println("输入明文,要求用小写字母,不要打空格");
Strings=input.nextLine();//输入明文,要求用小写字母,不要打空格
System.out.println("输入秘钥,要求用小写字母,不要打空格");
Strings2=input.nextLine();//输入秘钥,要求用小写字母,不要打空格
Strings3=encrypt(s,s2);//使用加密算法,得到密文
System.out.println(s3);
Strings4=deciphering(s3,s2);//使用解密算法,实现解密
System.out.println(s4);
}
publicstaticStringencrypt(Strings1,Strings2){
char[]ch1=s1.toCharArray();
intlength=ch1.length;//明文长度
int[]in1=newint[length];
for(inti=0;iin1[i]=ch1[i]-97;//利用ascii变成0-25数字
}
char[]ch2=s2.toCharArray();
intlength2=ch2.length;//明文长度
int[]in2=newint[length2];
for(inti=0;iin2[i]=ch2[i]-97;//利用ascii变成0-25数字
}
intj=0;
for(inti=0;iif(j==length2)
j=0;
in1[i]=(in1[i]+in2[j])%26;//加密算法,mod26
j++;
}
for(inti=0;ich1[i]=(char)(in1[i]+97);//将数字变成字母
}
returnString.valueOf(ch1);//将字符串数字变成String类型的字符串,返回
}
publicstaticStringdeciphering(Strings1,Strings2){
char[]ch1=s1.toCharArray();
intlength=ch1.length;//密文长度
int[]in1=newint[length];
for(inti=0;iin1[i]=ch1[i]-97;//利用ascii变成0-25数字
}
char[]ch2=s2.toCharArray();
intlength2=ch2.length;//明文长度
int[]in2=newint[length2];
for(inti=0;iin2[i]=ch2[i]-97;//利用ascii变成0-25数字
}
intj=0;
for(inti=0;iif(j==length2)
j=0;
in1[i]=(in1[i]-in2[j])%26;//解密算法,mod26
if(in1[i]<0)
in1[i]+=26;//如果得到负数,则加上26转正
j++;
}
for(inti=0;ich1[i]=(char)(in1[i]+97);//将数字变成字母
}
returnString.valueOf(ch1);//将字符串数字变成String类型的字符串,返回
}
}
仿射加密:
packagemima;
importjava.util.Scanner;
publicclassfangshe{
privatestaticfinalintnumber=26;
/*
*本代码是仿射密码的加密与解密的实现,内含用欧几里得扩展算法求一个数对于26的逆,
*encrypt函数实现加密,deciphering函数实现解密,Euclid函数实现用欧几里得算法求一个数对于26的逆
*/
publicstaticvoidmain(String[]args){
@SuppressWarnings("resource")
Scannerinput=newScanner(System.in);
System.out.println("请输入明文,要求用小写字母,不要打空格");
Strings=input.nextLine();//输入明文,要求用小写字母,不要打空格
System.out.println("请输入放射密码里面的a");
inta=input.nextInt();//输入放射密码里面的a
System.out.println("请输入放射密码里面的b");
intb=input.nextInt();//输入放射密码里面的b
Stringch2=encrypt(s,a,b);//调用加密函数,得到密文
System.out.println(ch2);
//deciphering
inta2=Euclid(a,number);//采用欧几里得算法计算a的逆。
定义为a2;
System.out.println("a2="+a2);
Stringch3=deciphering(ch2,a2,b);//调用解密算法,得到明文
System.out.println("ch3="+ch3);
}
publicstaticStringencrypt(Strings,inta,intb){//加密函数的实现
char[]ch=s.toCharArray();
intlength=ch.length;//明文长度
int[]in=newint[length];
for(inti=0;iin[i]=ch[i]-97;//利用ascii变成0-25数字
}
for(inti=0;iin[i]=(in[i]*a+b)%26;//加密算法
}
for(inti=0;ich[i]=(char)(in[i]+97);//将数字变成字母
}
returnString.valueOf(ch);//将字符串数字变成String类型的字符串,返回
}
publicstaticintEuclid(inta,intmunber){//求a的逆的实现
inta1=1,a2=0,a3=number;
intb1=0,b2=1,b3=a;
intt1,t2,t3;
intq;
q=a3/b3;
System.out.println("q="+q);
t1=a1-q*b1;
t2=a2-q*b2;
t3=a3-q*b3;
while(t3!
=1){
a1=b1;
a2=b2;
a3=b3;
b1=t1;
b2=t2;
b3=t3;
q=a3/b3;
t1=a1-q*b1;
t2=a2-q*b2;
t3=a3-q*b3;
}
inta4=t2%munber;
if(a4<0)
a4+=munber;//如果a4小于0,要加上26变正
returna4;//返回a的逆
}
publicstaticStringdeciphering(Strings,inta,intb){//解密的实现
char[]ch=s.toCharArray();
intlength=ch.length;//密文长度
int[]in=newint[length];
for(inti=0;iin[i]=ch[i]-97;//利用ascii变成0-25数字
}
for(inti=0;iin[i]=((in[i]-b)*a)%26;//解密算法
if(in[i]<0)
in[i]+=26;
}
for(inti=0;ich[i]=(char)(in[i]+97);//将数字变成字母
}
returnString.valueOf(ch);//将字符串数字变成String类型的字符串,返回
}
}
改版:
packagemima;
importjava.util.Scanner;
publicclassfangshe{
privatestaticfinalintnumber=26;
publicstaticvoidmain(String[]args){
Scannerinput=newScanner(System.in);
System.out.println("请输入明文");
Strings=input.nextLine();//输入明文,要求用小写字母,不要打空格
System.out.println("请输入密钥k1");
inta=input.nextInt();//输入密钥k1
if(gcd(a,26)!
=1){System.out.println("密钥错误");}
else{System.out.println("请输入密钥k2");
intb=input.nextInt();//输入密钥k2
if(b>25||b<0){System.out.println("密钥错误");}
else{
Stringch2=encrypt(s,a,b);//调用加密函数,得到密文
System.out.println("密文为:
"+ch2);
//deciphering
inta2=Euclid(a,number);//采用欧几里得算法计算a的逆。
定义为a2;
System.out.println("k1的逆="+a2);
Stringch3=deciphering(ch2,a2,b);//调用解密算法,得到明文
System.out.println("明文为:
"+ch3);
}}
}
publicstati