package com.yonge.messagedigest;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.KeyGenerator;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
public class SecurityUtil {
private final static String ENCRYPT_ALGORITHM = "AES";
private final static String SECRET_KEY_FILE_NAME = "secret.key";
/**
* 生成加解密的密钥
* @param algorithm
* @return
* @throws NoSuchAlgorithmException
* @throws IOException
*/
public static SecretKey generateSecretKey(String algorithm) throws NoSuchAlgorithmException,
IOException {
KeyGenerator keyGenerator = KeyGenerator.getInstance(algorithm);
SecretKey secretKey = keyGenerator.generateKey();
//保存到文件中
FileOutputStream fos = null;
ObjectOutputStream oos = null;
try {
fos = new FileOutputStream(new File(SECRET_KEY_FILE_NAME));
oos = new ObjectOutputStream(fos);
oos.writeObject(secretKey);
} finally {
if (fos != null) {
fos.close();
}
if (oos != null) {
oos.close();
}
}
return secretKey;
}
/**
* 生成加解密的密钥
* @return
* @throws NoSuchAlgorithmException
* @throws IOException
*/
public static SecretKey generateSecretKey() throws NoSuchAlgorithmException, IOException {
return generateSecretKey(ENCRYPT_ALGORITHM);
}
/**
* 加密内容,并返回
* @param data
* @param algorithm
* @return
* @throws NoSuchAlgorithmException
* @throws IOException
* @throws ClassNotFoundException
* @throws NoSuchPaddingException
* @throws InvalidKeyException
* @throws IllegalBlockSizeException
* @throws BadPaddingException
*/
public static byte[] encrypt(byte[] data, String algorithm) throws NoSuchAlgorithmException,
IOException, ClassNotFoundException,
NoSuchPaddingException,
InvalidKeyException,
IllegalBlockSizeException,
BadPaddingException {
SecretKey secretKey = getSecretKeyFromLocal();
if (secretKey == null) {
secretKey = generateSecretKey(algorithm);
}
Cipher cipher = Cipher.getInstance(algorithm);
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
return cipher.doFinal(data);
}
/**
* 加密内容,并返回
* @param data
* @return
* @throws NoSuchAlgorithmException
* @throws IOException
* @throws ClassNotFoundException
* @throws NoSuchPaddingException
* @throws InvalidKeyException
* @throws IllegalBlockSizeException
* @throws BadPaddingException
*/
public static byte[] encrypt(byte[] data) throws NoSuchAlgorithmException, IOException,
ClassNotFoundException, NoSuchPaddingException,
InvalidKeyException, IllegalBlockSizeException,
BadPaddingException {
return encrypt(data, ENCRYPT_ALGORITHM);
}
/**
* 解密内容,并返回
* @param data
* @param algorithm
* @return
* @throws NoSuchAlgorithmException
* @throws IOException
* @throws ClassNotFoundException
* @throws NoSuchPaddingException
* @throws InvalidKeyException
* @throws IllegalBlockSizeException
* @throws BadPaddingException
*/
public static byte[] decrypt(byte[] data, String algorithm) throws NoSuchAlgorithmException,
IOException, ClassNotFoundException,
NoSuchPaddingException,
InvalidKeyException,
IllegalBlockSizeException,
BadPaddingException {
SecretKey secretKey = getSecretKeyFromLocal();
if (secretKey == null) {
secretKey = generateSecretKey(algorithm);
}
Cipher cipher = Cipher.getInstance(algorithm);
cipher.init(Cipher.DECRYPT_MODE, secretKey);
return cipher.doFinal(data);
}
/**
* 解密内容,并返回
* @param data
* @return
* @throws NoSuchAlgorithmException
* @throws IOException
* @throws ClassNotFoundException
* @throws NoSuchPaddingException
* @throws InvalidKeyException
* @throws IllegalBlockSizeException
* @throws BadPaddingException
*/
public static byte[] decrypt(byte[] data) throws NoSuchAlgorithmException, IOException,
ClassNotFoundException, NoSuchPaddingException,
InvalidKeyException, IllegalBlockSizeException,
BadPaddingException {
return decrypt(data, ENCRYPT_ALGORITHM);
}
/**
* 获取密钥对象
* @return
* @throws NoSuchAlgorithmException
* @throws IOException
* @throws ClassNotFoundException
*/
public static SecretKey getSecretKeyFromLocal() throws NoSuchAlgorithmException, IOException,
ClassNotFoundException {
FileInputStream fis = null;
ObjectInputStream ois = null;
SecretKey secretKey = null;
try {
//加载私钥文件
fis = new FileInputStream(new File(SECRET_KEY_FILE_NAME));
ois = new ObjectInputStream(fis);
//读取对象
secretKey = (SecretKey) ois.readObject();
} finally {
//关闭流
if (fis != null) {
fis.close();
}
if (ois != null) {
ois.close();
}
}
return secretKey;
}
}
分享到:
相关推荐
RSA非对称加密是一种广泛应用的公钥加密算法,由Ron Rivest、Adi Shamir和Leonard ...通过学习和理解"RSA非对称加解密实例"的源码,开发者可以更好地掌握加密解密技术,并将其应用到实际项目中,保障数据的安全传输。
本文将基于"加密解密实例"这一主题,深入探讨相关的技术知识点。 首先,我们需要了解加密的基本概念。加密是一种将可读信息(明文)转换为不可读形式(密文)的过程,目的是防止未经授权的访问。这通常通过使用加密...
这个"文本加密解密实例"很可能是提供了一个实际操作的代码示例,用于理解和应用加密技术。以下是对这个主题的详细解释: 文本加密是将可读的明文转化为无法理解的密文的过程,目的是保护数据不被未经授权的人访问。...
本实例将介绍如何在Java中实现数据的加解密,提供相关的源代码示例。 Java提供了丰富的加密库,如Java Cryptography Extension (JCE) 和 Java Cryptography Architecture (JCA),它们包含了各种加密算法,如AES...
C# MD5加密解密实例,一个小程序,哈哈
AES加解密实例, 能够用于AES算法加密及解密
在这个“QT做的DES加解密实例”中,我们将深入探讨如何使用QT库来实现DES的加解密功能。 首先,我们需要理解DES的工作原理。DES是一种块加密算法,它将64位的数据块作为输入,并使用56位的密钥进行加密或解密。实际...
- 自定义类通常会利用`System.Security.Cryptography`中的加密算法,如MD5,创建一个加密实例,然后对数据进行加解密操作。 5. **使用示例**: - 在ASP.NET应用程序中,可以通过实例化这个加密解密类,然后调用其...
本文将深入探讨Delphi中的异或(XOR)加密解密实例,以及如何在Delphi 7.0环境下实现这一功能。 异或加密是一种简单的对称加密方法,它基于异或运算的性质:相同的比特进行异或运算结果为0,不同的比特进行异或运算...
RSA是一种非对称加密算法,由Ron Rivest、Adi Shamir和Leonard Adleman在1977年提出,是现代密码学的基石之一。...学习和分析这个实例可以加深对非对称加密的理解,为实际项目中的安全通信提供基础。
4. **解密**:接收方使用私钥d进行解密,计算m = c^d mod n。 **RSA的安全性**:RSA的安全性依赖于大数因子分解问题。如果攻击者能分解n得到p和q,他们就可以轻易地计算出d,从而获取私钥。然而,随着p和q的增长,...
总的来说,这个实例为我们展示了如何在Java中使用DES加密算法进行数据加密和解密。在实际开发中,为了增强安全性,开发者通常会转向更强大的加密算法(如AES),并结合安全的密钥管理和存储机制。同时,非对称加密和...
在"DES加密解密实例网络安全传输系统"中,DES算法用于确保在网络上传输的数据不被未授权的第三方获取或篡改。数据在发送端使用DES加密,变为密文,然后通过网络发送到接收端。接收端接收到密文后,使用同样的DES密钥...
本文将详细讲解四种常见的加密算法:MD5、DES、AES和RSA,以及它们在实际应用中的加解密实例。 首先,MD5(Message-Digest Algorithm 5)是一种广泛使用的哈希函数,它可以将任意长度的数据转化为固定长度的摘要。...
PHP中加密解密函数与DES加密解密实例_.docx
1. **JavaScript库**:如CryptoJS,它提供了AES加解密的功能,允许开发者在浏览器环境中进行加密操作。 2. **数据封装**:前端将需要加密的数据进行格式化,然后调用加密函数,生成密文。 3. **安全传输**:使用...
在给定的"兼容JS和C#的RSA加密解密实例"中,我们关注的是如何在JavaScript(前端)和C#(后端)之间使用RSA进行安全的数据交换。这涉及到两个主要的方面:前端的加密和后端的解密。 前端部分,JavaScript通常用于...
本实例将探讨如何在PHP中实现RSA加密和解密,同时也会提及OpenSSL的安装和使用,这对于在Windows环境中进行PHP开发至关重要。 首先,RSA(Rivest–Shamir–Adleman)是一种非对称加密算法,它使用两个密钥:公钥和...
在提供的"Base64加密解密.html"文件中,很可能包含了一个完整的JavaScript实例,演示了如何使用`btoa()`和`atob()`进行Base64的加密和解密操作。你可以打开这个HTML文件查看具体的代码示例和使用方法。而"李嘉的科研...
在Java中,我们可以使用`java.util.Base64`类进行Base64的加解密操作。这个类提供了`Encoder`和`Decoder`两个接口,分别用于编码和解码。下面我们将详细讲解如何使用这些工具进行Base64处理。 首先,我们来看`Base...