数字的加密和解密
- 需求:某系统的数字密码(大于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]
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;
}
}