软件的加密与解密是一个迷人的研究领域,它几乎可以与任意一种计算机技术紧密结合——密码学、程序设计语言、操作系统、数据结构。而由于这样或者那样的原因,对于这一领域的关注程度一直还处于低温状态。
网络安全一般需要注意以下几个关键点:
完整性(Integrity):确保信息在传输过程中,没有被篡改。* 私密性(Confidentiality):也就是通过加密,确保只有可信的实体可以看到这些信息。* 源认证(Authenticity):确保是可信的源发送了这些信息,而不是伪装源发送的消息。* 不可否认性(Nonrepudiation):不能事后否认发送过这条信息。今天我们说的是数据传输的私密性。加密技术是最常用的安全保密手段,利用技术手段把重要的数据变为乱码(加密)传送,到达目的地后再用相同或不同的手段还原(解密)。
加密技术包括两个元素:算法和密钥。
一、使用异或加密解密
先来看一个简单的加密解密的实例。
package com.wuxiaolong.EncrypteDecrypt;
import org.apache.commons.codec.digest.DigestUtils;
/**
* Description:
*
* @author 诸葛小猿
* @date 2020-07-22
*/
public class Test1 {public static void main(String[] args) {String content = "我爱你";Integer key = 1000;// 用户A发消息前,通过某种方式加密String encryptStr = xor(content,key);System.out.println(encryptStr);// 密文通过网络传输// 用户B收到密文后使用相同的方式解密String decryptStr = xor(encryptStr,key);System.out.println(decryptStr);}/** * 加密算法及秘钥 * @param content * @return */public static Stringxor(String content, Integer key){char[] chars = content.toCharArray();for(int i=0; i<chars.length; i++){chars[i] = (char)(chars[i]^key) ;}return new String(chars);}
}
这里自定义了一个加解密方法xor,这个方法接收两个参数,一个是原文content,一个秘钥key。这样有加密算法,有秘钥,就可以加密了。
运行的结果:
懹燙䲈// 加密结果
我爱你// 解密结果
二、异或加密解密原理讲解
在发消息前,需要使用算法+秘钥对传输的消息(明文)进行加密,加密后使用密文在网络传输,传输到目的地时,再使用相同的算法+秘钥将密文翻译成明文。
在这个加密和解密的过程中,使用了相同的算法+秘钥。
这里可以看出,一个明文连续使用相同的算法+秘钥做两次加密,就可以得到原来的明文了。
这和计算机中的异或运算(^)很像,异或英文为exclusive OR,缩写成xor,异或运行有两个特点:
两个二进制数字相同为0,不同为1。* 一个数字两次异或后,得到的是原数字本身。下面使用一个字符a为例,和数字三进行两次异或运算,可以看出最终得到的结果还是a。
由于是位运算,参与运算的参数必须要转化成二进制后才能参与运算。上面的算法public static String xor(String content, Integer key)中,首先要将content转化成一个字符数组,然后将数组的每一个字符,和整形的key做异或运算得到新的字符,最终,将新的字符数组转化成新的字符串。
为什么不能使用content字符串直接与key求异或运算?因为字符串不能直接与数字运算,但是字符可以与数字运算,所以字符串转换成字符数组。
下面介绍的加密解密方法的底层,使用的都是二进制,所以加密解密的参数最终都会转换成二进制字节数组的形式进行处理。
上面这种方法中,加密和解密使用的是相同的密钥key,我们通常将这种方式称为对称加密。如果加密和解密使用的是不同的秘钥,则称之为非对称加密。
三、对称加密
对于对称性加密,双方通讯之前,都要事先知道相同的密匙和算法,之后便是对数据进行加解密了。
这里介绍几种常见的对称加密算法:DES,AES。
3.1 DES
DES(Data Encryption Standard) 算法是美国政府机关为了保护信息处理中的计算机数据而使用的一种加密方式,是一种常规密码体制的密码算法,目前已广泛使用。该算法输入的是64比特的明文,在64比特密钥的控制下产生64比特的密文;反之输入64比特的密文,输出64比特的明文。64比特 的密钥中含有8个比特的奇偶校验位,所以实际有效密钥长度为56比特。使用一个 56 位的密钥以及附加的 8 位奇偶校验位,产生最大 64 位的分组大小。这是一个迭代的分组密码,使用称为 Feistel 的技术,其中将加密的文本块分成两半。使用子密钥对其中一半应用循环功能,然后将输出与另一半进行"异或"运算;接着交换这两半,这一过程会继续下去,但最后一个循环不交换。DES 使用 16 个循环,使用异或,置换,代换,移位操作四种基本运算。
下面是使用JDK进行加密的示例代码:
package com.wuxiaolong.EncrypteDecr