【java】Java Cryptography Extension (JCE)

news2024/9/22 23:36:38

在Java中,我们可以使用Java Cryptography Extension (JCE) 来实现加密和解密工具和技术。以下是一些常见的加密和解密技术及其示例代码:

1.使用AES加密和解密
package org.example.Test05;

import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import java.util.Arrays;
import java.util.Base64;

public class AESEncryption {
    private static final String ALGORITHM = "AES";

    public static String encrypt(String data, String key) throws Exception {
        Cipher cipher = Cipher.getInstance(ALGORITHM);
        SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes("UTF-8"), ALGORITHM);
        cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);
        byte[] encryptedBytes = cipher.doFinal(data.getBytes());
        return Base64.getEncoder().encodeToString(encryptedBytes);
    }

    public static String decrypt(String encryptedData, String key) throws Exception {
        Cipher cipher = Cipher.getInstance(ALGORITHM);
        SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes("UTF-8"), ALGORITHM);
        cipher.init(Cipher.DECRYPT_MODE, secretKeySpec);
        byte[] decryptedBytes = cipher.doFinal(Base64.getDecoder().decode(encryptedData));
        return new String(decryptedBytes);
    }

    public static void main(String[] args) throws Exception {
        String originKey = "zhegeshikey";
        byte[] extendedKey = Arrays.copyOf(originKey.getBytes("UTF-8"), 16); // 扩展到16字节
        String key = new String(extendedKey, "UTF-8");
        String encrypt = encrypt("test测试", key);
        System.out.println(encrypt);
        String decrypt = decrypt(encrypt, key);
        System.out.println(decrypt);
    }
}

在这里插入图片描述

2. 使用RSA加密和解密
package org.example.Test05;

import javax.crypto.Cipher;
import java.security.*;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.Base64;

public class RSAEncryption {
    private static final String ALGORITHM = "RSA";

    public static String encryptWithPublicKey(String data, String publicKey) throws Exception {
        Cipher cipher = Cipher.getInstance(ALGORITHM);
        cipher.init(Cipher.ENCRYPT_MODE, KeyFactory.getInstance(ALGORITHM).generatePublic(new X509EncodedKeySpec(Base64.getDecoder().decode(publicKey))));
        byte[] encryptedBytes = cipher.doFinal(data.getBytes());
        return Base64.getEncoder().encodeToString(encryptedBytes);
    }

    public static String decryptWithPrivateKey(String encryptedData, String privateKey) throws Exception {
        Cipher cipher = Cipher.getInstance(ALGORITHM);
        cipher.init(Cipher.DECRYPT_MODE, KeyFactory.getInstance(ALGORITHM).generatePrivate(new PKCS8EncodedKeySpec(Base64.getDecoder().decode(privateKey))));
        byte[] decryptedBytes = cipher.doFinal(Base64.getDecoder().decode(encryptedData));
        return new String(decryptedBytes);
    }

