草庐IT

Java小案例----数字密码的加密与解密

沙糖桔45 2023-12-18 原文

在数据传输中,为了网络安全,数字的加密极为重要,以下将说明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

 由上面的规律便可知道,当其数据在(5~9)的范围内,对十取余之后不变,当数据在(10~14)范围内时,数据只取各位的数字。于是你便可以定义如下的方法对其进行解码操作!

 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;
    }
}

有关Java小案例----数字密码的加密与解密的更多相关文章

  1. java - 等价于 Java 中的 Ruby Hash - 2

    我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/

  2. ruby - 查找字符串中的内容类型(数字、日期、时间、字符串等) - 2

    我正在尝试解析一个CSV文件并使用SQL命令自动为其创建一个表。CSV中的第一行给出了列标题。但我需要推断每个列的类型。Ruby中是否有任何函数可以找到每个字段中内容的类型。例如,CSV行:"12012","Test","1233.22","12:21:22","10/10/2009"应该产生像这样的类型['integer','string','float','time','date']谢谢! 最佳答案 require'time'defto_something(str)if(num=Integer(str)rescueFloat(s

  3. java - 从 JRuby 调用 Java 类的问题 - 2

    我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www

  4. java - 我的模型类或其他类中应该有逻辑吗 - 2

    我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我

  5. java - 什么相当于 ruby​​ 的 rack 或 python 的 Java wsgi? - 2

    什么是ruby​​的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht

  6. 区块链之加解密算法&数字证书 - 2

    目录一.加解密算法数字签名对称加密DES(DataEncryptionStandard)3DES(TripleDES)AES(AdvancedEncryptionStandard)RSA加密法DSA(DigitalSignatureAlgorithm)ECC(EllipticCurvesCryptography)非对称加密签名与加密过程非对称加密的应用对称加密与非对称加密的结合二.数字证书图解一.加解密算法加密简单而言就是通过一种算法将明文信息转换成密文信息,信息的的接收方能够通过密钥对密文信息进行解密获得明文信息的过程。根据加解密的密钥是否相同,算法可以分为对称加密、非对称加密、对称加密和非

  7. Observability:从零开始创建 Java 微服务并监控它 (二) - 2

    这篇文章是继上一篇文章“Observability:从零开始创建Java微服务并监控它(一)”的续篇。在上一篇文章中,我们讲述了如何创建一个Javaweb应用,并使用Filebeat来收集应用所生成的日志。在今天的文章中,我来详述如何收集应用的指标,使用APM来监控应用并监督web服务的在线情况。源码可以在地址 https://github.com/liu-xiao-guo/java_observability 进行下载。摄入指标指标被视为可以随时更改的时间点值。当前请求的数量可以改变任何毫秒。你可能有1000个请求的峰值,然后一切都回到一个请求。这也意味着这些指标可能不准确,你还想提取最小/

  8. 【Java 面试合集】HashMap中为什么引入红黑树,而不是AVL树呢 - 2

    HashMap中为什么引入红黑树,而不是AVL树呢1.概述开始学习这个知识点之前我们需要知道,在JDK1.8以及之前,针对HashMap有什么不同。JDK1.7的时候,HashMap的底层实现是数组+链表JDK1.8的时候,HashMap的底层实现是数组+链表+红黑树我们要思考一个问题,为什么要从链表转为红黑树呢。首先先让我们了解下链表有什么不好???2.链表上述的截图其实就是链表的结构,我们来看下链表的增删改查的时间复杂度增:因为链表不是线性结构,所以每次添加的时候,只需要移动一个节点,所以可以理解为复杂度是N(1)删:算法时间复杂度跟增保持一致查:既然是非线性结构,所以查询某一个节点的时候

  9. 「Python|Selenium|场景案例」如何定位iframe中的元素? - 2

    本文主要介绍在使用Selenium进行自动化测试或者任务时,对于使用了iframe的页面,如何定位iframe中的元素文章目录场景描述解决方案具体代码场景描述当我们在使用Selenium进行自动化测试的时候,可能会遇到一些界面或者窗体是使用HTML的iframe标签进行承载的。对于iframe中的标签,如果直接查找是无法找到的,会抛出没有找到元素的异常。比如近在咫尺的例子就是,CSDN的登录窗体就是使用的iframe,大家可以尝试通过F12开发者模式查看到的tag_name,class_name,id或者xpath来定位中的页面元素,会抛出NoSuchElementException异常。解决

  10. ruby - Ruby 中的单 block AES 解密 - 2

    我需要尝试一些AES片段。我有一些密文c和一个keyk。密文已使用AES-CBC加密,并在前面加上IV。不存在填充,纯文本的长度是16的倍数。所以我这样做:aes=OpenSSL::Cipher::Cipher.new("AES-128-CCB")aes.decryptaes.key=kaes.iv=c[0..15]aes.update(c[16..63])+aes.final它工作得很好。现在我需要手动执行CBC模式,所以我需要单个block的“普通”AES解密。我正在尝试这个:aes=OpenSSL::Cipher::Cipher.new("AES-128-ECB")aes.dec

随机推荐