the5fire的技术博客

关注python、vim、linux、web开发和互联网--life is short, we need python.


使用java实现真实数据DES加密(java源代码)

作者:the5fire | 标签:             | 发布:2010-11-23 11:30 p.m. | 阅读量: 7029, 7006
在前面那篇文章《使用DES实现真实数据加密的前奏(分析)》分析的基础上,用java实现了可以对字符串进行加密,不过遗留的问题是不能对字符串进行解密,因为在把加密后的字节型数组转为字符串之后再转回来就和原先的字节型数组不一样了,会少许多位,不知道这是为什么。莫非字节型数组和字符串不是一对一转换的吗?很迷惑

desReal

具体实现大家可以先看这个图,这里面主要添加了两个类,DESPre和DESControl。DESPre主要是实现了前一篇文章中说到的基本操作,比如byte数组转成二进制数组,等。DESControl主要是用来操作DES类(核心算法类)和DESPre(预处理类),可以算得上是一个流程控制类吧。

下面给出DESControl类的代码,其他代码我最后给出链接。


package mydes;


/**
* DES控制类,主要是封装DES核心和DES与处理类,留给前台良好借口
* @author 胡阳
* blog:http://www.the5fire.com
* 版权声明:转载请保留源码完整信息
*/
public class DESControl {

/**
* 预处理操作类
*/
private DESPre desPre = new DESPre();

/**
* DES核心算法类
*/
private DES des = new DES();

private int[] K = null;

public DESControl() {

}

/**
* 传入密钥
* @param keyText
*/
public DESControl(String keyText) {
byte[] key = desPre.dataformat(keyText.getBytes());
K = desPre.convertBinary(key);
}

/**
* 加密:传入明文进行加密得到结果以字节型数组形式返回
* @param plainText
* @return
*/
public byte[] DesEntrypt(String plainText) {
byte[] mText = null;
int[] M = null;
byte[] result = null;//用来存储加密后的结果

//1.首先对其预处理
//转换成byte数组
mText = desPre.dataformat(plainText.getBytes());

int datalen = mText.length;
int unitcount = datalen / 8;

//将byte转换为二进制
M = desPre.convertBinary(mText);

//根据转换好的明文,实例化result
result = new byte[M.length / 8];

//2.分组进行加密
for (int i = 0; i < unitcount; i++) {
int[] tmpkey = new int[64];
int[] tmpdata = new int[64];

System.arraycopy(K, 0, tmpkey, 0, 64);
System.arraycopy(M, i * 64, tmpdata, 0, 64);

int[] tmpC = des.encrypt(tmpdata, tmpkey);
byte[] tmpResult = desPre.convertBytes(tmpC);
System.arraycopy(tmpResult, 0, result, i * 8, 8);
}

return result;
}

/**
* 解密:传入加密后的字节数组,解密后以字节数组的形式返回
* @param cText
* @return
*/
public byte[] DesDecryption(byte[] cText) {

int[] C = desPre.convertBinary(cText);

int datalen = cText.length;
int unitcount = datalen / 8;

//根据转换好的明文,实例化result
byte[] result = new byte[C.length / 8];

for (int i = 0; i < unitcount; i++) {
int[] tmpkey = new int[64];
int[] tmpdata = new int[64];

System.arraycopy(K, 0, tmpkey, 0, 64);
System.arraycopy(C, i * 64, tmpdata, 0, 64);

int[] tmpC = des.decryption(tmpdata, tmpkey);
byte[] tmpResult = desPre.convertBytes(tmpC);
System.arraycopy(tmpResult, 0, result, i * 8, 8);
}
byte[] tmpR = desPre.removeExpand(result);//消除扩展位

return tmpR;
}
}


实现过程中参照了几个网上的源代码,很感谢那些乐于分享的人。

源代码地址:https://github.com/the5fire/DESPro

整个代码编写还是在eclipse中进行的,打包的也是一个eclipse工程。

如果这里看不明白记得先去看前面的基础文章
----EOF-----

扫码关注,或者搜索微信公众号:码农悟凡


其他分类: