求各位大大给个点赞吧,小的很需要 (˚ ˃̣̣̥᷄⌓˂̣̣̥᷅ )
解题思路:
- 首先写一项代码,我们要先理清楚解题思路在开始 一 一 实现
- 我们得知这是一道仿射密码的算法,我们查找资料得知放射密码的加密算法C=Ek(m)= (a m + b ) mod n 解密算法: E=a^ (-1) (C-b) mod m
- 先开始加密算法的实现:首先我们要将明文 一个一个 的进行加密算法运算,得到一个一个的密文(注意是一个一个加密,所以我们要将输入的明文放进一个char[ ]数组中
- 然后开始解密算法的实现:跟加密算法一样,我们要将密文一个一个的进行解密算法运算,得到一个一个的明文然后打印出来,但是解密算法有一个 a ^ (-1) 这是a的逆,所以我们还要先将a的逆计算出来
- a的逆的计算:a的逆满足公式:a * a^(-1) ≡ mod 26
第一步:加密算法的实现
//加密功能
//加密算法--->E = 11m + 23 (mod26)
class EncryptionFeature{//加密的英文。。。。。
public String Plaintext;//明文的英文,别问我咋知道,百度搜的 :--)
public void Encryption(){
Scanner sc=new Scanner(System.in);
Plaintext=sc.next();
System.out.println(Plaintext);
char[] plaintext=Plaintext.toCharArray();//将Plaintext转化成char数组 -_-
for(int i=0;i<plaintext.length;i++){
if(plaintext[i] != ' '){
char tmp = '0';
tmp= (char)((plaintext[i]-'A')*11+23);
tmp%=26;
tmp+='A';
System.out.print(tmp);//有一个问题这里无法判断空格在那个位置,可以使用if语句进行简单的判断
}else{
System.out.print(" ");
}
}
}
}
第二步:解密算法的实现
//解密功能
//解密算法--->E = 11的逆 * (c-23) (mod26)
class DecryptionFunction{//解密的英文。。。。
public char[] Ciphertext;//密文的英文同明文的英文
public int Seekinversion(){//求逆
//求逆运算---> 11 * x = 1 (mod26)
Scanner sc=new Scanner(System.in);
System.out.println("输入谁的逆");
int n=sc.nextInt();
int x=0;
for(int i=0;i<1000000000;i++){
if((i*n-1)%26==0){//求逆这里应该是-1!!!!!
x=i;
break;
}
}
System.out.println(x);
return x;
}
public void Decryption(){//m是密文
Scanner sc=new Scanner(System.in);
String m=sc.next();
Ciphertext=m.toCharArray();//String类型转换成char数组
int a=Seekinversion();//逆
for(int i=0;i<Ciphertext.length;i++){
if(Ciphertext[i]!=' '){
char tmp='0';
tmp= (char) ((a*((Ciphertext[i]-'A')-23+26)));
tmp%=26;
tmp+='A';
System.out.print(tmp);
}else {
System.out.print(" ");
}
}
}
第三步:创建主类测试类
package a3_7.Test;
import com.sun.org.apache.xerces.internal.impl.xs.SchemaNamespaceSupport;
import java.util.Scanner;
public class test {
public static void main(String[] args) {
EncryptionFeature a=new EncryptionFeature();
a.Encryption();
System.out.println();
DecryptionFunction b=new DecryptionFunction();
b.Decryption();
}
}
下面是整个代码的合并:
package a3_7.Test;
import com.sun.org.apache.xerces.internal.impl.xs.SchemaNamespaceSupport;
import java.util.Scanner;
public class test {
public static void main(String[] args) {
EncryptionFeature a=new EncryptionFeature();
a.Encryption();
System.out.println();
DecryptionFunction b=new DecryptionFunction();
b.Decryption();
}
}
//加密功能
//加密算法--->E = 11m + 23 (mod26)
class EncryptionFeature{//加密的英文。。。。。
public String Plaintext;//明文的英文,别问我咋知道,百度搜的 :--)
public void Encryption(){
Scanner sc=new Scanner(System.in);
Plaintext=sc.next();
System.out.println(Plaintext);
char[] plaintext=Plaintext.toCharArray();//将Plaintext转化成char数组 -_-
for(int i=0;i<plaintext.length;i++){
if(plaintext[i] != ' '){
char tmp = '0';
tmp= (char)((plaintext[i]-'A')*11+23);
tmp%=26;
tmp+='A';
System.out.print(tmp);//有一个问题这里无法判断空格在那个位置,可以使用if语句进行简单的判断
}else{
System.out.print(" ");
}
}
}
}
//解密功能
//解密算法--->E = 11的逆 * (c-23) (mod26)
class DecryptionFunction{//解密的英文。。。。
public char[] Ciphertext;//密文的英文同明文的英文
public int Seekinversion(){//求逆
//求逆运算---> 11 * x = 1 (mod26)
Scanner sc=new Scanner(System.in);
System.out.println("输入谁的逆");
int n=sc.nextInt();
int x=0;
for(int i=0;i<1000000000;i++){
if((i*n-1)%26==0){//求逆这里应该是-1!!!!!
x=i;
break;
}
}
System.out.println(x);
return x;
}
public void Decryption(){//m是密文
Scanner sc=new Scanner(System.in);
String m=sc.next();
Ciphertext=m.toCharArray();//String类型转换成char数组
int a=Seekinversion();//逆
for(int i=0;i<Ciphertext.length;i++){
if(Ciphertext[i]!=' '){
char tmp='0';
tmp= (char) ((a*((Ciphertext[i]-'A')-23+26)));
tmp%=26;
tmp+='A';
System.out.print(tmp);
}else {
System.out.print(" ");
}
}
}
}
总结:这道题是做的第一题,刚刚开始做的时候,就想着快点做完,结果没有一点思路,一直卡着,后面开始仔细思考解题的步骤和思路,犹如豁然开朗一般,就以迅雷不及掩耳之势写完了这道题。
建议:当你看完我的代码,理解后建议你可以再写一遍,并且可以尝试独自做做第二题,第二题和第一题十分类似,就只要多加一个模块就能轻松完成
以下是个人刚开始做的时候认为相对较难的点:
- 如何将明文和密文一个一个的进行加密和解密
- 求a的逆的算法实现(主要是我当时求逆的那里写成了+1,导致我试了半天求不出来,哈哈哈)
eg:如果代码中能够进行优化,有错误可以进行评论探讨相关知识,希望我们可以多多进行交流沟通,最后看在这份上,各位大大点下免费的赞吧(据说点赞的人都能找到漂亮的女朋友哦 (ಡωಡ) (ಡωಡ)