Java加密解密工具类详解

一、MD5加密解密工具类

MD5加密算法是一种常见的加密算法,通常用于对密码、数字签名等敏感信息进行加密处理,以确保数据的安全性。在Java编程中,我们可以使用如下的工具类来实现MD5加密解密功能:

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class EncryptUtil {
    
    public static final String KEY_MD5 = "MD5";
 
    public static String encryptMD5(String data) {
        byte[] inputData = data.getBytes();
        MessageDigest md;
        String md5Str = "";
        try {
            md = MessageDigest.getInstance(KEY_MD5);
            byte[] md5Bytes = md.digest(inputData);
            md5Str = toHexString(md5Bytes);
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        return md5Str;
    }
    
    private static String toHexString(byte[] byteArray) {
        StringBuilder hexString = new StringBuilder();
        for (byte b : byteArray) {
            String hex = Integer.toHexString(0xFF & b);
            if (hex.length() == 1) {
                hexString.append('0');
            }
            hexString.append(hex);
        }
        return hexString.toString();
    }
}

首先,我们定义了一个常量KEY_MD5,表示使用MD5算法进行加密;然后,通过encryptMD5()方法,传入需要加密的数据进行处理;toHexString()方法将加密后的字节数组以十六进制的形式返回。

在使用时,只需要将需要加密的原始数据传入encryptMD5()方法中即可:

String encryptedStr = EncryptUtil.encryptMD5("password");

以上代码将会把字符串”password”进行MD5加密,并返回加密后的字符串。

二、Base64编码解码工具类

Base64编码是一种用于将任意二进制数据编码成纯文本的方法,通常用于在HTTP协议传输中发送明文字符串。在Java编程中,我们可以使用如下的Base64工具类来实现编码解码功能:

import java.util.Base64;

public class EncodeUtil {
    
    public static String encode(String data) {
        return Base64.getEncoder().encodeToString(data.getBytes());
    }
    
    public static String decode(String encodedStr) {
        byte[] decodedBytes = Base64.getDecoder().decode(encodedStr);
        return new String(decodedBytes);
    }
}

以上代码通过调用Java 8提供的Base64 API实现了编码解码功能。在encode()方法中,我们将字符串转换为二进制数据后通过Base64.getEncoder()进行编码,并将结果以字符串形式返回;在decode()方法中,对Base64编码后的字符串进行解码,并将结果转换为字符串返回。以下是使用示例:

String encodedStr = EncodeUtil.encode("hello world");
String decodedStr = EncodeUtil.decode(encodedStr);

以上代码将会对字符串”hello world”进行Base64编码,并将结果转换为字符串。接着再对编码后的字符串进行解码,得到原始的字符串。

三、AES加密解密工具类

AES(Advanced Encryption Standard)是一种常用的对称加密算法,通常用于加密敏感信息以保证数据的安全性。在Java编程中,我们可以使用如下的AES工具类来实现加密解密功能:

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;

public class AESUtil {
    
    private static final String AES = "AES";
    
    private static SecretKeySpec generateKey(String password) throws Exception {
        KeyGenerator keyGenerator = KeyGenerator.getInstance(AES);
        keyGenerator.init(128);
        SecretKey secretKey = keyGenerator.generateKey();
        byte[] enCodeFormat = secretKey.getEncoded();
        return new SecretKeySpec(enCodeFormat, AES);
    }

    public static String encrypt(String data, String password) throws Exception {
        SecretKeySpec secretKeySpec = generateKey(password);
        Cipher cipher = Cipher.getInstance(AES);// 创建密码器  
        cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);// 初始化  
        byte[] result = cipher.doFinal(data.getBytes("UTF-8")); 
        return toHexString(result); // 加密  
    }
  
    public static String decrypt(String data, String password) throws Exception {
        SecretKeySpec secretKeySpec = generateKey(password);
        Cipher cipher = Cipher.getInstance(AES);// 创建密码器  
        cipher.init(Cipher.DECRYPT_MODE, secretKeySpec);// 初始化  
        byte[] result = cipher.doFinal(hexStringToBytes(data)); // 加密  
        return new String(result,"UTF-8"); // 解密  
    }
    
    private static byte[] hexStringToBytes(String hexString) {
        if (hexString == null || hexString.equals("")) {
            return null;
        }
        hexString = hexString.toUpperCase();
        int length = hexString.length() / 2;
        char[] hexChars = hexString.toCharArray();
        byte[] d = new byte[length];
        for (int i = 0; i < length; i++) {
            int pos = i * 2;
            d[i] = (byte) (charToByte(hexChars[pos]) << 4 | charToByte(hexChars[pos + 1]));
        }
        return d;
    }
    
    private static byte charToByte(char c) {
        return (byte) "0123456789ABCDEF".indexOf(c);
    }
    
    private static String toHexString(byte[] byteArray) {
        StringBuilder hexString = new StringBuilder();
        for (byte b : byteArray) {
            String hex = Integer.toHexString(0xFF & b);
            if (hex.length() == 1) {
                hexString.append('0');
            }
            hexString.append(hex);
        }
        return hexString.toString();
    }
}