    public static void generateKeyPair() throws Exception {
        try {
            // 初始化KeyPairGenerator对象,‌并设置密钥对的算法
            KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
            // 初始化密钥对的生成,‌设置密钥大小为2048位
            keyPairGenerator.initialize(2048);
            // 生成密钥对
            KeyPair keyPair = keyPairGenerator.generateKeyPair();
            // 获取公钥
            PublicKey publicKey = keyPair.getPublic();
            // 获取私钥
            PrivateKey privateKey = keyPair.getPrivate();

            // 打印公钥和私钥
            System.out.println("Public Key: " + Base64.getEncoder().encodeToString(publicKey.getEncoded()));
            System.out.println("Private Key: " + Base64.getEncoder().encodeToString(privateKey.getEncoded()));
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) throws Exception {
        //generateKeyPair();
        String publicKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAjVxl+xGBFVo5Y8UESbtdPk1HmY8M2u6B9OEbTYVmaPu7jOLBrcthEy4twr9zfJ36/wB9DCrnPng6NU1ZICD7fIn4/ni8OwyPaXSsiF3KZGx/KXK2PgMeMq/Bor+4gH4C5OZVZc2+ocdi0lK4mzab593bwibmFBwGmgdt1Rn1c+dEr3pD3t47OnxSMcPjQlqQjWD90bxyOWqZGf0WxNxTMTClgPEzJMbjGKlwMtHGxsxwruXeuwfVZALn1/TdcuF1DwYQOR0Qak4OuYgTIKv5puQIhG/EF68ZiRhEwzj1eOn8bm0ThLXX/wuBdrlSwbXsrFzS60wuWJ19DvmeUYWF+wIDAQAB";
        String privateKey = "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCNXGX7EYEVWjljxQRJu10+TUeZjwza7oH04RtNhWZo+7uM4sGty2ETLi3Cv3N8nfr/AH0MKuc+eDo1TVkgIPt8ifj+eLw7DI9pdKyIXcpkbH8pcrY+Ax4yr8Giv7iAfgLk5lVlzb6hx2LSUribNpvn3dvCJuYUHAaaB23VGfVz50SvekPe3js6fFIxw+NCWpCNYP3RvHI5apkZ/RbE3FMxMKWA8TMkxuMYqXAy0cbGzHCu5d67B9VkAufX9N1y4XUPBhA5HRBqTg65iBMgq/mm5AiEb8QXrxmJGETDOPV46fxubROEtdf/C4F2uVLBteysXNLrTC5YnX0O+Z5RhYX7AgMBAAECggEAOQ5WSyQhidDE4TQgKvJpDEB86coHUkZ6RbCmKH/zeeRBKvhLXC5+nBNDfRtxLZdGO66iykp204wLUoBJvOITH41A5tUshFjpeZMSIGhazHXOTZhzXkw74BF4gowHmDVETcd6KIEGtJ2ZkXK5+EvuWYP+szqoGu3E7F6bQiwcGg9dxANxHA8lSNu28SudzXMtahkRn63PbdMDNCfPsb8bi/b7NUYuy7yCQprtN+nXa87RnaAYX34f9f8G0oahYUS1gLNh6UDlvl6bIOwAsKDQj/n8rAiaUiAFCBCpscNnC7MPLA8oUEQGrxZbVrisawRuDL+5UqOCRgY+RuH1F9Wx4QKBgQDotL2cYIVCl98IOP+kG2IJUnbNJTSxUL2hmCrO2COoBoaZeo8ScuQdciXgNKQoB85lfurgUfNX/xWl5NMAFXeDiZZ/mWsjVfJ0O9s+YB+IFCdeSS/h+emhp1ESvxhrC1lsDYDY3XHvUbGx81T7gDvV+h7TEi5N4lgY4GPDT+dEDwKBgQCbgt/BPdn77PhDYdgJzBrqR+XbbHfQIEfXk/yYHr+V4l17voVksU/XlR7z4U71Dpm6ZFc5aTXxJA5PNnn5KSvwdl5QH8O+PtwckQoSX/y8C/UF16HW8OHGT5YrX3nXM6uiY1bMcmutB/b00iGcPi2fc/oKWtTRsrHlqVZyMlRDVQKBgGp/dRthDPu6F4di1pQbOBW+GMKwGVpg8jhHNKgvQLpAKk+JSHsP+5gCSpU+YjYzxGCs4f9BYhXOlvCyNWKfcG/Rgv/ojaDBT9GkJyV3xlZ3qsC6y+AmiKbDtRXYQOuUaRtLXsFhLyhwgdtH2oezWy8FZiAA/RIF2X2hC+cx5Uw/AoGBAIaieNvRk76zO4EC3colpgu9MXiV4OkUeX5fhemhfVbjgvHWUaCKjkhjt0eHghdRi7A+nPF8cBIUmDrmPBWGGp91q1ONHKfBvkkRHPopliKr63ciZ+Ax7hYF40orv82b03WksYoRab2FTr5Iioa9ojwRaaG7X9Mo9TGTON9nSWJ9AoGAZ7PS5fYkzkFrH13MZEwZZ2bHMCfIrGGuRVmp4H8jNy1jwKKcI8tFTP2szYcKNslRB7CU5RxFL56en+oX8fY44CJITWq1QbQ11l9x4q+FzMw8AT3JOVkNpb9xhJPhEi2ApjSdDdGsRS4a9/EUeQRKjAGaZSBgN7STsEWyFy5EBak=";

        String encrypt = encryptWithPublicKey("test测试。。。", publicKey);
        System.out.println(encrypt);
        String decrypt = decryptWithPrivateKey(encrypt, privateKey);
        System.out.println(decrypt);
    }
}

在这里插入图片描述

3. 使用MessageDigest生成哈希值
package org.example.Test05;

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

public class Hashing {
    public static String generateSHA256Hash(String data) throws NoSuchAlgorithmException {
        MessageDigest md = MessageDigest.getInstance("SHA-256");
        md.update(data.getBytes());
        byte[] digest = md.digest();
        return bytesToHex(digest);
    }

