首页 > 编程语言 >Java:使用javax.crypto.Cipher的AES算法实现数据加密解密

Java:使用javax.crypto.Cipher的AES算法实现数据加密解密

时间:2023-09-03 12:31:46浏览次数:34  
标签:AES Java String cipherText crypto Cipher import cipher


AES算法加密

String algorithm = "AES/ECB/PKCS5Padding"; // 定义加密算法
String key = "1234567890123456"; // 这是待加密的信息

String message = "Hello World."; // 这是待加密的信息

Cipher cipher = Cipher.getInstance(algorithm);
cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(key.getBytes(), "AES"));
String cipherText = Base64.getEncoder().encodeToString(cipher.doFinal(message.getBytes(Charset.forName("UTF-8"))));
System.out.println(cipherText);
// yjXK0enYB9AJify1rjMJMA==

AES算法解密

String algorithm = "AES/ECB/PKCS5Padding"; // 定义加密算法
String secretKey = "1234567890123456"; // 这是待加密的信息

String cipherText = "yjXK0enYB9AJify1rjMJMA==";

// 将Base64编码的密文解码
byte[] encrypted = Base64.getDecoder().decode(cipherText);

Cipher cipher = Cipher.getInstance(algorithm);
SecretKeySpec key = new SecretKeySpec(secretKey.getBytes(), "AES");
cipher.init(Cipher.DECRYPT_MODE, key);

byte[] decryptBytes = cipher.doFinal(encrypted);

String message = new String(decryptBytes);
System.out.println(message);
// Hello World.

完整代码

package com.example.demo;

import org.junit.Test;

import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.Charset;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.Base64;

public class CipherTest {
    @Test
    public void decrypt() throws NoSuchPaddingException, NoSuchAlgorithmException, BadPaddingException, IllegalBlockSizeException, InvalidKeyException {

        String algorithm = "AES/ECB/PKCS5Padding"; // 定义加密算法
        String secretKey = "1234567890123456"; // 这是待加密的信息

        String cipherText = "yjXK0enYB9AJify1rjMJMA==";
        // 将Base64编码的密文解码
        byte[] encrypted = Base64.getDecoder().decode(cipherText);

        Cipher cipher = Cipher.getInstance(algorithm);
        SecretKeySpec key = new SecretKeySpec(secretKey.getBytes(), "AES");
        cipher.init(Cipher.DECRYPT_MODE, key);

        byte[] decryptBytes = cipher.doFinal(encrypted);

        String message = new String(decryptBytes);
        System.out.println(message);
        // Hello World.
    }

    @Test
    public void encrypt() throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException {
        String algorithm = "AES/ECB/PKCS5Padding"; // 定义加密算法
        String key = "1234567890123456"; // 这是待加密的信息

        String message = "Hello World."; // 这是待加密的信息

        Cipher cipher = Cipher.getInstance(algorithm);
        cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(key.getBytes(), "AES"));
        String cipherText = Base64.getEncoder().encodeToString(cipher.doFinal(message.getBytes(Charset.forName("UTF-8"))));
        System.out.println(cipherText);
        // yjXK0enYB9AJify1rjMJMA==
    }
}

参考


标签:AES,Java,String,cipherText,crypto,Cipher,import,cipher
From: https://blog.51cto.com/mouday/7339469

相关文章

  • Java中为什么加了一个类,引用不到呢
    在Java中,如果你加入了一个新的类但无法引用到它,可能是由以下几个原因引起的:缺少导入语句:如果你新增的类位于另一个包中,或者是外部的第三方库类,你需要使用import语句将其导入到当前的Java文件中。例如:importcom.example.MyClass;。确保导入语句正确并且没有拼写错误。类不在类路径......
  • Java常用四大线程池用法以及ThreadPoolExecutor详解(转)
    为什么用线程池?1.创建/销毁线程伴随着系统开销,过于频繁的创建/销毁线程,会很大程度上影响处-理效率2.线程并发数量过多,抢占系统资源从而导致阻塞3.对线程进行一些简单的管理在Java中,线程池的概念是Executor这个接口,具体实现为ThreadPoolExecutor类,学习Java中的线程池,就可以......
  • 无涯教程-JavaScript - NEGBINOMDIST函数
    NEGBINOMDIST函数取代了Excel2010中的NEGBINOM.DIST函数。描述该函数返回负二项式分布。NEGBINOMDIST返回在第number_s次成功之前出现number_f次失败的概率,而成功的恒定概率是概率_s。该函数与二项式分布相似,不同之处在于成功次数是固定的,而试验次数是可变的。像二项式一......
  • 一键配置Java环境变量
    后缀改成bat运行@echooffsetJAVA_HOME=D:\ProgramFiles\Java\jdk-11setPATH=%PATH%;%%JAVA_HOME%%\bin;%%JAVA_HOME%%\jre\binsetCLASSPATH=.;%%JAVA_HOME%%\lib\dt.jar;%%JAVA_HOME%%\lib\tools.jarsetRegV=HKLM\SYSTEM\CurrentControlSet\Control\Ses......
  • java线程池七大参数(转)
    转:https://blog.csdn.net/ye17186/article/details/89467919从源码来看,线程池构造有七个参数,corePoolSize,maximumPoolSize,keepAliveTime,unit,workQueue,threadFactory,handler一、corePoolSize核心线程池大小,线程池会维护一个最小线程数量,即使这些线程空闲,也不会被销......
  • JavaScript-console 对象
    console对象console对象是JavaScript的原生对象,它有点像Unix系统的标准输出stdout和标准错误stderr,可以输出各种信息到控制台,并且还提供了很多有用的辅助方法。console的常见用途有两个。调试程序,显示网页代码运行时的错误信息。提供了一个命令行接口,用来与网页代码互动。cons......
  • 无涯教程-JavaScript - MODE函数
    MODE函数取代了Excel2010中的MODE.SNGL函数。描述该函数返回数组或数据范围中最频繁出现或重复的值。语法MODE(number1,[number2],...)争论Argument描述Required/OptionalNumber1Thefirstnumberargumentforwhichyouwanttocalculatethemode.RequiredNu......
  • Java入门(02):Java的环境配置
    前言Java是一门广泛应用于各种场景的编程语言,不同于其它编程语言,Java的代码需要在Java虚拟机(JavaVirtualMachine,JVM)上运行,因此在学习和使用Java时,我们需要先进行Java环境的配置。本文将介绍Java环境的配置方法,包括JDK和IDE的安装与配置。摘要本文主要涵盖以下内容:JDK的安......
  • 普通Java项目使用lombok的注解
    1手动导入jar包2编译不通过,修改如下设置-Djps.track.ap.dependencies=false......
  • Java中的各种锁
    悲观锁、乐观锁、公平锁、非公平锁、独享锁、共享锁、可重入锁、自旋锁、偏向锁、轻量/重量级锁、读写锁、各种锁面试必备:深入了解Java中乐观锁和悲观锁的秘密(qq.com)通俗易懂悲观锁、乐观锁、可重入锁、自旋锁、偏向锁、轻量/重量级锁、读写锁、各种锁及其Java实现!(qq.co......