一、算法原理概述
参考自老师的PPT
加密过程


初始置换IP

迭代T

Feistel轮函数

子秘钥生成

逆置换IP-1

解密过程

二、总体结构
1 | class DES{ |
三、模块分解
PKCS5填充处理明文
1 | public StringBuffer dealText(final StringBuffer origin) { |
字符串转二进制
1 | public StringBuffer string2Binary(final StringBuffer origin) { |
IP置换
1 | public void IP(final String plaintextBinary) { |
Feistel轮函数
1 | public StringBuffer feistel(final StringBuffer R, final StringBuffer subKey ) { |
子密钥生成
1 | //子秘钥生成 |
十六次迭代
1 | //迭代T |
四、数据结构
StringBuffer plaintext 明文字符串
理论上明文字符串长度可以任意,加密时八个字符(字节)一组,也就是64bit,不够8个字节一组使用
PKCS#5标准填充假设待加密数据长度为x,那么将会在后面padding的字节数目为8-(x%8),每个
padding的字节值是8-(x%8)。特别地,当待加密数据长度x恰好是8的整数倍,也是要在后面多增加8个字节,每个字节是0x08。
StringBuffer ciphertext 密文字符串
密文字符串只能是8字节的整数倍,因为它是通过明文加密得到的,如果不是8的整数倍也就不存在明文了
StringBuffer key 密钥
这里的密钥是用字符串表示,不是十六进制!!!
StringBuffer ciphertextHex 密文的十六进制表示int group 分组数(DES以64bit为一个分组,所以需要根据每组来加密相应的明文)int encrypt_decrypt 算法模式:0表示加密,其余表示解密
int[] IP IP置换表int[] IPReverse IP逆置换表
int[] E E扩展表int[] P P置换int[] PC1 PC1置换int[] PC2 PC2压缩置换int[][] SBox 8个S-Box
五、运行结果
运行说明:
主函数分为两个部分:加密和解密
加密部分输入明文,密钥和算法模式(0表示加密,其余表示解密),输出密文
解密部分输入密文(这里直接用上面生成的密文,好对比结果),密钥(与上面同样的密钥),算法模式,应该输出同样的明文

可以看到确实能够实现加密再解密得到原数据!
六、源代码
1 |
|
七、参考资料
DES加密算法详解
DES算法实现