JAVA练习题14:数字的加密和解密

数字的加密和解密

  1. 需求:某系统的数字密码(大于0),比如1983,采用加密方式进行传输.密文为8346
  2. 加密规则:
    1.先得到每位数,然后每位数都加上5
    2.再对10求余,最后将所有数字反转,得到一串新数
  3. 分析:
    1.把整数上的每一位都添加到数组里
    2.创建加密方法
    3.创建解密方法
  4. 解密规则:
    1.先得到每位数,然后每位数都先反转,得到x
    2.如果反转后的密文x∈[0,4],则x=x+10;如果x∈[6,9],那么x=x
    3.将进一步解密的密文x再都减去5,即可得到明文。
  5. 分析:
    由于密文为(0,10)之间的数字,则加5后的数字应该为[6,14],那么[6,9]之间的数字%10后应该为其本身[6,9],而[10,14]之间的数字%10后应该为[0,4]

6. 存在问题:如果输入为12345,加密反转后应该为09876,但是0消失了(尚未解决,如哪位大佬有解决方案,欢迎评论区解答)

import java.util.Scanner;

public class FDemo {
    public static void main(String[] args) {
        /*
         * 数字加密和解密
         * 需求:某系统的数字密码(大于0),比如1983,采用加密方式进行传输.密文为8346
         * 加密规则:
         *      1.先得到每位数,然后每位数都加上5
         *      2.再对10求余,最后将所有数字反转,得到一串新数
         * 分析:
         *      1.把整数上的每一位都添加到数组里
         *      2.创建加密方法
         *      3.创建解密方法
         * 解密规则:
         *      1.先得到每位数,然后每位数都先反转,得到x
         *      2.如果反转后的密文x∈[0,4],则x=x+10;如果x∈[6,9],那么x=x
         *      3.将进一步解密的密文x再都减去5,即可得到明文。
         * 分析:
         *      由于密文为(0,10)之间的数字,则加5后的数字应该为[6,14],那么[6,9]之间的数字%10后应该为其本身[6,9],
         *      而[10,14]之间的数字%10后应该为[0,4]
         *
         * 存在问题:如果输入为12345,加密反转后应该为09876,但是0消失了(尚未解决,如哪位大佬有解决方案,欢迎评论区解答)
         * */
        //1.从键盘输入明文
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入需要加密的数字密码(大于0):");
        int number = sc.nextInt();
        //2.调用方法:将明文传参后得到明文数字数组
        int[] numberCArr = getArr(number);
        //3.调用方法:将明文数组传参后得到密文
        int CipherText = getCipherText(numberCArr);
        //打印密文
        System.out.println("该密码的密文为:" +CipherText);
        //1.将得到的密文传参后得到密文数字数组
        int[] numberPArr = getArr(CipherText);
        //2.将密文数组传参后得到明文
        int PlainText = getPlainText(numberPArr);
        //打印明文
        System.out.println("该密码的明文为:" + PlainText);
    }

    //1.将实参提供的数字拆解并放入数组当中
    public static int[] getArr(int number){
        //1.计算出数组的长度
        //定义一个变量临时记录number的值,以方便后续再次使用
        int temp = number;
        //定义一个变量进行统计长度
        int count = 0;
        while(number != 0){
            //每循环一次就去掉一个右边的数字
            number = number / 10;
            //去掉一位数后计数器自增一次
            count++;
        }
        //2.定义数组
        //动态初始化
        int[] arr = new int[count];
        //3.把整数上的每一位都添加到数组中
        int index = count-1;
        while(temp != 0){
            //获取temp里面的每一位数
            int ge = temp % 10;
            //再去掉右边的那位数字
            temp = temp / 10;
            //把当前获取到的数字添加到数字中
            arr[index] = ge;
            index--;
        }
        return arr;
    }

    //2.创建加密方法:
    // 将数组中的数字进行加密,并返回加密后的数字
    //每位数都加上5,再对10求余,最后将所有数字反转
    public static int getCipherText(int[] arr){
        //1.加密
        for (int i = 0; i < arr.length; i++) {
            //每位数加上5
            arr[i] = arr[i] + 5;
            //再对10求余
            arr[i] = arr[i] % 10;
//            System.out.print(arr[i]+" ");
        }
        //2.将所有数字反转
        //创建两个指针i,j,分别指向数组的两端,同时向中间前近
        for (int i = 0,j = arr.length - 1; i < j; i++,j--) {
            int temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
        }
        //3.将反转后的数字整合
        int sum = 0;
        for (int i = 0; i < arr.length; i++) {
            sum = sum * 10 + arr[i];
        }
//        System.out.println(sum);
        return sum;
    }

    //3.创建解密方法:
    public static int getPlainText(int[] arr){
        //1.将所有数字反转
        //创建两个指针i,j,分别指向数组的两端,同时向中间前近
        for (int i = 0,j = arr.length - 1; i < j; i++,j--) {
            int temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
        }
        //2.进一步解密
        for (int i = 0; i < arr.length; i++) {
            //如果反转后的密文x∈[0,4],则x=x+10;如果x∈[6,9],那么x=x
            if(arr[i] >= 0 && arr[i] <= 4){
                arr[i] = arr[i] + 10;
            }
            //将密文x再都减去5
            arr[i] = arr[i] - 5;
//            System.out.print(arr[i]+" ");
        }

        //将反转后的数字整合
        int sum = 0;
        for (int i = 0; i < arr.length; i++) {
            sum = sum * 10 + arr[i];
        }
//        System.out.println(sum);
        return sum;
    }
}
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值