Java密码学原型算法实现——第二部分:单钥加密算法

本文详细介绍了单钥密码体制,包括流密码和分组密码的工作原理,重点阐述了Bouncy Castle库在Java中实现单钥加密算法的过程。文章提到了常用的RC4流密码和AES分组密码,并讨论了各种工作模式,如ECB、CBC、CFB和OFB。同时,强调了单钥加密体制中加密模式选择、密钥安全性和补位策略的重要性。
摘要由CSDN通过智能技术生成

题注

本部分为单钥加密算法的实现。单钥加密体制是密码学加密中的核心密码学原型之一,很早很早前人类就已经开始了单钥密码学体制的研究。本部分的所有实现基于Bouncy Castle库,其地址详见我上一篇博客《Java密码学原型算法实现——第一部分:标准Hash算法》。

不得不说,相比Java JDK的API,Bouncy Castle提供的库函数封装更为科学,实现更为方便。实际上,Bouncy Castle根据单钥体制的不同算法以及不同工作模式进行了不同的封装,只要实现了一种模式或者一种加密算法,就能够简单地修改源代码而实现不同算法之间的转换。因此,我们不得不佩服Bouncy Castle的实现者们!在此,我强烈建议有兴趣的研究者阅读一下Bouncy Castle的源代码,一定会受益匪浅。当然了,在阅读之前需要熟悉Java的一些基本封装机制,我个人认为先学习下Java JDK源代码中的Inputstream及其相关类会对理解Bouncy Castle有很大的帮助。

本章理论说明的插图来自HappyHippy的博客,其博客地址为http://www.cnblogs.com/happyhippy/archive/2006/12/23/601353.html。我个人其实找了很多已经画好的加密流程图,感觉HappyHippy的流程图是最清楚,最详尽的,在此表示感谢。同时,为尊重作者的网络资源,特给出引用地址。

作者:Silent Void
出处:http://happyhippy.cnblogs.com/

另外,需要吐槽几点:

(1)网上很多有关Bouncy Castle单钥体制的实现并不充分。实际上,单钥加密体制远非加密算法的调用那么简单,其实还涉及到分组补位、格式化输出、加密工作模式选择等等问题。本文尽力解决上面提到的所有问题,给大家提供一个比较好的通用使用方法。

(2)本文只实现了单钥体制中最为流行的两个算法:流加密中的RC4算法以及分组加密中的AES算法。DES算法的密钥长度是56位,现在已不能认为其是安全的加密算法。Triple-DES同理,而且Triple-DES虽然密钥长度是DES的三倍,但是其安全性只是DES的二倍,现在也不能认为是一个安全的单钥加密算法。甚至,现在已经不推荐使用128bit密钥长度的AES加密算法实现加密。Bouncy Castle中完全实现了现有的全部单钥加密体制,但是我这里指给出AES加密算法的实现。如果大家需要用其他的算法,只需要做很小的改动即可实现,不过具体的改动位置还请大家自行研究。我可以明确告知,只需要改1-2行代码即可。

单钥密码体制

单钥密码体制简介

单钥加密体制也成为私钥加密体制(Secret Key Cryptosystem),这实际上是与1976年以后出现的公钥加密体制(Public Key Cryptosystem)加以区分。由于通信双方采用的密钥相同,所以人们也通常称其为对称加密体制(Symmetric Cryptosystem)。一般来说,单钥加密体制和双钥加密体制是一对词语,私钥加密体制和公钥加密体制是一对词语,而对称加密体制和非对称加密体制是一对词语,大家进行介绍或者撰写说明文档时候需要特别注意一下词语的对应问题。

对于单钥加密体制来说,可以按照其加密运算的特点,将其分为流密码(Stream Cipher)和分组密码(Block Cipher)。根据其工作模式的分类,又可以分为5类:电码本模式(ECB Mode),密码分组链接模式(CBC Mode),输出反馈模式(OFB Mode),密码反馈模式(CFB Mode)和计数器模式(CTR Mode)。由于安全性的考虑,一般我们只使用ECB,CBC或者OFB模式。不过,对于学习单钥密码体制,尤其是深入加密盒内部的工作原理,一般以ECB模式进行介绍。

