当前位置: 首页 > article >正文

基于Cipher的Java加密工具类

一、什么是Cipher

        Cipher是一种用于加密和解密信息的算法或方法。它将原始的明文转化为密文,从而保护信息的安全性和机密性。使用密码学中的数学原理和技术,Cipher可以对数据进行加密处理,使其在传输或存储过程中对未授权的访问者不可读。在必要时,只有具有正确密钥或密码的人才能解密并获取原始的明文信息。

        Cipher可以分为对称加密和非对称加密两种类型。对称加密使用相同的密钥进行加密和解密,速度较快,但密钥管理较为复杂。而非对称加密使用一对密钥,私钥用于解密,公钥用于加密,在安全性上更加可靠,但运算速度较慢。

        实际应用中,Cipher被广泛应用于保护敏感数据的传输,如网上银行、电子商务、密码学通信等领域。通过使用Cipher,可以保护个人隐私、防止信息被窃取或篡改,提高数据的安全性和机密性。

二、Java中的Cipher类

       在Java中,Cipher是一个提供加密和解密功能的类。它位于javax.crypto包下,用于实现各种加密算法。Cipher类可以用于对数据进行加密和解密操作,同时还可以进行数字签名和验签。

代码示例:

package com.blockchain.qgy.demo.cipherdemo;

import javax.crypto.*;
import javax.crypto.spec.SecretKeySpec;
import java.security.AlgorithmParameters;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.Provider;
import java.util.Arrays;
import java.util.Random;

public class CipherDemo {
    public static void main(String[] args) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException {
        //密钥
        StringBuilder sb = new StringBuilder("QGY");
        while(sb.length() < 8) {
            sb.append((char)new Random().nextInt(128));
        }
        byte[] keyBytes = sb.toString().getBytes();
        //生成密钥
        SecretKey key = new SecretKeySpec(keyBytes,"DES");
        System.out.println("密钥:"+key);
        Cipher instance = Cipher.getInstance("DES");
        System.out.println("初始化Cipher对象");
        instance.init(Cipher.ENCRYPT_MODE,key);
        System.out.println("Cipher对象:"+instance);
        Provider provider = instance.getProvider();
        System.out.println("Cipher对象提供者:"+provider);
        String algorithm = instance.getAlgorithm();
        System.out.println("Cipher对象的算法名称:"+algorithm);
        int blockSize = instance.getBlockSize();
        System.out.println("返回块的大小:"+blockSize);
        byte[] iv = instance.getIV();
        System.out.println("返回新缓冲区的初始化向量:"+iv);
        AlgorithmParameters parameters = instance.getParameters();
        System.out.println("返回Cipher使用的参数:"+parameters);
        ExemptionMechanism exemptionMechanism = instance.getExemptionMechanism();
        System.out.println("Cipher使用的豁免机制对象:"+exemptionMechanism);
        byte[] bytes = instance.doFinal(new byte[]{'Q', 'G', 'Y'});
        System.out.println("bytes:"+Arrays.toString(bytes));
        System.out.println("bytes->update:"+Arrays.toString(instance.update(bytes)));
    }
}

上面是一个Cipher类加密的简单示例,在Cipher类中常用的常量字段有7个:

  1. public static final int ENCRYPT MODE:用于将 Cipher 初始化为加密模式的常量。
  2. public static final int DECRYPT MODE:用于将 Cipher 初始化为解密模式的常量。
  3. public static fnal int WRAP MODE:用于将 Cipher 初始化为密钥包装模式的常量。
  4. public static finalint UNWRAP MODE:用于将 Cipher 初始化为密钥解包模式的常量。
  5. public static final int PUBLIC KEY:用于表示要解包的密钥为“公钥”的常量。
  6. public static final int PRIVATE KEY:用于表示要解包的密钥为“私钥”的常量。
  7. public static final intSECRET KEY:用于表示要解包的密钥为“秘密密钥”的常量。

三、封装好的加密工具类

加密工具类:

package com.blockchain.qgy.util;

import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

import javax.crypto.*;
import javax.crypto.spec.DESKeySpec;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.spec.InvalidKeySpecException;

/**
 * 基于Cipher实现的加密和解密工具类
 *
 * @author QGY
 *
 */
public class DeEnCoderCipherUtil {
    //加密、解密模式,即加密算法名称
    private final static String CIPHER_MODE = "DES";

    //DES密钥
    private static String DEFAULT_DES_KEY = "主播主播,你的MD5加密确实很强,但还是太吃操作了,有没有更加简单和强势的加密工具推荐一下,有的兄弟,有的,这就是当前版本T0.5的强势加密算法";

    /**
     * 不允许创建对象
     */
    private DeEnCoderCipherUtil(){

    }

