import java.security.Key;
import java.security.Security;
import javax.crypto.Cipher;
public class DesCryptUtil {
private static String strDefaultKey = "GzeduDes";
private Cipher encryptCipher = null;
private Cipher decryptCipher = null;
/**
* 将byte数组转换为表示16进制值的字符串, 如:byte[]{8,18}转换为:0813, 和public static byte[]
* hexStr2ByteArr(String strIn) 互为可逆的转换过程
*
* @param arrB
* 需要转换的byte数组
* @return 转换后的字符串
* @throws Exception
* 本方法不处理任何异常,所有异常全部抛出
*/
public static String byteArr2HexStr(byte[] arrB) throws Exception {
int iLen = arrB.length;
// 每个byte用两个字符才能表示,所以字符串的长度是数组长度的两倍
StringBuffer sb = new StringBuffer(iLen * 2);
for (int i = 0; i < iLen; i++) {
int intTmp = arrB[i];
// 把负数转换为正数
while (intTmp < 0) {
intTmp = intTmp + 256;
}
// 小于0F的数需要在前面补0
if (intTmp < 16) {
sb.append("0");
}
sb.append(Integer.toString(intTmp, 16));
}
return sb.toString();
}
/**
* 将表示16进制值的字符串转换为byte数组, 和public static String byteArr2HexStr(byte[] arrB)
* 互为可逆的转换过程
*
* @param strIn
* 需要转换的字符串
* @return 转换后的byte数组
* @throws Exception
* 本方法不处理任何异常,所有异常全部抛出
*/
public static byte[] hexStr2ByteArr(String strIn) throws Exception {
byte[] arrB = strIn.getBytes();
int iLen = arrB.length;
// 两个字符表示一个字节,所以字节数组长度是字符串长度除以2
byte[] arrOut = new byte[iLen / 2];
for (int i = 0; i < iLen; i = i + 2) {
String strTmp = new String(arrB, i, 2);
arrOut[i / 2] = (byte) Integer.parseInt(strTmp, 16);
}
return arrOut;
}
/**
* 默认构造方法,使用默认密钥
*
* @throws Exception
*/
public DesCryptUtil() throws Exception {
this(strDefaultKey);
}
/**
* 指定密钥构造方法
*
* @param strKey
* 指定的密钥
* @throws Exception
*/
public DesCryptUtil(String strKey) throws Exception {
Security.addProvider(new com.sun.crypto.provider.SunJCE());
Key key = getKey(strKey.getBytes());
encryptCipher = Cipher.getInstance("DES");
encryptCipher.init(Cipher.ENCRYPT_MODE, key);
decryptCipher = Cipher.getInstance("DES");
decryptCipher.init(Cipher.DECRYPT_MODE, key);
}
/**
* 加密字节数组
*
* @param arrB
* 需加密的字节数组
* @return 加密后的字节数组
* @throws Exception
*/
public byte[] encrypt(byte[] arrB) throws Exception {
return encryptCipher.doFinal(arrB);
}
/**
* 加密字符串
*
* @param strIn
* 需加密的字符串
* @return 加密后的字符串
* @throws Exception
*/
public String encrypt(String strIn) throws Exception {
return byteArr2HexStr(encrypt(strIn.getBytes()));
}
/**
* 解密字节数组
*
* @param arrB
* 需解密的字节数组
* @return 解密后的字节数组
* @throws Exception
*/
public byte[] decrypt(byte[] arrB) throws Exception {
return decryptCipher.doFinal(arrB);
}
/**
* 解密字符串
*
* @param strIn
* 需解密的字符串
* @return 解密后的字符串
* @throws Exception
*/
public String decrypt(String strIn) throws Exception {
return new String(decrypt(hexStr2ByteArr(strIn)));
}
/**
* 从指定字符串生成密钥,密钥所需的字节数组长度为8位 不足8位时后面补0,超出8位只取前8位
*
* @param arrBTmp
* 构成该字符串的字节数组
* @return 生成的密钥
* @throws java.lang.Exception
*/
private Key getKey(byte[] arrBTmp) throws Exception {
// 创建一个空的8位字节数组(默认值为0)
byte[] arrB = new byte[8];
// 将原始字节数组转换为8位
for (int i = 0; i < arrBTmp.length && i < arrB.length; i++) {
arrB[i] = arrBTmp[i];
}
// 生成密钥
Key key = new javax.crypto.spec.SecretKeySpec(arrB, "DES");
return key;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
String test = "4401104002303251";
//DESPlus des = new DESPlus();//默认密钥
DesCryptUtil des = new DesCryptUtil("20*Ab#!z");//自定义密钥
System.out.println("加密前的字符:" + test);
System.out.println("加密后的字符:" + des.encrypt(test));
System.out.println("解密后的字符:" + des.decrypt(des.encrypt(test)));
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
}
分享到:
相关推荐
总之,Java实现DES对称加密涉及了密码学的基础知识,包括密钥生成、加密解密过程等。虽然DES的原始安全性已受到质疑,但它依然作为理解对称加密概念的一个实例。开发者应根据实际需求和安全标准选择合适的加密算法和...
本实例解释如何利用DES私钥加密算法加解密,对称加密的例子,本例中定义的加密算法可以是DES,DESede,Blowfish等,选择DES算法,密钥长度必须为56位,用密钥加密明文(message),生成密文(cipherText),操作模式为加密...
DES算法为密码体制中的对称密码体制,是一个分组加密算法,典型的DES以64位为分组对数据加密,加密和解密用的是同一个算法。 这里以Java代码实现DES算法。
Java中的DES(Data Encryption Standard)是一种广泛使用的对称加密算法,它基于一个固定的密钥进行数据的加密和解密。这个实例将详细讲解如何在Java...通过分析这些代码,你可以更好地理解和实践Java中的DES对称加密。
转 JAVA加密解密DES对称加密算法.doc
本示例"Java-Js双向Des对称加密Demo"提供了在Java和JavaScript两个平台间实现DES加密解密的互操作性。下面将详细阐述DES加密解密的核心原理、Java和JavaScript的实现细节以及如何在两者之间进行兼容。 DES是一种块...
DES对称分组密码系统 import java.security.spec.*; import javax.crypto.*; import javax.crypto.spec.*; class DES01 { private String strkey; private SecretKey skey=null; private String[] algo= {"DES/...
本实例主要探讨如何在Java中利用DES私钥进行对称加密。 DES是一种块加密算法,它使用56位的密钥对64位的数据块进行加密。虽然DES现在被认为安全性较低,因为其密钥长度较短,容易被破解,但它仍然是学习加密原理和...
DES对称加密 是一种很早有IBM实现的对称加密!
DES是一种对称加密算法,使用56位的密钥对数据进行16轮的迭代操作,以达到保护信息安全的目的。128bit在这里指的是可能使用的密钥长度扩展,因为原始DES的密钥是56位,但通常会通过填充到128位来增强安全性。 描述...
Java 3des加密算法ECB模式,亲测完美通过。目前网上的大部分算法都通不过或者加进Base64之类的,还要不下载其它jar包。而代码使用时直接下载运行,无须配置和下载额外的jar包 ,只需换上自己的密钥和待加密的数据...
7. **代码实例**:在提供的压缩包文件"Java利用DES私钥对称加密代码实例"中,应该包含了具体的Java代码示例,这些示例通常会展示如何生成密钥、进行加密和解密的完整流程。你可以通过阅读和运行这些代码,更好地理解...
DES、AES对称加密算法,之前从网上找的,但是在MAC上运行发现每次加密出来的结果都不一样,后来查了一些博客,最后确认是SecureRandom的随机算法问题,需要设置setSeed.
在现代密码技术中,根据密钥类型的不同,可以将其分为两类:对称加密算法(秘密钥匙加密)和非对称加密算法(公开密钥加密)。对称加密算法用来对敏感数据等信息进行加密,常用的算法包括 DES、3DES、AES 等。非对称...
PHP 3des 对称加密解密,与 java c#兼容
基于java的开发源码-利用DES私钥对称加密代码实例.zip 基于java的开发源码-利用DES私钥对称加密代码实例.zip 基于java的开发源码-利用DES私钥对称加密代码实例.zip 基于java的开发源码-利用DES私钥对称加密代码实例....
其中,RSA非对称加密和DES对称加密是两种常见的加密算法。这篇文章将详细介绍这两种加密方法,并通过代码示例进行阐述。 **RSA非对称加密** RSA(Rivest-Shamir-Adleman)是非对称加密算法的代表,由Ron Rivest、...
Java和JavaScript之间的DES加密解密是...总结来说,Java和JavaScript之间的DES加密解密涉及了对称加密原理、密钥管理、跨平台的互操作以及安全实践。理解和掌握这些知识点对于进行安全的网络通信和数据保护至关重要。
Java 加密解密之对称加密算法 DES Java 加密解密之对称加密算法 DES 是一种常用的对称加密算法,广泛应用于保护金融数据的安全中。它的全称是 Data Encryption Algorithm(DEA),最早由 IBM 开发,并曾拥有专利权...
DES(Data Encryption Standard)是一种经典的对称加密算法,它在信息安全领域被广泛使用,尤其是在一些老的系统和应用中。本DEMO提供了C#和JAVA两种编程语言下的DES加密和解密实现,这对于理解DES算法及其在实际...