在数据传输中,为了网络安全,数字的加密极为重要,以下将说明Java是如何将四位数字密码进行加密和解密的过程!
本例题如下:
1.对数字的加密:
需要对数字加密,具体思路就是将数据先进行加五操作,然后进行对十取余,最后在进行逆置操作。首先就得输入数字,比如输入一个整形的四位数字,如果当靠一个四位数字可能操作会受限,所以为了对数字有一个更好的操作,所以我们需要将四位数字的每一位都放进一个数组里面,方面处理!需定义一个打包方法,将四位数字打包为一个数字!
public static int[] pack(int result) {
int arr[] = new int[4];
// arr[0] = result / 1000 % 10;
// arr[1] = result / 100 % 10;
// arr[2] = result / 10 % 10;
// arr[3] = result % 10;
// 由以上规律不难推到下面的批量操作!
for (int i = 0; i < arr.length; i++) {
arr[i] = result%10;
result /= 10;
}
return arr;
}
接着便可以对其进行进一步的操作,按照需求,需要将其数字每一位都进行加五以及对十取余的操作,最后在进行数字的逆置,便完成对数字的解密工作。于是定义了如下方法,专门对其进行加密操作:
public static String lock(int[] arr) {
String result = "";
//以下为加五操作以及对十取余操作
for (int i = 0; i < arr.length; i++) {
arr[i] += 5;
arr[i] %= 10;
}
//以下为数组逆置操作
for (int i = 0,j=arr.length-1; i < j; i++,j--) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
//以下为将数组重新拼接为字符串,在主函数中会将其转为整形!
for (int i = 0; i < arr.length; i++) {
result += arr[i];
}
return result;
}
注意:此时result返回的是字符串类型,可以通过调用类方法:
Integer.parseInt();//可以将字符串转换为整形!
将字符串转换为整形还有许多方法,可以参考其他博主的博客!
完成以上步骤之后便完成了对数字的加密工作,那么如何将其进行解密呢?也是本案例中最为复杂的地方。
2.对数字的解密:
同样需要将传入的整形类型打包为数组类型方便操作,方法同上。而后就是要将刚刚的加密操作反过来操作,那么问题来了,对十取余的逆运算是什么呢?
在上课的时候也没有听说过还有对十取余的逆运算,那么如何解决呢?
其实对于这道题是比较简单的,可以通过找规律的方法!
依据规则,而且在数组当中,因为存的数据为原始数据的每一位数,所以不可能超过十,那么进行加五之后,取余之前的范围就为:
5,6,7,8,9,10,11,12,13,14(5~14)
用以上的数据取余之后便可得到以下:
5,6,7,8,9,0,1,2,3,4
由上面的规律便可知道,当其数据在(59)的范围内,对十取余之后不变,当数据在(1014)范围内时,数据只取各位的数字。于是你便可以定义如下的方法对其进行解码操作!
public static String solve(int[] arr) {
String result = "";
//以下为对数据进行逆置操作
for (int i = 0,j=arr.length-1; i < j; i++,j--) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
for (int i = 0; i < arr.length; i++) {
//若在5~9范围内,则对其数据进行保留,然后进行减五操作,得到原数据。
if(arr[i]>4 && arr[i]<10){
arr[i] -= 5;
}
//若数据在0~4范围内(也就是取余之后范围在10~14的数据),
//则对其先进行加十操作,然后再进行减五操作。
else{
arr[i] += 10;
arr[i] -= 5;
}
}
//最后对其进行拼接操作!
for (int i = 0; i < arr.length; i++) {
result += arr[i];
}
return result;
}
完成以上操作便可以实现对数据的加密与解密啦!以下为完整代码!
package com.wxy.demo1;
import java.util.Scanner;
public class 数字加密 {
static Scanner sc = new Scanner(System.in);
public static void main(String[] args) {
int arr[] = new int[4];
System.out.println("请输入四位数!");
int result = sc.nextInt();
//此处为检测是否输入的数据为四位数,否则就一直重试!
while (result / 10000 != 0) {
System.out.println("您的输入非法!请重新输入一个四位数数字!");
result = sc.nextInt();
}
arr = pack(result);
System.out.println("请选择你的模式");
int i = 0;
System.out.println("输入1为加密,输入2为解密");
i = sc.nextInt();
switch (i) {
case 1 -> result = Integer.parseInt(lock(arr));
case 2 -> result = Integer.parseInt(solve(arr));
}
System.out.println(result);
}
public static int[] pack(int result) {
int arr[] = new int[4];
// arr[0] = result / 1000 % 10;
// arr[1] = result / 100 % 10;
// arr[2] = result / 10 % 10;
// arr[3] = result % 10;
for (int i = 0; i < arr.length; i++) {
arr[i] = result%10;
result /= 10;
}
return arr;
}
public static String lock(int[] arr) {
String result = "";
for (int i = 0; i < arr.length; i++) {
arr[i] += 5;
arr[i] %= 10;
}
for (int i = 0,j=arr.length-1; i < j; i++,j--) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
for (int i = 0; i < arr.length; i++) {
result += arr[i];
}
return result;
}
public static String solve(int[] arr) {
String result = "";
for (int i = 0,j=arr.length-1; i < j; i++,j--) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
for (int i = 0; i < arr.length; i++) {
if(arr[i]>5 && arr[i]<10){
arr[i] -= 5;
}
else{
arr[i] += 10;
arr[i] -= 5;
}
}//因为取余之后的范围为5,14.所以可以采用规律法。
for (int i = 0; i < arr.length; i++) {
result += arr[i];
}
return result;
}
}
版权归原作者 沙糖桔45 所有, 如有侵权,请联系我们删除。