1883年,Kerchoffs列举了一个设计密码要求必备的条件表。结合香农对密码体制的语义描述和Kerchoffs原理,可以对好的密码体制做如下总结:

  • 加密算法和解密算法不包含密码的成分或设计部分。这句话说白了就是密码学算法应该是完全公开的,密文是否安全只取决于密钥的安全性,而与算法的公开与否无关。当然了,不公开的加密算法从实际操作中会增加密码的安全性。举例来说,在移动通信网络中的A5和A8算法就是不公开的加密算法。不过这也情有可原:本来手机刚出来时能存储的密钥长度就不长,加密算法又不能太复杂,所以设计的加密算法相对来说安全性也不会非常高… 据称,如果公开了A5和A8算法,那么大家的手机通信就危险啦~
  • 加密算法将有意义的消息相当均匀地分布在整个密文消息空间中;甚至可以由加密算法的某些随机的内部运算来获得随机的分布。这也就是说,加密算法的输出应该非常的随机,甚至可以作为一个随机数产生器。
  • 使用正确的密钥,加密算法和解密算法是实际有效的。这句话是说,如果拥有正确的私钥,那么解密算法可以正确地恢复出加密算法加密的明文。
  • 不使用正确的密钥,要由密文恢复出相应的明文是一个由密钥参数的大小唯一确定的困难问题。这句话即要求加密算法的安全性。

当然了,密码体制具有以上这些性质对于现代密码体制的应用来说已经不够了。现代密码学对于密码体制提出了更高的要求,如:选择明文安全性(Chosen-Plaintext Security),选择密文安全性(Chosen-Ciphertext Security)等等。有兴趣的朋友可以听一听Stanford大学Dan Boneh教授的公开课《Cryptography I》,会对单钥密码体制的安全性有更为深刻的理解。

流密码

流密码是密码体制中的一个重要体制,也是手工和机械密码时代的主流。20世纪50年代,由于数字电子技术的发展,使密钥流可以方便地利用以移位寄存器为基础的电路来产生,这促使线性和非线性移位寄存器理论迅速发展,加上有效的数学工具,使得流密码理论迅速发展和走向成熟。流密码本身也具有很多很优秀的性质,如计算简单、无错误传播等特点,这使得流密码在实际应用中,特别是在专用和机密机构中仍保持优势。实际上,在卫星通信等领域,流密码的使用依然是主流。

流密码是将明文划分成比特字符,字符分别与密钥流进行加密,解密时以同步产生同样的密钥流进行解密。其基本框图如下:

当然了,这图上有个小问题,密钥K的长度不能够太短… 不是因为好记而已,而是需要达到一定的长度来保证加密的安全性。如果真的想好记的话,可以通过第一部分介绍的标准Hash函数,将任意的子串Hash为密钥需要的长度。这样,在解密时先使用Hash将子串变为密钥后再进行运算。然而,这样的运算会降低加密的安全性(加密的安全性将变为min(单钥加密安全性, Hash抗碰撞安全性))。

分组密码

分组密码区别与流密码,是将明文消息编码表示后的子串划分等长的组,各组分别在各子密钥的控制下变成等长的输出序列,举例来说,AES分组加密算法的流程如下图所示:

分组密码是现在密码学研究的主流,因为其加密时可对明文和密文进行充分的混合,因此一般来说其安全性要比流密码高。当然了,现在的系统一般用分组密码产生密钥流,然后用密钥流和明文进行流加密,这就结合分组密码和流密码两种密码体制的优势。当然了,结合的结果是计算量会增加。

128位分组的AES分组密码的分组方法如图所示:


分组密码比较麻烦的地方在于补位。因为加密时,明文不一定是分组长度的整数倍,因此对于不够的地方需要一定的补位措施,而这种补位措施是需要公开的(否则补位方法也将成为密钥的一部分,这无疑增加了密钥的长度)。一般来说,填充方法如下。当明文不够分组长度的整数倍时:

当明文长度恰好为分组长度的整数倍时:

因此,实际上设计分组加密算法时,最后一个分组一般来说是攻击的突破口。举例来说,当明文的长度是分组长度的整数倍时,我们可以知道密文的最后一个分组所对应的明文就是0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF。因此,这就需要单钥加密体制有更高的安全性,即选择密文安全和选择明文安全。

单钥密码体制的工

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值