文章目录
- 如何计算维吉尼亚密码?
- Java实现加密算法
- Java实现解密算法
- 参考博客
如何计算维吉尼亚密码?
计算维吉尼亚密码有2种方式,一种是根据密码表查找,另一种是手动计算方法。
1.密码表查找法
第一行是密钥,第一列是明文,某明文对应密钥加密产生的密文即为该行该列处的字母。
比如:明文是I LOVE YOU,密钥是KEY
那么对应的查询关系就是
2.手动计算方法
用数字0-25代替字母A-Z,需要特别注意的是第一个字母是从0开始编号的。要是从1开始计算,得到的结果肯定是错误的。还有就是·编号相加之后数值大于等于26,我们都要将这个数据对26做模运算才行。
则可以有以下计算过程
Java实现加密算法
package encryption;
import java.util.Scanner;public class encryption {public static void main(String[] args){//读取键盘输入值Scanner sc1 = new Scanner(System.in);System.out.println("请输入明文");Scanner sc2= new Scanner(System.in);System.out.println("请输入密钥");//将读取的明文的赋给m,将读取的密钥赋给kString m=sc1.nextLine();String k=sc1.nextLine();char[] result=new char[50];// 测试使用
// String m="iloveyou";
// String k="key";// System.out.println(m.charAt(0));
// 运行结果是i
// System.out.println(m.charAt(0)-'a');
// 运行结果是8,也就是字符i与a之间差的位数
// System.out.println((char)(m.charAt(0)-'a'+97));
// 如果不加97强制转换成char类型会产生乱码
// System.out.println((char)(((m.charAt(1)-'a'+k.charAt(1)-'a')%26)+97));//加密算法//java.lang.String.charAt() 方法返回指定索引处的char值int j=0,z=0;for(int i=0;i<m.length();i++)//在明文长度内循环{if(m.charAt(i)>='a' && m.charAt(i)<= 'z') //默认输入为小写字母result[z]=(char)(((m.charAt(i)-'a'+k.charAt(j)-'a')%26)+97); else //大写字母result[z]=(char)(((m.charAt(i)-'A'+k.charAt(j)-'a')%26)+65);j++;if(j>=k.length()) j=0;//以密钥长度为一个周期循环z++;}System.out.println(result);}
}
运行结果为:
Java实现解密算法
package encryption;import java.util.Scanner;public class decrypt {public static void main(String[] args){//读取键盘输入值Scanner sc1 = new Scanner(System.in);System.out.println("请输入密文");Scanner sc2= new Scanner(System.in);System.out.println("请输入密钥");//将读取的明文的赋给m,将读取的密钥赋给kString m=sc1.nextLine();String k=sc1.nextLine();char[] result=new char[50];//加密算法//java.lang.String.charAt() 方法返回指定索引处的char值int j=0,z=0;for(int i=0;i<m.length();i++)//在明文长度内循环{if(m.charAt(i)>='a' && m.charAt(i)<= 'z') //默认输入为小写字母result[z]=(char)(((m.charAt(i)-'a'-(k.charAt(j)-'a')+26)%26)+97); else //大写字母result[z]=(char)(((m.charAt(i)-'A'-(k.charAt(j)-'a')+26)%26)+65);j++;if(j>=k.length()) j=0;//以密钥长度为一个周期循环z++;}System.out.println(result);}}
运行结果
参考博客
强制转成char类型为什么会出现乱码(为什么要加97)
c语言实现维吉尼亚加解密算法
Java中charAt()的用法