《密码学》习题1.1 Java代码实现

求各位大大给个点赞吧,小的很需要   (˚ ˃̣̣̥᷄⌓˂̣̣̥᷅ )


解题思路:

  • 首先写一项代码,我们要先理清楚解题思路在开始 一 一 实现
  • 我们得知这是一道仿射密码的算法,我们查找资料得知放射密码的加密算法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:如果代码中能够进行优化,有错误可以进行评论探讨相关知识,希望我们可以多多进行交流沟通,最后看在这份上,各位大大点下免费的赞吧(据说点赞的人都能找到漂亮的女朋友哦 (ಡωಡ) (ಡωಡ)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值