`

Java DES 加解密

阅读更多
DES(Data Encryption Standard)是一种对称加密方式,加密和解密使用相同的密钥。

在DES中,使用了一个 56 位的密钥以及附加的8位奇偶校验位,产生最大64 位的分组大小。加密过程中,将加密的文本块分成两半。使用子密钥对其中一半应用循环功能,然后将输出与另一半进行“异或”运算;接着交换这两半。循环往复。DES 使用16个循环,但最后一个循环不交换。

如果加密的时候使用随机生成的密钥并未保存,解密将因为没有密钥而无法进行。

基本步骤:
1. 获取密钥(KeyGenerator或者SecretKeyFactory)
2. 读取输入流为字节数组。
3. 实例化Cipher并指定模式(加密或解密等)和密钥
4. 加解密并产生输出流

public class DESHelper {
	private static String keyFileName = "des_key.xml"; // 密钥文件名
	private static final String ALGORITHM = "DES"; // 加密算法名
	private static final SecureRandom sr = new SecureRandom(); // 强加密随机数生成器
	
	// 测试方法
	public static void main(String[] args) {
		// 加解密字符串
		byte[] encryptedObj = encryptStr("心有灵犀一点通", "astronomer");
		System.out.println(new String(encryptedObj));
		byte[] decryptedObj = decrypt(encryptedObj, "astronomer");
		System.out.println(new String(decryptedObj));

		// 加解密文件
		encryptFile("plain.txt", "plain_encrypt.txt", "astronomer");
		decryptFile("plain_encrypt.txt", "plain_encrypt_decrypt.txt", "astronomer");

		// 使用保存的key加解密字符串
		byte[] encryptedObj = encryptStr("春天花会开");
		System.out.println(new String(encryptedObj));
		byte[] decryptedObj = decrypt(encryptedObj);
		System.out.println(new String(decryptedObj));
	}
	
	// 保存生成的密钥
	public static void storeSecretKey() {
		FileOutputStream out = null;
		ObjectOutputStream oout = null;
		try {
			KeyGenerator keyGenerator = KeyGenerator.getInstance(ALGORITHM);
			keyGenerator.init(sr);
			SecretKey secretKey = keyGenerator.generateKey();
			out = new FileOutputStream(keyFileName);
			oout = new ObjectOutputStream(out);
			oout.writeObject(secretKey);
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				oout.close();
				out.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
	
	// 获取保存的密钥
	public static SecretKey loadSecretKey() {
		SecretKey secretKey = null;
		try {
			FileInputStream in = new FileInputStream(keyFileName);
			ObjectInputStream oin = new ObjectInputStream(in);
			secretKey = (SecretKey)oin.readObject();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return secretKey;
	}

	// 生成密钥。由于每次产生的密钥都不同,不适合实际使用。
	private static SecretKey generateSecretKey() {
		KeyGenerator keyGenerator = null;
		try {
			keyGenerator = KeyGenerator.getInstance(ALGORITHM); // Get the key generator
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		}
		
		return keyGenerator.generateKey(); // Generate the secret key
	}
	
	// 根据密码的消息摘要和DESKeySpec生成密钥。
	private static SecretKey generateSecretKey(String key) {
		SecretKey secretKey = null;
		try {
			MessageDigest md = MessageDigest.getInstance("MD5");
			byte[] bytes = key.getBytes();
			md.update(bytes, 0, bytes.length);
			byte[] mdBytes = md.digest(); // Generate 16 bytes
			byte[] truncatedBytes = Arrays.copyOf(mdBytes, 8); // Fetch 8 bytes for DESKeySpec
			DESKeySpec keySpec = new DESKeySpec(truncatedBytes);
			SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(ALGORITHM);
			secretKey = keyFactory.generateSecret(keySpec);
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		return secretKey;
	}
	
	// 根据密码和keyGenerator生成密钥。
	private static SecretKey generateSecretKey2(String key) {
		KeyGenerator keyGenerator = null; 
		try {
			keyGenerator = KeyGenerator.getInstance(ALGORITHM); // Get the key generator
			SecureRandom sr = new SecureRandom(key.getBytes()); // Instantiate an instance of SecureRandom
			keyGenerator.init(sr);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return keyGenerator.generateKey();
	}
	
	// 根据密码加密文件。
	public static void encryptFile(String file, String newFile, String key) {
		SecretKey secretKey = generateSecretKey(key);
		encryptFile(file, newFile, secretKey);
	}
	
	public static void encryptFile(String file, String newFile) {
		File keyFile = new File(keyFileName);
		if (!keyFile.exists()) {
			storeSecretKey();
		}
		SecretKey secretKey = loadSecretKey();
		encryptFile(file, newFile, secretKey);
	}
	
	private static void encryptFile(String file, String newFile, SecretKey secretKey) {	
		InputStream in = null;
		CipherInputStream cin = null;
		OutputStream out = null;
		try {
			Cipher cipher = Cipher.getInstance(ALGORITHM);
			cipher.init(Cipher.ENCRYPT_MODE, secretKey, sr);
			in = new FileInputStream(file);
			cin = new CipherInputStream(in, cipher);
			out = new FileOutputStream(newFile);
			byte[] buffer = new byte[1024];
			int count = 0;
			while ((count = cin.read(buffer)) > 0) {
				out.write(buffer, 0, count);			
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				cin.close();
				in.close();
				out.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
	
	// 根据密码解密文件。
	public static void decryptFile(String file, String newFile, String key) {
		SecretKey secretKey = generateSecretKey(key);
		decryptFile(file, newFile, secretKey);
	}
	
	public static void decryptFile(String file, String newFile) {
		File keyFile = new File(keyFileName);
		if (!keyFile.exists()) {
			storeSecretKey();
		}
		SecretKey secretKey = loadSecretKey();
		decryptFile(file, newFile, secretKey);
	}	
	
	private static void decryptFile(String file, String newFile, SecretKey secretKey) {
		InputStream in = null;
		CipherOutputStream cout = null;
		OutputStream out = null;
		try {
			Cipher cipher = Cipher.getInstance(ALGORITHM);
			cipher.init(Cipher.DECRYPT_MODE, secretKey, sr);
			in = new FileInputStream(file);
			out = new FileOutputStream(newFile);
			cout = new CipherOutputStream(out, cipher);
			byte[] buffer = new byte[1024];
			int count = 0;
			while ((count = in.read(buffer)) > 0) {
				cout.write(buffer, 0, count);			
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				cout.close();
				out.close();
				in.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
	
	// 加密字符串。
	public static byte[] encryptStr(String str) {
		byte[] bytes = str.getBytes();
		File keyFile = new File(keyFileName);
		if (!keyFile.exists()) {
			storeSecretKey();
		}
		SecretKey secretKey = loadSecretKey();
		return encrypt(bytes, secretKey);
	}
	
	// 根据密码加密字符串。
	public static byte[] encryptStr(String str, String key) {
		byte[] bytes = str.getBytes();
		SecretKey secretKey = generateSecretKey(key);
		return encrypt(bytes, secretKey);
	}
	
	// 根据密码加密字节数组。
	public static byte[] encrypt(byte[] bytes, String key) {
		SecretKey secretKey = generateSecretKey(key);
		return encrypt(bytes, secretKey);
	}

	// 加密字节数组。	
	public static byte[] encrypt(byte[] bytes) {
		File keyFile = new File(keyFileName);
		if (!keyFile.exists()) {
			storeSecretKey();
		}
		SecretKey secretKey = loadSecretKey();
		return encrypt(bytes, secretKey);
	}
	
	private static byte[] encrypt(byte[] bytes, SecretKey secretKey) {
		byte[] encryptedObj = null;

		try {
			Cipher cipher = Cipher.getInstance(ALGORITHM); // Get the cipher
			cipher.init(Cipher.ENCRYPT_MODE, secretKey);
			encryptedObj = cipher.doFinal(bytes);
		} catch (Exception e) {
			e.printStackTrace();
		}

		return encryptedObj;
	}
	
	// 解密字符串。
	public static byte[] decryptStr(String str) {
		byte[] bytes = str.getBytes();
		File keyFile = new File(keyFileName);
		if (!keyFile.exists()) {
			storeSecretKey();
		}
		SecretKey secretKey = loadSecretKey();
		return decrypt(bytes, secretKey);
	}
	
	// 根据密码解密字符串。
	public static byte[] decryptStr(String str, String key) {
		byte[] bytes = str.getBytes();
		SecretKey secretKey = generateSecretKey(key);
		return decrypt(bytes, secretKey);
	}
	
	// 根据密码解密字节数组。
	public static byte[] decrypt(byte[] bytes, String key) {
		SecretKey secretKey = generateSecretKey(key);
		return decrypt(bytes, secretKey);
	}
	
	// 解密字节数组。
	public static byte[] decrypt(byte[] bytes) {
		File keyFile = new File(keyFileName);
		if (!keyFile.exists()) {
			storeSecretKey();
		}
		SecretKey secretKey = loadSecretKey();
		return decrypt(bytes, secretKey);
	}

	private static byte[] decrypt(byte[] bytes, SecretKey secretKey) {
		byte[] decryptedObj = null;
		
		try {
			Cipher cipher = Cipher.getInstance(ALGORITHM); // Get the cipher
			cipher.init(Cipher.DECRYPT_MODE, secretKey);
			decryptedObj = cipher.doFinal(bytes);
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		return decryptedObj;
	}
分享到:
评论

相关推荐

    java DES 加密解密算法(内有测试)

    Java中的DES(Data Encryption Standard)是一种对称加密算法,它基于一个固定的64位密钥对数据进行加密和解密。DES在80年代被广泛使用,但由于其密钥长度较短,现在已经被AES(Advanced Encryption Standard)所...

    JAVA DES加密解密

    JAVA DES加密解密

    java des.rar_base64 des_javades加解密

    在Java中实现DES加解密,我们需要使用`javax.crypto`包中的类。首先,我们需要创建一个密钥,这通常通过`KeyGenerator`类完成,指定DES作为算法。然后,我们使用`Cipher`类来执行加密和解密操作,该类提供了`init`...

    java的DES加密解密

    java的DES加密解密:用于密码在数据库的加密,解码类

    JAVA实现DES加解密系统

    **JAVA实现DES加解密系统** DES(Data Encryption Standard)是一种经典的对称加密算法,它在信息安全领域有着广泛的应用。本文将深入探讨如何使用Java语言实现DES加解密系统,以及涉及的相关技术点。 首先,DES...

    Java DES加解密算法

    Java DES加解密算法 DES全称为Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块

    des加密解密java实现版本

    在Java中实现DES加密和解密是一项常见的任务,通常涉及到`javax.crypto`包中的类和接口。本篇文章将详细阐述DES加密解密的Java实现过程。 首先,我们需要了解DES算法的基本原理。DES是一种块密码,它将明文数据分成...

    java和javascript之间的DES加密解密

    Java和JavaScript之间的DES加密解密是信息安全领域中的一个重要话题,主要涉及到数据的保护和通信的安全。DES(Data Encryption Standard)是一种古老的对称加密算法,尽管它在安全性上已不被视为最佳选择,但在某些...

    java DES加解密算法.rar_des_des加解密界面_dogrzo_java

    DES算法实现包括文件选择,包括界面,可以实现文件的加密和解密

    支持Linux c和java的des加解密

    本话题主要探讨如何在Linux环境下,使用C语言和Java实现DES加密和解密。 一、DES算法概述 DES是一种块密码,它将64位的数据块作为输入,通过一系列复杂的变换,将其转化为另一64位的密文。DES使用56位的密钥,但...

    java实现的des算法加密及解密

    用java写的des算法加密及解密过程

    PHP、JAVA、C#、Object-C、Android 通用的DES加密解密

    2. JAVA DES加密解密: Java提供了javax.crypto包来处理加密解密。使用DES时,需要创建一个KeyGenerator对象,设置为DES算法,然后生成密钥。接着,使用Cipher类的`init()`方法初始化加密或解密模式,最后调用`...

    java-des.zip_Des加密解密_des_java des_java 加密解密

    des加密解密算法,通过DES加密解密实现一个String字符串的加密和解密.

    java 实现 des加解密、mac算法

    本文将详细介绍如何在Java中实现DES加解密和MAC算法,并探讨其应用。 首先,DES是一种对称加密算法,由IBM公司开发,后被美国国家标准局采纳为标准。它使用64位的密钥对数据进行加密和解密,但实际有效密钥长度只有...

    java_DES加密解密源码.rar_DES加密_des_java DES_java des_加密 解密

    Java实现des加密解密算法,des加密解密算法

    java des文件的加密解密

    目前测试了通过的文件类 rar,txt,xml等

    Des.JAVA.rar_DES.java_DES加密_java DES 128bit_java des_加密解密

    标题中的"Des.JAVA.rar_DES.java_DES加密_java DES 128bit_java des_加密解密"表明这是一个关于Java实现DES(Data Encryption Standard)加密算法的压缩包,其中包含用于加密和解密的源代码。DES是一种对称加密算法...

    DES加密解密java工具类

    DES加密解密java工具类 public static final String KEY_ALGORITHM = "DES"; public static final String CIPHER_ALGORITHM = "DES/ECB/PKCS5PADDING"; validKeySpecException, NoSuchPaddingException, ...

    java php DES 加密解密

    在Java中,DES加密解密主要通过`javax.crypto`包中的类来实现。首先,我们需要一个密钥,通常是8字节的字节数组。然后,使用`KeyGenerator`生成一个DES密钥。接下来,创建`Cipher`对象并初始化它,根据需要进行加密...

    3DES加密解密java版+js版

    在Java和JavaScript中实现3DES加密和解密,主要涉及以下几个关键知识点: 1. **密钥生成**:3DES需要一个168位的密钥,但通常我们提供的是一个128位或更短的密钥。Java中的`javax.crypto.SecretKeyFactory`和`javax...

Global site tag (gtag.js) - Google Analytics