在AESUtil类中,我们定义了一个常量AES表示使用AES加密算法进行加密;generateKey()方法用于生成加密密钥;encrypt()方法将原始数据进行AES加密后返回加密结果;decrypt()方法用于将加密后的数据进行解密。使用示例:

String encryptedStr = AESUtil.encrypt("Hello World", "password");
String decryptedStr = AESUtil.decrypt(encryptedStr, "password");

这里的encrypt()和decrypt()方法分别用于加密和解密原始数据。首先,我们将需要加密的数据和密钥传入encrypt()方法中,得到加密后的字符串;然后再将加密后的字符串和密钥传入decrypt()方法中,得到原始字符串。

四、RSA加密解密工具类

RSA(Rivest-Shamir-Adleman)是一种非对称加密算法,通常用于加密较小长度的文本或数据传输中的密钥。在Java编程中,我们可以使用如下的RSA工具类来实现加密解密功能:

import java.security.Key;
import java.security.KeyFactory;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import javax.crypto.Cipher;

public class RSAUtil {
    
    private static final String RSA = "RSA";
    
    /**
     * 生成密钥对
     */
    public static KeyPair generateKeyPair() throws NoSuchAlgorithmException {
        KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(RSA);
        keyPairGenerator.initialize(1024);
        return keyPairGenerator.generateKeyPair();
    }
    
    /**
     * 从公钥中获取公钥对象
     */
    public static PublicKey getPublicKey(byte[] publicKey) throws NoSuchAlgorithmException, InvalidKeySpecException {
        X509EncodedKeySpec publicKeySpec = new X509EncodedKeySpec(publicKey);
        KeyFactory keyFactory = KeyFactory.getInstance(RSA);
        return keyFactory.generatePublic(publicKeySpec);
    }
    
    /**
     * 从私钥中获取私钥对象
     */
    public static PrivateKey getPrivateKey(byte[] privateKey) throws NoSuchAlgorithmException, InvalidKeySpecException {
        PKCS8EncodedKeySpec privateKeySpec = new PKCS8EncodedKeySpec(privateKey);
        KeyFactory keyFactory = KeyFactory.getInstance(RSA);
        return keyFactory.generatePrivate(privateKeySpec);
    }
    
    /**
     * 公钥加密
     */
    public static byte[] encrypt(byte[] data, PublicKey publicKey) throws Exception {
        Cipher cipher = Cipher.getInstance(RSA);
        cipher.init(Cipher.ENCRYPT_MODE, publicKey);
        return cipher.doFinal(data);
    }
    
    /**
     * 私钥解密
     */
    public static byte[] decrypt(byte[] data, PrivateKey privateKey) throws Exception {
        Cipher cipher = Cipher.getInstance(RSA);
        cipher.init(Cipher.DECRYPT_MODE, privateKey);
        return cipher.doFinal(data);
    }
    
    /**
     * 获取公钥密钥字符串
     */
    public static String getKeyString(Key key) {
        byte[] keyBytes = key.getEncoded();
        return toHexString(keyBytes);
    }
    
    private static String toHexString(byte[] byteArray) {
        StringBuilder hexString = new StringBuilder();
        for (byte b : byteArray) {
            String hex = Integer.toHexString(0xFF & b);
            if (hex.length() == 1) {
                hexString.append('0');
            }
            hexString.append(hex);
        }
        return hexString.toString();
    }
}