    private static String bytesToHex(byte[] bytes) {
        StringBuilder hexString = new StringBuilder();
        for (byte b : bytes) {
            String hex = Integer.toHexString(0xff & b);
            if (hex.length() == 1) hexString.append('0');
            hexString.append(hex);
        }
        return hexString.toString();
    }

    public static void main(String[] args) throws NoSuchAlgorithmException {
        System.out.println(generateSHA256Hash("123"));
    }
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2050905.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

高效记录与笔记整理的策略:工具选择、结构设计与复习方法

✨✨ 欢迎大家来访Srlua的博文(づ ̄3 ̄)づ╭❤~✨✨ 🌟🌟 欢迎各位亲爱的读者,感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢,在这里我会分享我的知识和经验。&am…

【赵渝强老师】基于RBF的HDFS联邦架构

在最新的Hadoop版本中又实现了基于Router的联盟架构,并且在这个架构之上还实现了许多增强集群管理能力的特性。Router将挂载表从客户端中抽离了出来,解决了ViewFS存在的问题。   视频讲解如下: 基于RBF的HDFS联邦架构 【赵渝强老师】基于R…

基于Mediepipe的手势识别系统 | OpenCV | Mediapipe | C++ | QT | Python | C# | Unity

基于Mediapipe的手势识别系统 OpenCV、Mediapipe C (QT)、Python (PyCharm)、C# (Visual Studio) Unity 3D 登录界面 图片手势识别 视频文件手势识别 摄像头实时手势识别 演示视频 基于Mediapipe的手势识别系统

ESP32 分区表介绍

前言 个人邮箱:zhangyixu02gmail.com关于分区表,很多人看了很多资料很可能依旧是一脸懵逼。不知道各位有没有玩过 EEPROM,他可以断电保存数据。这里你也可以理解为分区表将 Flash 中划分出来了一个 EEPROM。虽然这样说从专业的角度是毫无疑问…

Ilya Sutskever 2023年伯克利大学演讲回顾:无监督学习与GPT的数学基础

引言 在2023年,OpenAI联合创始人之一的Ilya Sutskever在伯克利大学进行了一次极具影响力的演讲。这场演讲虽然内容复杂晦涩,但却被认为是人工智能发展历史上的一个重要里程碑。在演讲中,Sutskever深入探讨了无监督学习的数学依据&#xff0c…

即插即用的3D神经元注意算法

在快速发展的人工智能领域,科技的进步往往源于对复杂问题的突破性解决方案。如今,我们正站在一种激动人心的技术创新的前沿——即插即用的3D神经元注意算法。这一前沿技术不仅为计算神经科学提供了全新的视角,也为人工智能的未来打开了新的大…

elementplus 二次封装 select 自定义指令上拉加载更多 完美解决 多次接口调用 重新加载数据多次调用!!!

ps: 我封装的 select 实现了:1、上拉加载更多。2、远程搜索。3、单选多选。4、二次回显之前选择的数据。5、option 里面显示的内容自定义 如果有您想要实现的功能 可以私聊我 本文只讲解上拉触底加载更多 效果:(名字都是测试数据 随便乱写…

【数据结构】PTA 链式表的按序号查找 C语言

本题要求实现一个函数,找到并返回链式表的第K个元素。 函数接口定义: ElementType FindKth( List L, int K ); 其中List结构定义如下: typedef struct LNode *PtrToLNode; struct LNode {ElementType Data;PtrToLNode Next; }; typedef P…

Mysql原理与调优-Mysql的内存结构

1.绪论 前面说过InnoDB每次查询数据或者更新数据,都是先以16kb的大小将数据读取到内存中,然后对内存中的数据页进行操作。为了减少磁盘IO,Innodb的会先单独的申请一块连续的空间,将从磁盘中的数据页缓存到这片内存中。这片内存就…

数字化转型下的客户服务创新:智能、便捷、人性化

当今这个日新月异的数字时代,企业的竞争已不再局限于产品或服务的本身,而是延伸到了客户体验的每一个细微之处。数字化转型作为推动这一变革的重要力量,正深刻改变着客户服务的面貌,使之变得更加智能、便捷且充满人性化。 一、数字…

Xilinx 7系列收发器GTX入门讲解

目录 一、前言 二、芯片间数据传输技术发展 2.1 时钟/数据同步方式 三、 7系列GTX/GTH 3.1 GTXE2 3.2 Quad 3.3 GTXE2_CHANNEL 3.4 参考时钟结构 3.4.1 外部参考时钟 3.5 CPLL 3.6 QPLL 四、收发器GTX/GTH 4.1 发送器TX 4.2 接收器RX 4.3 TX与RX全流程分析 五、…

CeresPCL 岭回归拟合(曲线拟合)

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 由于在使用最小二乘插值拟合时,会涉及到矩阵求逆的操作,但是如果这个矩阵接近于奇异时,那么拟合的结果就会与我们期望的结果存在较大差距,因此就有学者提出在最小二乘的误差函数中添加正则项,即: 这里我们也可…

Catf1ag CTF Web(一)

前言 Catf1agCTF 是一个面向所有CTF(Capture The Flag)爱好者的综合训练平台,尤其适合新手学习和提升技能 。该平台由catf1ag团队打造,拥有超过200个原创题目,题目设计注重知识点的掌握,旨在帮助新手掌握C…

Pycharm远程连接服务器调试程序(包含VPN连接)

一、Ubuntu服务器使用指南 1、建立个人账户: sudo adduser yourname 2、个人账户中建立conda环境 1)将anaconda\miniconda安装包上传到服务器home\yourname目录下 2)bash安装miniconda 3)source .bashrc激活 3、MobaXterm连…

