解密的有趣数字

1,183 阅读4分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第21天,点击查看活动详情

现有一串数字,按照一定规则对数字进行加密,得到加密后的数字,求原数字。(解密过程)

加密规则:首先把第一个数删除,接着把第二个数放到数字末尾,继续删除第三个数,把第四个数放到末尾,再把第五个.....按照删除的顺序把数字连起来就是我们要找的了。

测试:

输入:631758924

输出:615947283

image.png

其实这个解密过程就像是“排队”,每次拿最前面两个,第一个丢掉,第二个放到尾部,那么编程如何实现呢?

首先,我们需要考虑数据的存储,这里我们用数组存储,并且对数组进行初始化。比如我们声明 int[] num=new int[101]; 你可能会奇怪,为什么明明9个数字,要很多个个空间存储呢?因为我们后面倍数还有添加,我们之间在一个数组完成

怎么删除第一个数?最简单方式就是数组每一个数都往前移动一位,把前面的覆盖。这里我们引入两个整形变量head,tail,head记录队首,即第一位,tail用来记录队尾下一个位置. 为什么还会是队尾下一个而不是队尾呢?这是因为当队列中只剩下一个元素时候,队首和队尾重合会带来一些麻烦,所以我们这里规定队首和队尾重合时候,队列为空。

此时head和tail之间的数就是有效数,如果删除一个数,head++就可以,新增一个元素,直接把元素放到队尾,然后tail++就可以了。

image.png

那如何书写代码:


 public static void main(String[] args) {
       Scanner reader = new Scanner(System.in);
          int n = reader.nextInt();
         int a[] = new int[102];
          int head=0;
         int tail=n;
         for(int i=0;i<n;i++){
             a[i]=reader.nextInt();
        }
        
         while(tail>head){
         //删除队首数字
            System.out.printf("%d ", a[head]);
            head++;

            //将数字移动到队尾
             a[tail]=a[head];
             tail++;
             //再将队首出队
             head++;
             }
    }

这里我们可以对队列元素做封装:

image.png

那么java里面是靠什么加密解密的呢?

1.base64

Base64 编码是我们程序开发中经常使用到的编码方法,它用 64 个可打印字符来表示二进制数据。这 64 个字符是: 小写字母 a-z、大写字母 A-Z、数字 0-9、符号"+"、"/",其他所有符号都转换成这个字符集中的字符。Base64 编码通常用作存储、传输一些二进制数据编码方法,所以说它本质上是一种将二进制数据转成文本数据的方案。

通常用作对二进制数据进行加密

加密: 输入byte数组,返回:(new BASE64Encoder()).encode(数组)

解密:输入字符串,返回:(new BASE64Decoder()).decodeBuffer(字符串)

2.MD5

MD5 是将任意长度的数据字符串转化成短小的固定长度的值的单向操作,任意两个字符串不应有相同的散列值。因此 MD5 经常用于校验字符串或者文件.

MD5 主要用做数据一致性验证、数字签名和安全访问认证,而不是用作加密。比如说用户在某个网站注册账户时,输入的密码一般经过 MD5 编码,更安全的做法还会加一层盐(salt),这样密码就具有不可逆性。然后把编码后的密码存入数据库,下次登录的时候把密码 MD5 编码,然后和数据库中的作对比,这样就提升了用户账户的安全性。

是一种单向加密算法,只能加密不能解密

image.png

3.SHA

SHA全名叫做安全散列算法,是FIPS所认证的安全散列算法。能计算出一个数字消息所对应到的,长度固定的字符串(又称消息摘要)的算法。且若输入的消息不同,它们对应到不同字符串的机率很高。

数字签名等密码学应用中重要的工具,被广泛地应用于电子商务等信息安全领域

image.png

不全面,只是列举常用的