在RSAUtil类中,我们定义了一个常量RSA表示使用RSA非对称加密算法进行加密;generateKeyPair()方法用于生成公钥和私钥对;getPublicKey()方法使用公钥的字节数组获取公钥对象;getPrivateKey()方法使用私钥的字节数组获取私钥对象;encrypt()方法将原始数据使用公钥进行加密后返回加密数据的字节数组;encrypt()方法将加密后的数据使用私钥进行解密后返回原始数据的字节数组。使用示例:

//生成公钥和私钥
KeyPair keyPair = RSAUtil.generateKeyPair();
PublicKey publicKey = keyPair.getPublic();
PrivateKey privateKey = keyPair.getPrivate();

//使用公钥对数据进行加密
byte[] encryptedData = RSAUtil.encrypt("Hello World".getBytes(), publicKey);

//使用私钥对加密后的数据进行解密
byte[] decryptedData = RSAUtil.decrypt(encryptedData, privateKey);

//将解密得到的字节数组转换为字符串
String decryptedStr = new String(decryptedData);

以上代码将会生成RSA公钥和私钥,并使用公钥对字符串”Hello World”进行加密,接着再使用私钥对加密后的数据进行解密,得到原始数据的字节数组,最后将字节数组转换为字符串形式输出。

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/232022.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2024-12-11 12:50
下一篇 2024-12-11 12:50

相关推荐

  • Java JsonPath 效率优化指南

    本篇文章将深入探讨Java JsonPath的效率问题,并提供一些优化方案。 一、JsonPath 简介 JsonPath是一个可用于从JSON数据中获取信息的库。它提供了一种DS…

    编程 2025-04-29
  • java client.getacsresponse 编译报错解决方法

    java client.getacsresponse 编译报错是Java编程过程中常见的错误,常见的原因是代码的语法错误、类库依赖问题和编译环境的配置问题。下面将从多个方面进行分析…

    编程 2025-04-29
  • Java Bean加载过程

    Java Bean加载过程涉及到类加载器、反射机制和Java虚拟机的执行过程。在本文中,将从这三个方面详细阐述Java Bean加载的过程。 一、类加载器 类加载器是Java虚拟机…

    编程 2025-04-29
  • Python字典去重复工具

    使用Python语言编写字典去重复工具,可帮助用户快速去重复。 一、字典去重复工具的需求 在使用Python编写程序时,我们经常需要处理数据文件,其中包含了大量的重复数据。为了方便…

    编程 2025-04-29
  • Java腾讯云音视频对接

    本文旨在从多个方面详细阐述Java腾讯云音视频对接,提供完整的代码示例。 一、腾讯云音视频介绍 腾讯云音视频服务(Cloud Tencent Real-Time Communica…

    编程 2025-04-29
  • Java Milvus SearchParam withoutFields用法介绍

    本文将详细介绍Java Milvus SearchParam withoutFields的相关知识和用法。 一、什么是Java Milvus SearchParam without…

    编程 2025-04-29
  • Java 8中某一周的周一

    Java 8是Java语言中的一个版本,于2014年3月18日发布。本文将从多个方面对Java 8中某一周的周一进行详细的阐述。 一、数组处理 Java 8新特性之一是Stream…

    编程 2025-04-29
  • Java判断字符串是否存在多个

    本文将从以下几个方面详细阐述如何使用Java判断一个字符串中是否存在多个指定字符: 一、字符串遍历 字符串是Java编程中非常重要的一种数据类型。要判断字符串中是否存在多个指定字符…

    编程 2025-04-29
  • AES加密解密算法的C语言实现

    AES(Advanced Encryption Standard)是一种对称加密算法,可用于对数据进行加密和解密。在本篇文章中,我们将介绍C语言中如何实现AES算法,并对实现过程进…

    编程 2025-04-29
  • VSCode为什么无法运行Java

    解答:VSCode无法运行Java是因为默认情况下,VSCode并没有集成Java运行环境,需要手动添加Java运行环境或安装相关插件才能实现Java代码的编写、调试和运行。 一、…

    编程 2025-04-29

发表回复

登录后才能评论