首页 > 编程语言 >DES对称加密算法Java实现

DES对称加密算法Java实现

时间:2023-11-14 11:11:05浏览次数:32  
标签:Java String DES secretKey static return byte data 加密算法

DES对称加密算法Java实现

源代码AESUtils.java

//package me.muphy.util;

import javax.crypto.*;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.util.Base64;

public class AESUtils {
    private static final String AES = "AES";
    private static SecretKey secretKey = null;

    public static SecretKey getSecretKey() throws NoSuchAlgorithmException {
        if (secretKey != null) {
            return secretKey;
        }
        KeyGenerator keyGenerator = KeyGenerator.getInstance(AES);
        keyGenerator.init(new SecureRandom());//不使用种子,每次生成的都不同,可以不要
        secretKey = keyGenerator.generateKey();
        return secretKey;
    }

    public static String encrypt(String data) throws InvalidKeyException, NoSuchAlgorithmException, NoSuchPaddingException, IllegalBlockSizeException, BadPaddingException {
        SecretKey secretKey = getSecretKey();
        return encrypt(data, secretKey);
    }

    public static String encrypt(String data, String secret) throws InvalidKeyException, NoSuchAlgorithmException, NoSuchPaddingException, IllegalBlockSizeException, BadPaddingException {
        SecretKey secretKey = toSecretKey(secret);
        return encrypt(data, secretKey);
    }

    public static String encrypt(String data, SecretKey secretKey) throws InvalidKeyException, NoSuchAlgorithmException, NoSuchPaddingException, IllegalBlockSizeException, BadPaddingException {
        Cipher cipher = Cipher.getInstance(AES);
        cipher.init(Cipher.ENCRYPT_MODE, secretKey);
        byte[] bytes = data.getBytes(StandardCharsets.UTF_8);
        byte[] encryptedData = cipher.doFinal(bytes);
        return base64Encrypt(encryptedData);
    }

    public static String decrypt(String data) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException {
        SecretKey secretKey = getSecretKey();
        return decrypt(data, secretKey);
    }

    public static String decrypt(String data, String secret) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException {
        SecretKey secretKey = toSecretKey(secret);
        return decrypt(data, secretKey);
    }

    public static String decrypt(String data, SecretKey secretKey) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException {
        Cipher cipher = Cipher.getInstance(AES);
        cipher.init(Cipher.DECRYPT_MODE, secretKey);
        byte[] base64Decrypt = base64Decrypt(data);
        byte[] decryptedData = cipher.doFinal(base64Decrypt);
        return new String(decryptedData, StandardCharsets.UTF_8);
    }

    private static String base64Encrypt(byte[] bytes) {
        byte[] encode = Base64.getEncoder().encode(bytes);
        return new String(encode, StandardCharsets.UTF_8);
//        return  new BASE64Encoder().encode(bytes);
    }

    private static byte[] base64Decrypt(String data) {
        byte[] bytes = data.getBytes(StandardCharsets.UTF_8);
        return Base64.getDecoder().decode(bytes);
//        return  new BASE64Decoder().decodeBuffer(data);
    }

    private static SecretKey toSecretKey(String secret) {
        byte[] decodedKey = Base64.getDecoder().decode(secret);
        return new SecretKeySpec(decodedKey, 0, decodedKey.length, "AES");
    }

    private static String toSecretString(SecretKey secretKey) {
        byte[] encoded = secretKey.getEncoded();
        return Base64.getEncoder().encodeToString(encoded);
    }

    public static void main(String[] args) {
        try {
            String s1 = "hello zian 1";
            String es1 = encrypt(s1);
            String ds1 = decrypt(es1);
            System.out.println(s1 + " = 加密:" + es1 + ",解密:" + ds1);

            String s2 = "hello zian 2";
            String secret = "yKCzTJcIfnrHVNLR5Xo6zw==";
            String es2 = encrypt(s2, secret);
            String ds2 = decrypt(es2, secret);
            System.out.println(s2 + " = 加密:" + es2 + ",解密:" + ds2);
        } catch (NoSuchAlgorithmException | NoSuchPaddingException | InvalidKeyException | IllegalBlockSizeException | BadPaddingException e) {
            e.printStackTrace();
        }
    }
}

