黑马程序员——数据加密问题的两种实现方式

------ Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

问题:某个公司采用公用电话传递数据信息,数据是小于8位的整数,为了确保安全,在传递过程中需要加密,加密规则如下:

 首先将数据倒序,然后将每位数字都加上5,再用和除以10的余数代替该数字, 最后将第一位和最后一位数字交换。 请任意给定一个小于8位的整数, 然后,把加密后的结果在控制台打印出来。

分析:本题的难点是如何把键盘录入的数据转化为int类型的数组类进行处理,以下提供了两种解决方案:分别是接收String类型的数据和接收int类型的数据。

实现:

import java.util.Scanner;

/*
 * 	某个公司采用公用电话传递数据信息,数据是小于8位的整数,为了确保安全,
 在传递过程中需要加密,加密规则如下:
 首先将数据倒序,然后将每位数字都加上5,再用和除以10的余数代替该数字,
 最后将第一位和最后一位数字交换。 请任意给定一个小于8位的整数,
 然后,把加密后的结果在控制台打印出来。
 分析:
 键盘录入数据
 写一个方法给数据加密
 首先键盘录入一个8位数并想办法存入一个int类型的数组中
 然后按要求对数组中的数操作
 输出加密后的数据
 */
public class Encrypt {

	public static void main(String[] args) {
		// 键盘录入一个8位数
		// 用什么类型的数据来接收呢,我们写两个方法一个接收的是int类型,另一个接收的是String类型
		Scanner sc = new Scanner(System.in);
		System.out.println("请录入一个不大于8位的整数:");
		String str = sc.nextLine();
		// 写一个接收String类型的加密方法
		String line2 = enctypt2(str);
		System.out.println(line2);
		System.out.println("------------------");
		
		System.out.println("请再次录入刚才的数据:");
		int num = sc.nextInt();
		// 写一个接收int类型数据的加密方法
		String line = enctypt(num);
		System.out.println(line);

	}

	private static String enctypt2(String str) {
		/*
		 * 刚才的难点是如何得到各位上的数并存储到数组中,以及index的使用 本题的难点是,如何把String类型的数据转换为int类型的数组
		 * 分析: 可以先得到char数组,遍历数组得到每个字符,并转化为String类型 然后再通过String类型转换为int类型存入另一个数组中
		 */
		char[] chs = str.toCharArray();
		// 定义一个与chs等长的int数组
		int[] is = new int[chs.length];
		// 遍历chs数组得到每个元素,先转化为String类型然后再转换为int类型,存入is中
		for (int x = 0; x < chs.length; x++) {
			is[x] = Integer.parseInt(String.valueOf(chs[x]));
		}
		// 至此,int数组创建完毕,且此时是正序,将数据倒序
		for (int start = 0, end = is.length-1; start < end; start++, end--) {
			int temp = is[start];
			is[start] = is[end];
			is[end] = temp;
		}
		// 将每位数字都加上5,再用和除以10的余数代替该数字
		for (int x = 0; x < is.length; x++) {
			is[x] += 5;
			is[x] %= 10;
		}
		// 将第一位和最后一位数字交换
		int temp = is[0];
		is[0] = is[is.length - 1];
		is[is.length - 1] = temp;
		// 用字符串拼接结果
		StringBuilder sb = new StringBuilder();
		for (int x = 0; x < is.length; x++) {
			sb.append(is[x]);
		}
		return sb.toString();
	}

	private static String enctypt(int num) {
		/*
		 * 分析: 如何把一个int类型的数据转换为一个int类型的数组 我们要得到的是各位上的数,可以使用%10取余的方式获取个位数,
		 * 然后除以10再次%10取余得到十位数 如此循环下去,直到除后的数不大于1
		 */
		// 首先定义一个int数组
		// 因为最大数是8位数,所以我们定义一个长度为8的数组,然后再定义一个最大索引index
		// 我们操作时,只操作到最大数组即可
		int arr[] = new int[8];
		// 得到各位上的数并赋值给int数组
		int index = 0;
		while (num >= 1) {
			arr[index] = num % 10;
			num /= 10;
			index++;
		}
		// 此时的index等于数组的实际已经被赋值的个数
		// 此时已经得到了int数组,且已经完成了倒序
		// 将每位数字都加上5,再用和除以10的余数代替该数字

		// for (int i : arr) {
		// i += 5; 这里的增强for为什么不能用呢???????
		// i %= 10;
		// }

		for (int x = 0; x < index; x++) {
			arr[x] += 5;
			arr[x] %= 10;
		}
		// 将第一位和最后一位数字交换
		int temp = arr[0];
		arr[0] = arr[index - 1];
		arr[index - 1] = temp;
		// 用字符串拼接结果
		StringBuilder sb = new StringBuilder();
		for (int x = 0; x < index; x++) {
			sb.append(arr[x]);
		}
		return sb.toString();
	}
}
容易出现的问题和难点:

A:键盘录入的问题,当只创建一个Scanner对象时,要先录入String类型,然后录入int类型。

B:字符串转int数组难点:is[x] = Integer.parseInt(String.valueOf(chs[x]));

C:int类型数据转int数组的难点,index的使用

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在MySQL数据库中,实现敏感数据加密和解密有多种方式: 1. 使用数据库函数:可以使用MySQL提供的函数,如AES_ENCRYPT和AES_DECRYPT进行加密和解密。这些函数可以通过指定密钥和明文数据来进行加密,同时也可以使用相同的密钥和密文数据来进行解密。 2. 使用存储过程和触发器:可以在数据库中创建存储过程和触发器来自动加密和解密敏感数据。例如,可以创建一个存储过程,在插入或更新数据时先进行加密,而在读取数据时进行解密。 3. 使用数据库代理或中间件:可以使用第三方的数据库代理或中间件,如Transparent Data Encryption (TDE)或数据库防火墙来加密和解密数据。这些工具会自动在数据传输过程中进行加密和解密操作,对应用程序透明。 4. 使用应用程序层加解密:可以在应用程序中实现数据加密和解密的逻辑。在将数据存储到数据库之前,先使用加密算法对数据进行加密,在读取数据时再进行解密。这种方式可以灵活控制加密算法和密钥。 无论采用哪种方式,都需要注意以下几点: - 密钥管理:确保密钥的安全性,比如使用专门的密钥管理工具来管理和保护密钥。 - 性能影响:加解密操作可能会影响数据库的性能,需要评估加解密操作对数据库性能的影响,并进行必要的优化和调整。 - 数据完整性:加密和解密操作可能会引入数据不一致的问题,需要保证数据加密和解密过程中的数据完整性。 总结而言,MySQL数据库对敏感数据加密和解密的实现方式有多种选择,可以根据实际情况选择最合适的方式

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一夸克

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值