Spring Cloud Gateway 请求转发源码分析

一、背景 Spring Cloud Gateway 作为一种微服务网关组件,相信大家都不陌生,一个请求经过Spring Cloud Gateway是如何转发出去的,今天我们就来分析一下这部分的源码。 二、正文 下面这张图大家在学习Spring Cloud Gateway的时候肯定见过&am…

NASA数据集:DC-8 飞机上收集测量数据(冰原和永久冻土融化、雪反照率降低以及海盐气溶胶)

ARCTAS DC-8 Aircraft Merge Data 简介 ARCTAS_Merge_DC8_Aircraft_Data 是在 "从飞机和卫星收集对流层成分的北极研究 "亚轨道活动期间,从 DC-8 飞机上收集测量数据的各种现场仪器中预先生成的合并文件。该产品的数据收集工作已经完成。 北极是了解气…

网络编程-阻塞、非阻塞、多路复用、Selector对于accept、read、write事件监听实现详解

阻塞 理论 阻塞模式下,相关方法(accept、read、write)都会导致线程暂停。 ServerSocketChannel.accept 会在没有连接建立时让线程暂停。SocketChannel.read 会在没有数据可读时让线程暂停。阻塞的表现其实就是线程暂停了,暂停期…

Spring 解决bean的循环依赖

Spring循环依赖-博客园 1. 什么是循环依赖 2. 循环依赖能引发什么问题 循环依赖可能引发以下问题: 初始化顺序不确定:循环依赖导致无法确定哪个对象应该先被创建和初始化,从而造成初始化顺序的混乱。这可能导致错误的结果或意外的行为。死…

YouTube 创作者起诉 Nvidia 和 OpenAI

- **YouTube 创作者 David Millette**:一位 YouTube 创作者 David Millette 起诉了 AI 巨头 Nvidia,指控该公司未经许可使用他的视频来训练 AI 模型。此前不久,Millette 还起诉了 OpenAI,但并未指控这两家公司侵犯版权。 - **指控…

YOLOV8网络结构|搞懂Backbone-C2f

c2f没有改变图像的输入通道数和分辨率 传进去的和传出去的没变 n = 3*d d是模型缩放里面的depth split成两个分支:a和b 经过一个bottleneck就是加一个c 有n个bottleneck 一共是(n+2)个 学习资料: