简书android des,Des

常用加密算法的Java实现总结

算法原理

DES算法把64位的明文输入块变为64位的密文输出块,它所使用的密钥也是64位,其算法主要分为两步:

(a) 初始置换

其功能是把输入的64位数据块按位重新组合,并把输出分为L0、R0两部分,每部分各长32位。

L0、R0则是换位输出后的两部分,L0是输出的左32位,R0是右32位。

其置换规则为将输入的第58位换到第一位,第50位换到第2位……依此类推,最后一位是原来的第7位。

例:设置换前的输入值为D1D2D3……D64,则经过初始置换后的结果为:L0=D58D50……D8;R0=D57D49……D7。

(b) 逆置换

经过16次迭代运算后,得到L16、R16,将此作为输入,进行逆置换,逆置换正好是初始置换的逆运算,由此即得到密文输出。

常用的填充方式

在Java进行DES、3DES和AES三种对称加密算法时,常采用的是NoPadding(不填充)、Zeros填充(0填充)、PKCS5Padding填充。

(a) ZerosPadding

全部填充为0的字节,结果如下:

F1 F2 F3 F4 F5 F6 F7 F8 //第一块

F9 00 00 00 00 00 00 00 //第二块

(b) PKCS5Padding

每个填充的字节都记录了填充的总字节数,结果如下:

F1 F2 F3 F4 F5 F6 F7 F8 //第一块

F9 07 07 07 07 07 07 07 //第二块

(c) PKCS7Padding

a50bbefe69ab?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

PKCS #7 填充字符串由一个字节序列组成,每个字节填充该填充字节序列的长度。假定块长度为 8,数据长度为 9,

数据:

FF FF FF FF FF FF FF FF

FF

PKCS7 填充:

FF FF FF FF FF FF FF FF

FF 07 07 07 07 07 07 07

如果要填充8个字节,那么填充的字节的值就是0×8;要填充7个字节,那么填入的值就是0×7;以此类推

01

02 02

03 03 03

04 04 04 04

05 05 05 05 05

etc.

假设block为8个字节,明文为64各字节,那么需要额外补8个0x08.

这样的好处是,根据最后一个byte的填充值即可知道填充字节数。

DES共有四种工作模式

ECB:电子密码本模式

CBC:加密分组链接模式

CFB:加密反馈模式

OFB:输出反馈模式

其他

关于PKCS5PADDING与PKCS7PADDING对齐方式的区别

近日使用C++写一DES加密算法和对方java写的接口做加解密的通信处理,碰到加密后的数据对方界面不了的问题,发现两边对齐方式不一致,对方使用PKCS5对齐,我这边使用了PKCS7做数据对齐。修改为PKCS5方式对齐后问题解决。

借此重新温习了一下两个对齐方式的处理过程。

以8个字节为一组,如果数据不足8位,则以8位做对齐,末尾填充缺少的字节数量。

比如有数据 FF FF,

缺少6个字节,则需要补充6个字节的06,达到8位长度

补充对齐后 FF FF 06 06 06 06 06 06

PKCS5 对齐 和 PKCS7 对齐的区别在于

PKCS7 末尾的值区间为 1,2,3,4,5,6,7 也就是最多补充7个字节

PKCS5 末尾的值区间为 1,2,3,4,5,6,7,8 也就是最多补充8个字节,

也就是PKCS5在数据长度刚好能为8整除时,后面继续补充8个字节的08,而此时PKCS7是不做字节补充的

想比较PKCS7而言PKCS5能更好的还原实际加密数据的长度,

比如有8字节长度数据 FF FF FF FF 04 04 04 04,

在PKCS7时是不做字节补充的,当解密完成后就不知道是否需要移除尾部的4个字节的04

而PKCS5时,则需要再补充8个字节的08,得到 FF FF FF FF 04 04 04 04 08 08 08 08 08 08 08 08 解密后可以正确还原得到 FF FF FF FF 04 04 04 04

疑问?

为什么需要填充?

因为加密算法的需求,明文字节必须按照block进行填充对齐,才能方便进行加密运算。

PKCS7Padding VS PKCS5Padding

区别很简单,PKCS5Padding的blocksize为8字节,而PKCS7Padding的blocksize可以为1到255字节**

链接

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值