    /**
     * function 字符串加密方法
     *
     * @param plaintext:要加密的字符串
     * @param key:密钥
     * @return 加密后的字符串
     */
    public static String getCipherText(String plaintext,String key){
        //判断入参是否正确
        if(Strings.isNullOrEmpty(plaintext) || Strings.isNullOrEmpty(key)) return null;

        try{
            byte[] cipherText = getCipherText(plaintext.getBytes(), key.getBytes());
            return new BASE64Encoder().encode(cipherText);
        } catch (Exception e){
            e.printStackTrace();
        }

        return null;
    }

    /**
     * function 字节加密方法
     *
     * @param plaintext:要加密的字节
     * @param key:密钥
     * @return 加密后的字节
     */
    private static byte[] getCipherText(byte[] plaintext,byte[] key) throws InvalidKeyException, NoSuchAlgorithmException, InvalidKeySpecException, NoSuchPaddingException, BadPaddingException, IllegalBlockSizeException {
        //1.生成随机数
        SecureRandom random = new SecureRandom();

        //2.基于密钥数据创建DESKeySpec对象
        DESKeySpec desKeySpec = new DESKeySpec(key);

        //3.创建密钥工厂,将DESKeySpec转换成SecretKey对象来保存对称密钥
        SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(CIPHER_MODE);
        SecretKey secretKey = keyFactory.generateSecret(desKeySpec);

        //4.Cipher对象进行加密
        Cipher cipher = Cipher.getInstance(CIPHER_MODE);

        //5.初始化Cipher对象
        cipher.init(Cipher.ENCRYPT_MODE,secretKey,random);

        //返回密文
        return cipher.doFinal(plaintext);
    }

    public static String getPlainText(String cipherText,String key){
        //判断入参
        if(Strings.isNullOrEmpty(cipherText) ||  Strings.isNullOrEmpty(key)) return null;

        try{
            BASE64Decoder decoder = new BASE64Decoder();
            return new String(getPlainText(decoder.decodeBuffer(cipherText),key.getBytes()));
        }catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    private static byte[] getPlainText(byte[] cipherText,byte[] key) throws InvalidKeyException, NoSuchAlgorithmException, InvalidKeySpecException, NoSuchPaddingException, BadPaddingException, IllegalBlockSizeException {
        //1.生成随机数
        SecureRandom random = new SecureRandom();

        //2.基于密钥数据创建DESKeySpec对象
        DESKeySpec desKeySpec = new DESKeySpec(key);

        //3.创建密钥工厂,将DESKeySpec转换成SecretKey对象来保存对称密钥
        SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(CIPHER_MODE);
        SecretKey secretKey = keyFactory.generateSecret(desKeySpec);

        //4.Cipher对象进行解密
        Cipher cipher = Cipher.getInstance(CIPHER_MODE);

        //5.初始化Cipher对象
        cipher.init(Cipher.DECRYPT_MODE,secretKey,random);

        //返回明文
        return cipher.doFinal(cipherText);
    }
}

strings工具类:

package com.blockchain.qgy.util;

import java.util.Objects;

/**
 * 字符串工具类
 *
 * @author QGY
 *
 */
public class Strings {

    /**
     * 判断字符串是否为空或null
     *
     * @param string
     * @return 布尔值
     */
    public static Boolean isNullOrEmpty(String string){
        if (Objects.isNull(string)) return true;
        if (string.isEmpty()) return true;
        return false;
    }
}

注意:这里密钥的长度为8,如果有其他需求可以通过进一步封装达到自身需求 


http://www.kler.cn/a/525381.html

相关文章:

  • 128周二复盘(164)学习任天堂
  • 项目部署(springboot项目)
  • UE求职Demo开发日志#15 思路与任务梳理、找需要的资源
  • csapp2.4节——浮点数
  • LLM架构与优化:从理论到实践的关键技术
  • 树状数组讲解
  • C++11新特性之使用using(代替typedef)定义别名
  • CAPL与外部接口
  • ORA-04031 错误
  • 简要介绍C语言和c++的共有变量,以及c++特有的变量
  • 亚博microros小车-原生ubuntu支持系列:16 机器人状态估计
  • Windows安装Milvus
  • 四.3 Redis 五大数据类型/结构的详细说明/详细使用( hash 哈希表数据类型详解和使用)
  • JavaScript网页设计案例(任务管理器)
  • 芯片AI深度实战:基础篇之langchain
  • 不背单词快捷键(不背单词键盘快捷键)
  • 自制插件扩宽“文章区间“样式插件
  • JAVA学习-练习试用Java实现“使用Swing创建一个简单的窗口”
  • 【PySide6快速入门】qrc资源文件的使用
  • golang学习教程
  • Python NumPy(7):连接数组、分割数组、数组元素的添加与删除
  • pytorch使用SVM实现文本分类
  • 17、Spring MVC 框架:构建强大的 Java Web 应用程序
  • APL语言的正则表达式
  • Java创建项目准备工作
  • [答疑]DDD伪创新哪有资格和仿制药比