首先我们需要明确几个概念:加密、解密、数字签名。
- 加密:将明文(未加密的数据)通过某种方式转换成密文(已加密的数据),使得未授权的第三方无法读取到数据内容。
- 解密:将密文还原成明文,使得有授权的第三方可以读取数据内容。
- 数字签名:对数据进行加密后再生成一个签名,用于验证数据的来源和完整性。
下面我们分别讲解 Java 中的加密解密和数字签名的完整代码示例。
Java加密解密示例
DES加密解密
首先我们需要了解DES加密算法,它是一种对称加密算法,即采用同一密钥进行加密与解密。下面是使用Java实现DES加密和解密的示例代码:
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import java.security.SecureRandom;
public class DesDemo {
public static void main(String[] args) throws Exception {
String content = "hello,world"; // 待加密的数据
KeyGenerator keyGenerator = KeyGenerator.getInstance("DES"); // 获得DES算法的密钥生成器
keyGenerator.init(new SecureRandom()); // 初始化密钥生成器
SecretKey secretKey = keyGenerator.generateKey(); // 生成密钥
Cipher cipher = Cipher.getInstance("DES"); // 获得DES加密算法的密码器
cipher.init(Cipher.ENCRYPT_MODE, secretKey); // 初始化密码器为加密模式
byte[] resultBytes = cipher.doFinal(content.getBytes()); // 加密
System.out.println("加密后:" + new String(resultBytes)); // 输出加密后结果
cipher.init(Cipher.DECRYPT_MODE, secretKey); // 初始化密码器为解密模式
byte[] originalBytes = cipher.doFinal(resultBytes); // 解密
System.out.println("解密后:" + new String(originalBytes)); // 输出解密后结果
}
}
RSA加密解密
RSA加密算法则是一种非对称加密算法,使用公钥加密,私钥解密,或使用私钥加密,公钥解密。下面是使用Java实现RSA加密和解密的示例代码:
import javax.crypto.Cipher;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;
public class RsaDemo {
public static void main(String[] args) throws Exception {
String content = "hello,world"; // 待加密的数据
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA"); // 获得RSA算法的密钥生成器
keyPairGenerator.initialize(512); // 初始化密钥长度
KeyPair keyPair = keyPairGenerator.generateKeyPair(); // 生成公钥和私钥对
PublicKey publicKey = keyPair.getPublic(); // 获得公钥
PrivateKey privateKey = keyPair.getPrivate(); // 获得私钥
Cipher cipher = Cipher.getInstance("RSA"); // 获得RSA加密算法的密码器
cipher.init(Cipher.ENCRYPT_MODE, publicKey); // 初始化密码器为加密模式,并设置公钥
byte[] resultBytes = cipher.doFinal(content.getBytes()); // 加密
System.out.println("加密后:" + new String(resultBytes)); // 输出加密后结果
cipher.init(Cipher.DECRYPT_MODE, privateKey); // 初始化密码器为解密模式,并设置私钥
byte[] originalBytes = cipher.doFinal(resultBytes); // 解密
System.out.println("解密后:" + new String(originalBytes)); // 输出解密后结果
}
}
Java数字签名示例
数字签名是为了保证数据的来源和完整性,需要使用私钥对数据进行签名,使用公钥对签名进行验证。下面是使用Java实现数字签名的示例代码:
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.Signature;
public class DigitalSignatureDemo {
public static void main(String[] args) throws Exception {
String content = "hello,world"; // 待签名的数据
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("DSA"); // 获得DSA算法的密钥生成器
keyPairGenerator.initialize(512); // 初始化密钥长度
KeyPair keyPair = keyPairGenerator.generateKeyPair(); // 生成公钥和私钥对
PublicKey publicKey = keyPair.getPublic(); // 获得公钥
PrivateKey privateKey = keyPair.getPrivate(); // 获得私钥
Signature signature = Signature.getInstance("SHA1withDSA"); // 获得数字签名的实例
signature.initSign(privateKey); // 初始化为签名模式,并设置私钥
signature.update(content.getBytes()); // 更新待签名的数据
byte[] signBytes = signature.sign(); // 生成签名
System.out.println("签名后:" + new String(signBytes)); // 输出签名结果
signature.initVerify(publicKey); // 初始化为验证模式,并设置公钥
signature.update(content.getBytes()); // 更新待验证的数据
boolean result = signature.verify(signBytes); // 验证签名
System.out.println("验签结果:" + result); // 输出验签结果
}
}
以上就是Java加密解密和数字签名的完整代码示例。其中,在RSA加密解密示例中,我们使用了非对称加密算法RSA,为了保证加密解密的可行性和效率,我们需要使用密钥对进行加密和解密。RSA算法一般用于在网络中传输小量数据(如会话密钥),并且RSA算法的加密和解密速度比较慢,而DES加密算法则是一种对称加密算法,适合加密大量的数据。在数字签名示例中,我们使用了数字签名的方式,保证了数据的来源和完整性,其中数字签名采用了DSA算法。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java加密解密和数字签名完整代码示例 - Python技术站