彻底告别加解密模块代码拷贝

javax.crypto.Cipher,翻译为密码,其实叫做密码器更加合适。Cipher是JCA(Java Cryptographic Extension,Java加密扩展)的核心,提供基于多种加解密算法的加解密功能。在不了解Cipher之前,我们在完成一些需要加解密的模块的时候总是需要到处拷贝代码,甚至有些错误的用法也被无数次拷贝,踩坑之后又要拷贝补坑的代码。为什么不尝试理解Cipher然后合理地使用呢?

Cipher初始化transformation(转换模式)的一些知识补充

转换模式transformation一般由三个部分组成,格式是:算法/工作模式/填充模式(algorithm/mode/padding)。例如:DES/CBC/PKCS5Padding。

算法

算法就是指具体加解密算法的名称英文字符串,例如"SHA-256"、"RSA"等,这里不对具体算法的实现原理做具体展开。

工作模式

工作模式其实主要是针对分组密码。分组密码是将明文消息编码表示后的数字(简称明文数字)序列,划分成长度为n的组(可看成长度为n的矢量),每组分别在密钥的控制下变换成等长的输出数字(简称密文数字)序列。工作模式的出现主要基于下面原因:

当需要加密的明文长度十分大(例如文件内容),由于硬件或者性能原因需要分组加密。

多次使用相同的密钥对多个分组加密,会引发许多安全问题。

从本质上讲,工作模式是一项增强密码算法或者使算法适应具体应用的技术,例如将分组密码应用于数据块组成的序列或者数据流。目前主要包括下面五种由NIST定义的工作模式:

模式 名称 描述 典型应用
电子密码本(ECB)   Electronic CodeBook   用相同的密钥分别对明文分组独立加密   单个数据的安全传输(例如一个加密密钥)  
密码分组链接(CBC)   Cipher Block Chaining   加密算法的输入是上一个密文组合下一个明文组的异或   面向分组的通用传输或者认证  
密文反馈(CFB)   Cipher FeedBack   一次处理s位,上一块密文作为加密算法的输入,产生的伪随机数输出与明文异或作为下一单元的密文   面向分组的通用传输或者认证  
输出反馈(OFB)   Output FeedBack   与CFB类似,只是加密算法的输入是上一次加密的输出,并且使用整个分组   噪声信道上的数据流的传输(如卫星通信)  
计数器(CTR)   Counter   每个明文分组都与一个经过加密的计数器相异或。对每个后续分组计数器递增   面向分组的通用传输或者用于高速需求  

上面五种工作模式可以用于3DES和AES在内的任何分组密码,至于选择哪一种工作模式需要结合实际情况分析。

填充模式

Padding指的是:块加密算法要求原文数据长度为固定块大小的整数倍,如果原文数据长度大于固定块大小,则需要在固定块填充数据直到整个块的数据是完整的。例如我们约定块的长度为128,但是需要加密的原文长度为129,那么需要分成两个加密块,第二个加密块需要填充127长度的数据,填充模式决定怎么填充数据。

对数据在加密时进行填充、解密时去除填充则是通信双方需要重点考虑的因素。对原文进行填充,主要基于以下原因:

首先,考虑安全性。由于对原始数据进行了填充,使原文能够“伪装”在填充后的数据中,使得攻击者很难找到真正的原文位置。

其次,由于块加密算法要求原文数据长度为固定块大小的整数倍,如果加密原文不满足这个条件,则需要在加密前填充原文数据至固定块大小的整数倍。

另外,填充也为发送方与接收方提供了一种标准的形式以约束加密原文的大小。只有加解密双方知道填充方式,才可知道如何准确移去填充的数据并进行解密。

常用的填充方式至少有5种,不同编程语言实现加解密时用到的填充多数来自于这些方式或它们的变种方式。以下五种填充模式摘抄自参考资料的论文:

1.填充数据为填充字节序列的长度

这种填充方式中,填充字符串由一个字节序列组成,每个字节填充该字节序列的长度。假定块长度为8,原文数据长度为9,则填充字节数 等于0x07;如果明文数据长度为8的整数倍,则填充字节数为0x08。填充字符串如下:

原文数据1: FF FF FF FF FF FF FF FF FF

填充后数据1:FF FF FF FF FF FF FF FF FF 07 07 07 07 07 07 07

==========================================================

原文数据2:FF FF FF FF FF FF FF FF

填充后数据2:FF FF FF FF FF FF FF FF 08 08 08 08 08 08 08 08

2.填充数据为0x80后加0x00

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/b5e4d8f6f0ddf4f7771d5bbfc73289c8.html