安全系列之——手写 JAVA 加密、解密
软件的加密与解密是一个迷人的研究领域,它几乎可以与任意一种计算机技术紧密结合——密码学、程序设计语言、操作系统、数据结构。而由于这样或者那样的原因,对于这一领域的关注程度一直还处于低温状态。
网络安全一般需要注意以下几个关键点:
完整性(Integrity):确保信息在传输过程中,没有被篡改。
私密性(Confidentiality):也就是通过加密,确保只有可信的实体可以看到这些信息。
源认证(Authenticity):确保是可信的源发送了这些信息,而不是伪装源发送的消息。
不可否认性(Nonrepudiation):不能事后否认发送过这条信息。
今天我们说的是数据传输的私密性。加密技术是最常用的安全保密手段,利用技术手段把重要的数据变为乱码(加密)传送,到达目的地后再用相同或不同的手段还原(解密)。
加密技术包括两个元素:算法和密钥。
一、使用异或加密解密
先来看一个简单的加密解密的实例。
这里自定义了一个加解密方法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进行加密的示例代码:
上面代码运行的结果:
DES是一种分组数据加密技术(先将数据分成固定长度的小数据块,之后进行加密),速度较快,适用于大量数据加密,比如文件加密。文件加密的代码,可以关注我的公众号,输入关键字“java-summary”获取。
1997 年RSA数据安全公司发起了一项“DES 挑战赛”的活动,志愿者四次分别用四个月、41天、56个小时和22个小时破解了其用56bit DES算法加密的密文。即DES加密算法在计算机速度提升后的今天被认为是不安全的。所以针对保密级别特别高的数据推荐使用非对称加密算法。
3.2 AES
AES (Advanced Encryption Standard),高级加密标准,是一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。
DES使用56位密钥,比较容易被破解,而AES可以使用128、192、和256位密钥,并且用128位分组加密和解密数据,相对来说安全很多。完善的加密算法在理论上是无法破解的,除非使用穷尽法。使用穷尽法破解密钥长度在128位以上的加密数据是不现实的,仅存在理论上的可能性。统计显示,即使使用目前世界上运算速度最快的计算机,穷尽128位密钥也要花上几十亿年的时间,更不用说去破解采用256位密钥长度的AES算法了。
下面是AES的源码展示:
上面代码运行的结果:
相较于DES而言,AES算法有着更高的速度和资源使用效率,安全级别也较之更高了,被称为下一代加密标准。目前世界上还有组织在研究如何攻破AES这堵坚厚的墙,但是因为破解时间太长,AES得到保障,但是所用的时间不断缩小。随着计算机计算速度的增快,新算法的出现,AES遭到的攻击只会越来越猛烈,不会停止的。
AES现在广泛用于金融财务、在线交易、无线通信、数字存储等领域,经受了最严格的考验,但说不定哪天就会步DES的后尘。
3.3 对称加密的特点
优点:
速度快。相对于非对称加密,对称加密的性能更好,加解密速度更快。
安全。只能说相对还是安全的。
紧凑。加密后内容的长度基本变化不大。
缺点:
如果双方通讯时,通过明文传输共享密钥,容易出现中途劫持和窃听的问题。
随着通讯的参与者数量的增加,密钥数量急剧膨胀((n×(n-1))/2)。
因为密钥数量过多,对密钥的管理和存储是一个很大的问题(后面我会专门开一期说秘钥管理及系统设计)。
不支持数字签名和不可否认性。
四、非对称加密
对于非对称算法,双方通讯之前,都需要事先生成一对密匙(公钥、私钥),然后双方交换公钥。通常非对称加密使用的就是RAS算法。
在使用非对称密钥技术之前,所有参与者,不管是用户还是路由器等网络设备,都需要预先使用非对称密钥算法(例如RSA)产生一对密钥,其中包括一个公钥和一个私钥。公钥可以放在一个服务器上共享给属于这个密钥系统的所有用户与设备,而私钥需要由持有者严格保护,确保只有持有者才能唯一拥有。
非对称加密有很多优点,安全、公钥可以网络传输等。但是加密速度很慢,不会用来加密上KB的数据。
关于RAS算法,可以说的内容太多太多,比如RSR的数学原理、公钥加密私钥解密、私钥签名公钥验签、公私钥生成、大文件如何加密、秘钥如何管理等问题。这些我都会在这个安全系列的其他文章中详细说明的。这一期以代码展示为主,就不过多在这里说了。
4.1 RSA
这里需要注意的是,加密使用的是对方的公钥,解密使用的是对应的私钥。
代码运行的结果:
加密解密使用的秘钥和签名验签的秘钥使用不一样,参考这个系列的其他文章。
4.2 非对称加密的特点
工作特点:
用一个密钥(公钥)加密的数据,只能用另一个密钥(私钥)来解密。
一个密钥(私钥)用来签名,一个密钥(公钥)用来验签。
优点:
由于不必担心交换的公钥被劫持,所以非对称密钥的分发更安全。
密钥数目和参与者数目相同。
在交换公钥之前,不需要预先建立某种信任关系。
支持数字签名和不可否认性。
缺点:
加密速度很慢。要不用来加密上KB的数据,可以用来加密key,key的数据量较小。
加密后,密文会变长。
关注公众号,输入“java-summary”即可获得源码。
完成,收工!
【传播知识,共享价值】,感谢小伙伴们的关注和支持,我是【诸葛小猿】,一个彷徨中奋斗的互联网民工!!!
版权声明: 本文为 InfoQ 作者【诸葛小猿】的原创文章。
原文链接:【http://xie.infoq.cn/article/53ef8e6840fa58ad08a68148c】。文章转载请联系作者。
评论