21xrx.com
2024-12-23 08:10:56 Monday
登录
文章检索 我的文章 写文章
在我们日常编程中
2023-06-11 10:02:50 深夜i     --     --

在我们日常编程中,数据加密是非常重要的。在Java中,加密算法有很多种。本文将介绍Java中常用的加密算法以及实现步骤。

一、常用加密算法介绍

1、MD5加密算法

MD5加密算法是一种不可逆的加密算法,即无法通过加密后的结果推算出原始数据。其特点是加密后的字符串长度固定为32个字符,常用于密码加密和校验文件完整性等操作。Java中实现MD5加密算法需要使用Java自带的java.security.MessageDigest类。

下面是一个示例代码:


import java.security.MessageDigest;

import java.security.NoSuchAlgorithmException;

public class MD5Util {

  public static String encrypt(String dataStr) throws NoSuchAlgorithmException {

    MessageDigest md5 = MessageDigest.getInstance("MD5");

    byte[] data = dataStr.getBytes();

    md5.update(data);

    byte[] resultBytes = md5.digest();

    StringBuilder sb = new StringBuilder();

    for (byte b : resultBytes) {

      String hex = Integer.toHexString(b & 0xff);

      sb.append(hex.length() == 1 ? "0" + hex : hex);

    }

    return sb.toString();

  }

  public static void main(String[] args) throws NoSuchAlgorithmException {

    String dataStr = "Hello, world!";

    String result = encrypt(dataStr);

    System.out.println(result);

  }

}

2、DES加密算法

DES加密算法是一种对称加密算法,其加密和解密使用相同的密码。DES加密算法的特点是加密速度快,不过由于密钥长度过短,已被许多攻击者成功破解。Java中实现DES加密算法需要使用Java自带的javax.crypto包。

以下是一个示例代码:


import javax.crypto.Cipher;

import javax.crypto.SecretKey;

import javax.crypto.SecretKeyFactory;

import javax.crypto.spec.DESKeySpec;

import java.security.SecureRandom;

import java.util.Base64;

public class DESUtil {

  private static final String KEY = "12345678"; // 密钥

  public static String encrypt(String dataStr) throws Exception {

    SecureRandom random = new SecureRandom(); // 加密随机数生成器

    DESKeySpec desKeySpec = new DESKeySpec(KEY.getBytes()); // Key转换

    SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES"); // Key工厂

    SecretKey secretKey = keyFactory.generateSecret(desKeySpec); // 生成Key

    Cipher cipher = Cipher.getInstance("DES"); // Cipher初始化

    cipher.init(Cipher.ENCRYPT_MODE, secretKey, random);

    byte[] encryptedData = cipher.doFinal(dataStr.getBytes()); // 加密

    return Base64.getEncoder().encodeToString(encryptedData); // Base64编码返回

  }

  public static String decrypt(String dataStr) throws Exception {

    byte[] encryptedData = Base64.getDecoder().decode(dataStr); // Base64解码

    SecureRandom random = new SecureRandom(); // 解密随机数生成器

    DESKeySpec desKeySpec = new DESKeySpec(KEY.getBytes()); // Key转换

    SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES"); // Key工厂

    SecretKey secretKey = keyFactory.generateSecret(desKeySpec); // 生成Key

    Cipher cipher = Cipher.getInstance("DES"); // Cipher初始化

    cipher.init(Cipher.DECRYPT_MODE, secretKey, random);

    byte[] decryptedData = cipher.doFinal(encryptedData); // 解密

    return new String(decryptedData);

  }

  public static void main(String[] args) throws Exception {

    String dataStr = "Hello, world!";

    String encryptedDataStr = encrypt(dataStr);

    String decryptedDataStr = decrypt(encryptedDataStr);

    System.out.println("原始数据:" + dataStr);

    System.out.println("加密后的数据:" + encryptedDataStr);

    System.out.println("解密后的数据:" + decryptedDataStr);

  }

}

3、RSA加密算法

RSA加密算法是一种非对称加密算法,其加密和解密使用不同的私钥和公钥。RSA加密算法的特点是加密速度较慢,但是安全性很高,被广泛应用于网络安全领域。Java中实现RSA加密算法需要使用Java自带的java.security包和org.bouncycastle包。

以下是一个示例代码:


import org.bouncycastle.jce.provider.BouncyCastleProvider;

import javax.crypto.Cipher;

import java.security.*;

import java.security.spec.PKCS8EncodedKeySpec;

import java.security.spec.X509EncodedKeySpec;

import java.util.Base64;

public class RSAUtil {

  public static String KEY_ALGORITHM = "RSA"; // 加密算法

  public static KeyPair generateKeyPair() throws Exception {

    Security.addProvider(new BouncyCastleProvider());

    KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance(KEY_ALGORITHM, "BC"); // KeyPairGenerator初始化

    keyPairGen.initialize(2048); // Key大小

    return keyPairGen.generateKeyPair(); // 生成KeyPair

  }

  public static String encrypt(String dataStr, String publicKeyStr) throws Exception {

    Security.addProvider(new BouncyCastleProvider());

    Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding"); // Cipher初始化

    byte[] publicKeyBytes = Base64.getDecoder().decode(publicKeyStr); // Base64解码PublicKey

    X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(publicKeyBytes); // 转换PublicKey

    KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);

    PublicKey publicKey = keyFactory.generatePublic(x509KeySpec);

    cipher.init(Cipher.ENCRYPT_MODE, publicKey);

    byte[] data = dataStr.getBytes();

    byte[] encryptedData = cipher.doFinal(data); // 加密

    return Base64.getEncoder().encodeToString(encryptedData); // Base64编码返回

  }

  public static String decrypt(String dataStr, String privateKeyStr) throws Exception {

    Security.addProvider(new BouncyCastleProvider());

    Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding"); // Cipher初始化

    byte[] privateKeyBytes = Base64.getDecoder().decode(privateKeyStr); // Base64解码PrivateKey

    PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(privateKeyBytes); // 转换PrivateKey

    KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);

    PrivateKey privateKey = keyFactory.generatePrivate(pkcs8KeySpec);

    cipher.init(Cipher.DECRYPT_MODE, privateKey);

    byte[] encryptedData = Base64.getDecoder().decode(dataStr); // Base64解码

    byte[] decryptedData = cipher.doFinal(encryptedData); // 解密

    return new String(decryptedData);

  }

  public static void main(String[] args) throws Exception {

    String dataStr = "Hello, world!";

    KeyPair keyPair = generateKeyPair();

    String publicKeyStr = Base64.getEncoder().encodeToString(keyPair.getPublic().getEncoded()); // 获取PublicKey

    String privateKeyStr = Base64.getEncoder().encodeToString(keyPair.getPrivate().getEncoded()); // 获取PrivateKey

    String encryptedDataStr = encrypt(dataStr, publicKeyStr);

    String decryptedDataStr = decrypt(encryptedDataStr, privateKeyStr);

    System.out.println("原始数据:" + dataStr);

    System.out.println("加密后的数据:" + encryptedDataStr);

    System.out.println("解密后的数据:" + decryptedDataStr);

  }

}

二、总结

Java提供了很多种加密算法,我们可以根据需求选择合适的加密算法进行使用。本文介绍了常用的MD5、DES、RSA加密算法,涵盖了对称加密算法、非对称加密算法和摘要算法,同时提供了示例代码以便读者参考。加强数据加密安全也是我们应该优先考虑的问题之一。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复