测试结果

标签:Java,String,DES,secretKey,static,return,byte,data,加密算法
From: https://www.cnblogs.com/muphy/p/17831170.html

相关文章

  • Java复制文件的4种方式及拷贝文件到另一个目录下的实例代码
    尽管Java提供了一个可以处理文件的IO操作类。但是没有一个复制文件的方法。复制文件是一个重要的操作,当你的程序必须处理很多文件相关的时候。然而有几种方法可以进行Java文件复制操作,下面列举出4中最受欢迎的方式。1.使用FileStreams复制这是最经典的方式将一个文件的内容复......
  • Java表达式引擎选型调研分析
    1简介我们项目组主要负责面向企业客户的业务系统,企业的需求往往是多样化且复杂的,对接不同企业时会有不同的定制化的业务模型和流程。我们在业务系统中使用表达式引擎,集中配置管理业务规则,并实现实时决策和计算,可以提高系统的灵活性和响应能力,从而更好地满足业务的需求。举个简......
  • Java中ThreadLocal说明 使用线程内变量,完成后需调用remove()方法将其移除,即使异常也
    Java中ThreadLocal说明,完成后需调用remove()方法将其移除,即使异常也记得remove()回收,创建ThreadLocal线程变量publicstaticThreadLocalthreadLocal=newThreadLocal<>();1、ThreadLocal是什么ThreadLocal,即线程变量,是一个以ThreadLocal对象为键、任意对象为值的存储......
  • finalshell报错java.net.UnknownHostException: node2
    前几天是node3连不上,今天早上写作业发现node2又连不上了]$systemctlstatusnetwork.service●network.service-LSB:Bringup/downnetworkingLoaded:loaded(/etc/rc.d/init.d/network;bad;vendorpreset:disabled)Active:active(exited)since二2023-11-1408:......
  • Java开发者的Python快速进修指南:函数基础
    话不多说,今天我们要介绍的是函数。本系列文章追求短而精,今天我们将重点讨论函数以及与Java方法的区别。与Java方法不同,函数不需要像Java方法一样讲究修饰符等其他特性,它只需要使用"def"关键字进行声明。另外,函数的参数也与Java方法有所不同,Java方法中不存在默认参数的概念,而在Pyth......
  • java如何配置环境变量?详细一点每一个步骤
    配置Java环境变量的步骤在不同操作系统中有所不同。以下是在Windows和Linux系统中配置Java环境变量的详细步骤:在Windows系统中配置Java环境变量下载并安装JavaJDK访问Oracle官网下载JavaDevelopmentKit JDK���。安装JDK,记住安装路径。设置JAVA_HOME环境变量打开“......
  • Java 集合—LinkedList
    链表(Linkedlist)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的地址。经常被拿来和 ArrayList 做比较。关于 LinkedList 和ArrayList的详细对比双向链表不过,我们在项目中一般是不会使用到LinkedList的,需要用到Link......
  • windows 10 安装ubuntu+docker(不安装desktop docker)步骤
    windows10安装ubuntu+docker(不安装desktopdocker)步骤1.安装wsl2,ubuntu22.04参考网络文档2.powershell里运行wsl3.sudo-i4.curl-fsSLhttps://get.docker.com-oget-docker.sh5.shget-docker.sh6.servicedockerstart7.在2.1通过脚本安装docker时,会出现下面这个问......
  • java继承
    测试一下java中子类中实现了之后,会不会还会调用父类的构造方法 1.父类的构造方法会在子类构造方法中逻辑执行之前执行2.子类的构造方法中不显式调用父类的构造方法时,调用的是无参构造3.如果显式调用的话,父类的构造方法必须在第一行执行4.如果父类的构造方法中没有无参构造,需......
  • Java的内部类区别
    一.成员内部类成员内部类是创建在一个类的中的,它的位置和此类的属性是同一级的,可以说是它的成员类,或成员属性特点:成员内部类可以访问外部类的静态属性,也可以访问其外部非静态属性类方法如果要去访问其成员内部类的方法,还是需要才此类中去创建对象,实例化成员内部类,然后调用在......