移位替换密码技术:
解密变换:Dk(Aj)=Ai, i=(j-k)(mod n)=(j+(n-k))(mod n)
加密与解密是可逆的,D(k)=E(n-k)
移位替换密码技术密钥为k,唯一地确定了明文空间到密文空间的映射,密钥空间元素个数为n-1
凯撒密码:
一种最为古老的对称加密体制,通过把字母移动一定的位数来实现加密和解密。
k=3
明文字母 a b c d e f g h i j k l m n o p q r s t u v w x y z
数组下标 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
密文字母 d e f g h i j k l m n o p q r s t u v w x y z a b c
数组下标 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 0 1 2
测试例子如下:
import java.util.ArrayList;
import java.util.Scanner;
public class 移位密码技术 {
public static int En(int i,int k,int n){
return (i+k)%n;
}
public static int Dn(int j,int k,int n){
return (j+(n-k))%n;
}
public static void main(String[] args) {
Scanner scan=new Scanner(System.in);
System.out.println("第一行输入密码表总数n\n第二行输入各明文字符\n第三行输入待加密明文");
int n=scan.nextInt();
char CharArrays[]=new char[n];
CharArrays=scan.next().toCharArray();
scan.nextLine();
String normalStr=scan.nextLine();
String splitStrs[]=normalStr.split(" ");
System.out.println("请选择密钥k,0=<k<n");
int k=scan.nextInt();
while(k>=n){
System.out.println("只能选择 0=<k<n 的密钥值!请重新选择");
k=scan.nextInt();
}
ArrayList<Character> templist=new ArrayList<>();
System.out.println("加密后如下:");
for (int i = 0; i < splitStrs.length; i++) {
char normalChars[]=splitStrs[i].toCharArray();
for (int j = 0; j < normalChars.length; j++) {
int t=En((normalChars[j]-'a'), k, n);
normalChars[j]=CharArrays[t];//加密
System.out.print(normalChars[j]);
t=Dn((normalChars[j]-'a'), k, n);
normalChars[j]=CharArrays[t];//解密
templist.add(normalChars[j]);
}
System.out.print(" ");
templist.add(' ');
}
System.out.println("\n解密后如下:");
for(Character o:templist){
System.out.print(o);
}
}
}
运行结果如下:
第一行输入密码表总数n
第二行输入各密文字符
第三行输入待加密明文
26
abcdefghijklmnopqrstuvwxyz
a man liberal in his views
请选择密钥k,0=<k<n
3
加密后如下:
d pdq olehudo lq klv ylhzv
解密后如下:
a man liberal in his views
(加法密码)
解密变换:Dk(Aj)=Ai, i=(j-k)(mod n)=(j+(n-k))(mod n)
加密与解密是可逆的,D(k)=E(n-k)
移位替换密码技术密钥为k,唯一地确定了明文空间到密文空间的映射,密钥空间元素个数为n-1
凯撒密码:
一种最为古老的对称加密体制,通过把字母移动一定的位数来实现加密和解密。
明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文。
k=3
明文字母 a b c d e f g h i j k l m n o p q r s t u v w x y z
数组下标 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
密文字母 d e f g h i j k l m n o p q r s t u v w x y z a b c
数组下标 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 0 1 2
测试例子如下:
import java.util.ArrayList;
import java.util.Scanner;
public class 移位密码技术 {
public static int En(int i,int k,int n){
return (i+k)%n;
}
public static int Dn(int j,int k,int n){
return (j+(n-k))%n;
}
public static void main(String[] args) {
Scanner scan=new Scanner(System.in);
System.out.println("第一行输入密码表总数n\n第二行输入各明文字符\n第三行输入待加密明文");
int n=scan.nextInt();
char CharArrays[]=new char[n];
CharArrays=scan.next().toCharArray();
scan.nextLine();
String normalStr=scan.nextLine();
String splitStrs[]=normalStr.split(" ");
System.out.println("请选择密钥k,0=<k<n");
int k=scan.nextInt();
while(k>=n){
System.out.println("只能选择 0=<k<n 的密钥值!请重新选择");
k=scan.nextInt();
}
ArrayList<Character> templist=new ArrayList<>();
System.out.println("加密后如下:");
for (int i = 0; i < splitStrs.length; i++) {
char normalChars[]=splitStrs[i].toCharArray();
for (int j = 0; j < normalChars.length; j++) {
int t=En((normalChars[j]-'a'), k, n);
normalChars[j]=CharArrays[t];//加密
System.out.print(normalChars[j]);
t=Dn((normalChars[j]-'a'), k, n);
normalChars[j]=CharArrays[t];//解密
templist.add(normalChars[j]);
}
System.out.print(" ");
templist.add(' ');
}
System.out.println("\n解密后如下:");
for(Character o:templist){
System.out.print(o);
}
}
}
运行结果如下:
第一行输入密码表总数n
第二行输入各密文字符
第三行输入待加密明文
26
abcdefghijklmnopqrstuvwxyz
a man liberal in his views
请选择密钥k,0=<k<n
3
加密后如下:
d pdq olehudo lq klv ylhzv
解密后如下:
a man liberal in his views
移位替换密码是一种古老的加密方法,通过在字母表上对明文中的每个字母进行固定数目的前移或后移来生成密文,以此确保信息的安全。
1681

被折叠的 条评论
为什么被折叠?



