JAVA实现DES加密
DES算法为密码体制中的对称密码体制,又被成为 ,是1972年美国 公司研制的对称密码体制加密算法。其密钥长度为56位,明文按64位进行分组,将分组后的明文组和56位的密钥按位替代或交换的方法形成密文组的加密方法。
DES加密算法特点:分组比较短、密钥太短、密码生命周期短、运算速度较慢。
DES工作的基本原理是,其入口参数有三个:key、data、mode。 key为加密解密使用的 ,data为加密解密的数据,mode为其工作模式。当模式为加密模式时,明文按照64
DES加密算法
位进行分组,形成明文组,key用于对数据加密,当模式为解密模式时,key用于对数据解密。实际运用中,密钥只用到了64位中的56位,这样才具有高的安全性。
DES( Data Encryption Standard)算法,于1977年得到美国政府的正式许可,是一种用56位密钥来加密64位数据的方法。虽然56位密钥的DES算法已经风光不在,而 且常有用Des加密的明文被破译的报道,但是了解一下昔日美国的标准加密算法总是有益的,而且目前DES算法得到了广泛的应用,在某些场合,仍然发挥着余 热。
-
package test;
-
-
import java.io.FileInputStream;
-
import java.io.FileOutputStream;
-
import java.io.InputStream;
-
import java.io.OutputStream;
-
import java.security.Key;
-
import java.security.SecureRandom;
-
-
import javax.crypto.Cipher;
-
import javax.crypto.CipherInputStream;
-
import javax.crypto.CipherOutputStream;
-
import javax.crypto.KeyGenerator;
-
-
import sun.misc.BASE64Decoder;
-
import sun.misc.BASE64Encoder;
-
-
public class DESUtil {
-
-
Key key ;
-
-
public DESUtil() {
-
-
}
-
-
public DESUtil(String str) {
-
setKey(str); // 生成密匙
-
}
-
-
public Key getKey() {
-
return key ;
-
}
-
-
public void setKey(Key key) {
-
this . key = key;
-
}
-
-
/**
-
* 根据参数生成 KEY
-
*/
-
public void setKey(String strKey) {
-
try {
-
KeyGenerator _generator = KeyGenerator.getInstance ( "DES" );
-
_generator.init( new SecureRandom(strKey.getBytes()));
-
this . key = _generator.generateKey();
-
_generator = null ;
-
} catch (Exception e) {
-
throw new RuntimeException(
-
"Error initializing SqlMap class. Cause: " + e);
-
}
-
}
-
-
/**
-
* 加密 String 明文输入 ,String 密文输出
-
*/
-
public String encryptStr(String strMing) {
-
byte [] byteMi = null ;
-
byte [] byteMing = null ;
-
String strMi = "" ;
-
BASE64Encoder base64en = new BASE64Encoder();
-
try {
-
byteMing = strMing.getBytes( "UTF8" );
-
byteMi = this .encryptByte(byteMing);
-
strMi = base64en.encode(byteMi);
-
} catch (Exception e) {
-
throw new RuntimeException(
-
"Error initializing SqlMap class. Cause: " + e);
-
} finally {
-
base64en = null ;
-
byteMing = null ;
-
byteMi = null ;
-
}
-
return strMi;
-
}
-
-
/**
-
* 解密 以 String 密文输入 ,String 明文输出
-
*
-
* @param strMi
-
* @return
-
*/
-
public String decryptStr(String strMi) {
-
BASE64Decoder base64De = new BASE64Decoder();
-
byte [] byteMing = null ;
-
byte [] byteMi = null ;
-
String strMing = "" ;
-
try {
-
byteMi = base64De.decodeBuffer(strMi);
-
byteMing = this .decryptByte(byteMi);
-
strMing = new String(byteMing, "UTF8" );
-
} catch (Exception e) {
-
throw new RuntimeException(
-
"Error initializing SqlMap class. Cause: " + e);
-
} finally {
-
base64De = null ;
-
byteMing = null ;
-
byteMi = null ;
-
}
-
return strMing;
-
}
-
-
/**
-
* 加密以 byte[] 明文输入 ,byte[] 密文输出
-
*
-
* @param byteS
-
* @return
-
*/
-
private byte [] encryptByte( byte [] byteS) {
-
byte [] byteFina = null ;
-
Cipher cipher;
-
try {
-
cipher = Cipher.getInstance ( "DES" );
-
cipher.init(Cipher. ENCRYPT_MODE , key );
-
byteFina = cipher.doFinal(byteS);
-
} catch (Exception e) {
-
throw new RuntimeException(
-
"Error initializing SqlMap class. Cause: " + e);
-
} finally {
-
cipher = null ;
-
}
-
return byteFina;
-
}
-
-
/**
-
* 解密以 byte[] 密文输入 , 以 byte[] 明文输出
-
*
-
* @param byteD
-
* @return
-
*/
-
private byte [] decryptByte( byte [] byteD) {
-
Cipher cipher;
-
byte [] byteFina = null ;
-
try {
-
cipher = Cipher.getInstance ( "DES" );
-
cipher.init(Cipher. DECRYPT_MODE , key );
-
byteFina = cipher.doFinal(byteD);
-
} catch (Exception e) {
-
throw new RuntimeException(
-
"Error initializing SqlMap class. Cause: " + e);
-
} finally {
-
cipher = null ;
-
}
-
return byteFina;
-
}
-
-
/**
-
* 文件 file 进行加密并保存目标文件 destFile 中
-
*
-
* @param file
-
* 要加密的文件 如 c:/test/srcFile.txt
-
* @param destFile
-
* 加密后存放的文件名 如 c:/ 加密后文件 .txt
-
*/
-
public void encryptFile(String file, String destFile) throws Exception {
-
Cipher cipher = Cipher.getInstance ( "DES" );
-
// cipher.init(Cipher.ENCRYPT_MODE, getKey());
-
cipher.init(Cipher. ENCRYPT_MODE , this . key );
-
InputStream is = new FileInputStream(file);
-
OutputStream out = new FileOutputStream(destFile);
-
CipherInputStream cis = new CipherInputStream(is, cipher);
-
byte [] buffer = new byte [1024];
-
int r;
-
while ((r = cis.read(buffer)) > 0) {
-
out.write(buffer, 0, r);
-
}
-
cis.close();
-
is.close();
-
out.close();
-
}
-
-
/**
-
* 文件采用 DES 算法解密文件
-
*
-
* @param file
-
* 已加密的文件 如 c:/ 加密后文件 .txt *
-
* @param destFile
-
* 解密后存放的文件名 如 c:/ test/ 解密后文件 .txt
-
*/
-
public void decryptFile(String file, String dest) throws Exception {
-
Cipher cipher = Cipher.getInstance ( "DES" );
-
cipher.init(Cipher. DECRYPT_MODE , this . key );
-
InputStream is = new FileInputStream(file);
-
OutputStream out = new FileOutputStream(dest);
-
CipherOutputStream cos = new CipherOutputStream(out, cipher);
-
byte [] buffer = new byte [1024];
-
int r;
-
while ((r = is.read(buffer)) >= 0) {
-
cos.write(buffer, 0, r);
-
}
-
cos.close();
-
out.close();
-
is.close();
-
}
-
-
public static void main(String[] args) throws Exception {
-
DESUtil des = new DESUtil( "1234567" );
-
// DES 加密文件
-
// des.encryptFile("G:/test.doc", "G:/ 加密 test.doc");
-
// DES 解密文件
-
// des.decryptFile("G:/ 加密 test.doc", "G:/ 解密 test.doc");
-
String str1 = " 要加密的字符串 test" ;
-
// DES 加密字符串
-
String str2 = des.encryptStr(str1);
-
// DES 解密字符串
-
String deStr = des.decryptStr(str2);
-
System. out .println( " 加密前: " + str1);
-
System. out .println( " 加密后: " + str2);
-
System. out .println( " 解密后: " + deStr);
-
}
-
}
java的MD5加密、解密
-
import java.security.*;
-
import java.security.spec.*;
-
-
class MD5_test {
-
public final static String MD5(String s) {
-
char hexDigits[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
-
'a', 'b', 'c', 'd', 'e', 'f' };
-
try {
-
byte[] strTemp = s.getBytes();
-
MessageDigest mdTemp = MessageDigest.getInstance("MD5");
-
mdTemp.update(strTemp);
-
byte[] md = mdTemp.digest();
-
int j = md.length;
-
char str[] = new char[j * 2];
-
int k = 0;
-
for (int i = 0; i < j; i++) {
-
byte byte0 = md[i];
-
str[k++] = hexDigits[byte0 >>> 4 & 0xf];
-
str[k++] = hexDigits[byte0 & 0xf];
-
}
-
return new String(str);
-
} catch (Exception e) {
-
return null;
-
}
-
}
-
-
public static void main(String[] args) {
-
// MD5_Test aa = new MD5_Test();
-
System.out.print(MD5_test.MD5("b"));
-
}
-
}
加密,解密
-
import java.security.MessageDigest;
-
-
-
public class MD5andKL {
// MD5加码。32位
public static String MD5(String inStr) {
MessageDigest md5 = null;
try {
md5 = MessageDigest.getInstance("MD5");
} catch (Exception e) {
System.out.println(e.toString());
e.printStackTrace();
return "";
}
char[] charArray = inStr.toCharArray();
byte[] byteArray = new byte[charArray.length];
for (int i = 0; i < charArray.length; i++)
byteArray[i] = (byte) charArray[i];
byte[] md5Bytes = md5.digest(byteArray);
StringBuffer hexValue = new StringBuffer();
for (int i = 0; i < md5Bytes.length; i++) {
int val = ((int) md5Bytes[i]) & 0xff;
if (val < 16)
hexValue.append("0");
hexValue.append(Integer.toHexString(val));
}
return hexValue.toString();
}
// 可逆的加密算法
public static String KL(String inStr) {
// String s = new String(inStr);
char[] a = inStr.toCharArray();
for (int i = 0; i < a.length; i++) {
a[i] = (char) (a[i] ^ 't');
}
String s = new String(a);
return s;
}
// 加密后解密
public static String JM(String inStr) {
char[] a = inStr.toCharArray();
for (int i = 0; i < a.length; i++) {
a[i] = (char) (a[i] ^ 't');
}
String k = new String(a);
return k;
}
// 测试主函数
public static void main(String args[]) {
String s = new String("a");
System.out.println("原始:" + s);
System.out.println("MD5后:" + MD5(s));
System.out.println("MD5后再加密:" + KL(MD5(s)));
System.out.println("解密为MD5后的:" + JM(KL(MD5(s))));
}
}
阅读(4151) | 评论(0) | 转发(0) |