java-数字加密解密

在Java中进行数字加密和解密是一个重要的安全问题,尤其是在处理敏感数据时。加密和解密技术可以帮助保护数据的安全性,防止未授权的访问和篡改。在本指南中,我们将介绍一些常用的数字加密和解密技术,以及如何在Java中实现它们。
### 1. 对称加密
对称加密是一种加密技术,其中加密和解密使用相同的密钥。这意味着加密和解密过程是相互独立的,因为密钥在两个方向上都是相同的。对称加密算法有多种,包括AES(高级加密标准)、DES(数据加密标准)、3DES(三重数据加密算法)等。
#### Java中的对称加密
Java提供了对称加密的实现,例如使用`javax.crypto`包。以下是一个使用AES对称加密的简单示例:
```java
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;
public class SymmetricEncryptionExample {
    public static void main(String[] args) throws Exception {
        // 生成密钥
        KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
        keyGenerator.init(128); // 密钥长度为128位
        SecretKey secretKey = keyGenerator.generateKey();
        // 加密数据
        String originalString = "这是一个待加密的字符串";
        Cipher cipher = Cipher.getInstance("AES");
        cipher.init(Cipher.ENCRYPT_MODE, secretKey);
        byte[] encryptedBytes = cipher.doFinal(originalString.getBytes());
        String encryptedString = Base64.getEncoder().encodeToString(encryptedBytes);
        System.out.println("加密后的字符串: " + encryptedString);
        // 解密数据
        cipher.init(Cipher.DECRYPT_MODE, secretKey);
        byte[] decryptedBytes = cipher.doFinal(Base64.getDecoder().decode(encryptedString));
        String decryptedString = new String(decryptedBytes);
        System.out.println("解密后的字符串: " + decryptedString);
    }
}
```
在这个示例中,我们首先使用`KeyGenerator`生成一个AES密钥。然后,我们使用这个密钥和`Cipher`类对一个字符串进行加密和解密。加密后的数据使用Base64编码进行编码,以便在文本格式中安全地传输。
### 2. 非对称加密
非对称加密,也称为公钥加密,使用一对密钥,即公钥和私钥。公钥用于加密数据,而私钥用于解密数据。非对称加密算法有多种,包括RSA、ECC(椭圆曲线加密)等。
#### Java中的非对称加密
Java提供了非对称加密的实现,例如使用`javax.crypto`包。以下是一个使用RSA非对称加密的简单示例:
```java
import javax.crypto.Cipher;
import java.security.*;
import java.util.Base64;
public class AsymmetricEncryptionExample {
    public static void main(String[] args) throws Exception {
        // 生成密钥对
        KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
        keyPairGenerator.initialize(2048); // 密钥长度为2048位
        KeyPair keyPair = keyPairGenerator.generateKeyPair();
        PublicKey publicKey = keyPair.getPublic();
        PrivateKey privateKey = keyPair.getPrivate();
        // 加密数据
        String originalString = "这是一个待加密的字符串";
        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.ENCRYPT_MODE, publicKey);
        byte[] encryptedBytes = cipher.doFinal(originalString.getBytes());
        String encryptedString = Base64.getEncoder().encodeToString(encryptedBytes);
        System.out.println("加密后的字符串: " + encryptedString);
        // 解密数据
        cipher.init(Cipher.D

ECRYPT_MODE, privateKey);
        byte[] decryptedBytes = cipher.doFinal(Base64.getDecoder().decode(encryptedString));
        String decryptedString = new String(decryptedBytes);
        System.out.println("解密后的字符串: " + decryptedString);
    }
}
```
在这个示例中,我们首先使用`KeyPairGenerator`生成一个RSA密钥对。然后,我们使用公钥和`Cipher`类对一个字符串进行加密。接下来,我们使用私钥和`Cipher`类对加密后的数据进行解密。
### 3. 哈希算法
哈希算法是一种将任意长度的数据映射到固定长度的数据的函数。哈希算法在密码学中有很多应用,例如生成数字签名、验证数据的完整性等。Java提供了多种哈希算法的实现,包括MD5、SHA-1、SHA-256等。
#### Java中的哈希算法
以下是一个使用SHA-256哈希算法的简单示例:
```java
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class HashExample {
    public static void main(String[] args) {
        try {
            // 待哈希的数据
            String data = "这是一个待哈希的数据";
            // 获取SHA-256哈希算法的 MessageDigest 实例
            MessageDigest md = MessageDigest.getInstance("SHA-256");
            // 更新待哈希数据
            md.update(data.getBytes(StandardCharsets.UTF_8));
            // 计算哈希值
            byte[] digest = md.digest();
            // 将哈希值转换为十六进制字符串
            StringBuilder hexString = new StringBuilder();
            for (byte b : digest) {
                String hex = Integer.toHexString(0xff & b);
                if (hex.length() == 1) {
                    hexString.append('0');
                }
                hexString.append(hex);
            }
            // 打印哈希值
            System.out.println("SHA-256哈希值: " + hexString.toString());
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
    }
}
```
在这个示例中,我们使用`MessageDigest`类和SHA-256哈希算法对一个字符串进行哈希处理。计算出的哈希值是一个字节数组,我们将其转换为十六进制字符串以便于查看。
### 4. 数字签名
数字签名是一种用于验证数据完整性和验证发送者身份的技术。数字签名通常使用非对称加密算法实现。Java提供了数字签名的实现,例如使用`java.security`包。
#### Java中的数字签名
以下是一个使用RSA算法创建和验证数字签名的简单示例:
```java
import java.security.*;
import java.util.Base64;
public class DigitalSignatureExample {
    public static void main(String[] args) throws Exception {
        // 生成密钥对
        KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
        keyPairGenerator.initialize(2048);
        KeyPair keyPair = keyPairGenerator.generateKeyPair();
        PrivateKey privateKey = keyPair.getPrivate();
        PublicKey publicKey = keyPair.getPublic();
        // 待签名的数据
        String originalString = "这是一个待签名的数据";
        // 使用私钥签名
        Signature signature = Signature.getInstance("SHA256withRSA");
        signature.initSign(privateKey);
        signature.update(originalString.getBytes(StandardCharsets.UTF_8));
        byte[] signedBytes = signature.sign();
        String signedString = Base64.getEncoder().encodeToString(signedBytes);
        System.out.println("签名后的字符串: " + signedString);
        // 使用公钥验证
        signature.initVerify(publicKey);

```
        signature.update(originalString.getBytes(StandardCharsets.UTF_8));
        boolean isVerified = signature.verify(Base64.getDecoder().decode(signedString));
        System.out.println("签名是否验证成功:" + isVerified);
    }
}
```
在这个示例中,我们首先使用`KeyPairGenerator`生成一个RSA密钥对。然后,我们使用私钥和`Signature`类对一个字符串进行签名。接下来,我们使用公钥和`Signature`类对签名后的数据进行验证。验证过程用于确认签名是由私钥创建的,并且数据在签名过程中没有被篡改。
### 5. 密钥管理
在加密和解密过程中,密钥的管理非常重要。Java提供了一些密钥管理工具,例如使用`java.security`包。以下是一个使用密钥存储和检索的简单示例:
```java
import java.security.KeyStore;
import java.security.PrivateKey;
import java.security.cert.Certificate;
import java.security.cert.X509Certificate;
import java.util.Base64;
import javax.security.auth.x500.X500Principal;
public class KeyManagementExample {
    public static void main(String[] args) throws Exception {
        // 创建一个密钥库(存储密钥和证书)
        KeyStore keyStore = KeyStore.getInstance("JKS");
        keyStore.load(null, null);
        // 创建一个证书和私钥
        X509Certificate certificate = generateCertificate("CN=Test User", "Test Org");
        PrivateKey privateKey = generatePrivateKey();
        // 将证书和私钥存储到密钥库
        keyStore.setCertificateEntry("certificateAlias", certificate);
        keyStore.setKeyEntry("keyAlias", privateKey, "password".toCharArray(), new Certificate[]{certificate});
        // 将密钥库写入文件
        keyStore.store(new FileOutputStream("keyStore.jks"), "password".toCharArray());
        // 从密钥库中检索私钥
        PrivateKey retrievedPrivateKey = (PrivateKey) keyStore.getKey("keyAlias", "password".toCharArray());
        System.out.println("Retrieved Private Key: " + retrievedPrivateKey);
    }
    private static X509Certificate generateCertificate(String name, String organization) throws Exception {
        // 创建一个证书
        KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
        keyPairGenerator.initialize(2048);
        KeyPair keyPair = keyPairGenerator.generateKeyPair();
        X509Certificate certificate = null;
        // 填充证书信息
        X500Principal subjectPrincipal = new X500Principal("CN=" + name + ", O=" + organization);
        certificate = new X509Certificate[]{
                (X509Certificate) certGenerator.generateCertificate(
                        new ByteArrayInputStream(keyPair.getPublic().getEncoded()),
                        subjectPrincipal,
                        keyPair.getPrivate(),
                        new Date(),
                        new Date(System.currentTimeMillis() + 365 * 24 * 60 * 60 * 1000),
                        new ArrayList<>()
                )
        };
        return certificate;
    }
    private static PrivateKey generatePrivateKey() throws Exception {
        // 创建一个私钥
        KeyGenerator keyGenerator = KeyGenerator.getInstance("RSA");
        keyGenerator.init(2048);
        return keyGenerator.generateKey();
    }
}
```
在这个示例中,我们首先创建一个`KeyStore`对象,用于存储密钥和证书。然后,我们创建一个证书和私钥,并将它们存储到密钥库中。最后,我们从密钥库中检索私钥,并打印出来。
### 6. 总结
在Java中,数字加密和解密是一个重要的安全

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

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

相关文章

Spring控制重复请求

通过AOP拦截所有请求&#xff0c;控制在规定时间内请求次数。 1&#xff1a;添加maven <dependency><groupId>net.jodah</groupId><artifactId>expiringmap</artifactId><version>0.5.10</version> </dependency> 2&#x…

YiShaAdmin:一款基于.NET Core Web + Bootstrap的企业级快速开发框架

前言 今天大姚给大家分享一款基于.NET Core Web Bootstrap的企业级快速后台开发框架、权限管理系统&#xff0c;代码简单易懂、界面简洁美观&#xff08;基于MIT License开源&#xff0c;免费可商用&#xff09;&#xff1a;YiShaAdmin。 项目官方介绍 YiShaAdmin 基于.NET…

区间相交-435. 无重叠区间,56. 合并区间

题目连接及描述 435. 无重叠区间 - 力扣&#xff08;LeetCode&#xff09; 56. 合并区间 - 力扣&#xff08;LeetCode&#xff09; 题目分析 二维数组&#xff0c;数组中每个元素为大小为2的一维数组&#xff0c;求移除区间的最小数量&#xff0c;使剩余区间互不重叠。今天写…

Android Intent 使用及其详解

Intent这东西&#xff0c;在Android中的地位至关重要&#xff0c;甚至成为"Android第五大组件"。 在我们的常规业务开发中&#xff0c;各个页面的跳转&#xff0c;service的使用&#xff0c;打开相机&#xff0c;app内分享&#xff0c;广播的使用等等都必须用到它。…

数据结构之堆(优先级队列)

前言 在上一章我们讲了二叉树&#xff0c;这一节我们来讲堆&#xff08;优先级队列&#xff09;&#xff0c;所以想知道堆创建&#xff0c;可以看一下二叉树的一些简单概念。http://t.csdnimg.cn/4jUR6http://t.csdnimg.cn/4jUR6 目录 前言 堆 1.概念 2.优先级队列的模拟实…

Jetson Nano重装支持cuda和aruco库的opencv-4.1.1和opencv_contrib-4.1.1【2024亲测可用】

前言 在宇树四足机器狗开发过程中&#xff0c;可能会碰到无法调用aruco库实现二维码检测&#xff0c;这是因为没有安装opencv_contrib库&#xff0c;安装opencv_contrib库需要卸载现有的opencv&#xff0c;然后重新安装&#xff0c;本文就是记录这个过程&#xff0c;亲测有效。…

1.2数学基础

向量运算 矩阵运算 比较基础就不记录了 MVP矩阵推导 1.讲为什么要有矩阵变换和不同的坐标空间 将3D物体转化到2D平面为各个空间的运用做准备 2.介绍各个空间的概念和含义 MVP矩阵代表什么&#xff1f; MVP矩阵分别是模型(Model)、观察(View)、投影(Projection)三个矩阵。…

positivessl泛域名证书500元13个月

随着创建网站的门槛变低&#xff0c;不论是个人用户还是企事业单位用户创建的域名网站也越来越多&#xff0c;怎么维护网络环境的安全成为了各个用户需要解决的问题。为了保护网站的数据安全&#xff0c;防止恶意攻击和数据泄露&#xff0c;大多数用户选择为域名网站安装数字证…

linux 创建网络端口监听

1.nc nc命令全程netcat&#xff0c;用于设置路由器。他能通过TCP和UDP在网络中读写数据。 启动一个监听的端口 nc -l -p <port_number> 范围端口扫描(默认TCP) nc -v -z -w2 127.0.0.1 1-10000UDP范围端口扫描 nc -v -u -z -w2 127.0.0.1 1-10000指定端口扫描 nc -nvv 12…

NGINX启动停止与各种常见问题

很多项目代理工具都是NGINX&#xff0c;这个工具也确实很牛。据说是俄罗斯人研发出来的。 NGINX的配置文件通常是../xx/conf/nginx.conf&#xff0c;在里面做后端服务器IP或者网关IP的代理&#xff0c;加载前端页面的同时&#xff0c;获取后端数据。 NGINX的启动文件在../xx/…

水电智能抄表是什么?

1.简述&#xff1a;水电智能抄表的兴起 水电智能抄表系统是现代科学技术和传统公共文化服务相结合的产物&#xff0c;它通过自动化技术性改变了传统的人工抄表方式&#xff0c;大大提高了高效率&#xff0c;降低生产成本&#xff0c;同时也为用户提供了更为贴心的服务。这一新…

轻兔推荐 —— 一个好用的软件服务推荐平台

给大家推荐一个好用的的软件服务推荐平台&#xff1a;轻兔推荐 网站界面简洁大方&#xff0c;没有太多杂七杂八的功能和页面&#xff0c;有明暗主题色可以选择&#xff0c;默认为亮色&#xff0c;可在网站上方手动切换。 每工作日都会推荐一款软件&#xff0c;有时会加更&…

B2124 判断字符串是否为回文

判断字符串是否为回文 题目描述 输入一个字符串&#xff0c;输出该字符串是否回文。回文是指顺读和倒读都一样的字符串。 输入格式 输入一行字符串&#xff0c;长度小于 100 100 100。 输出格式 如果字符串是回文&#xff0c;输出 yes&#xff1b;否则&#xff0c;输出 …

Flutter 中的 PhysicalModel 小部件:全面指南

Flutter 中的 PhysicalModel 小部件&#xff1a;全面指南 Flutter 的 PhysicalModel 小部件提供了一种简单而高效的方式来给应用添加物理效果&#xff0c;如阴影和层次感。它本质上是一个矩形的 Container&#xff0c;带有圆角边框和可选的阴影&#xff0c;能够模仿真实世界中…

数据赋能(102)——概念:数据分析、数据挖掘、数据洞察

此文为本人学习与提高能力的笔记。 数据分析、数据挖掘与数据洞察这三个术语&#xff0c;为了确保这些术语使用的精准度和专业性&#xff0c;我们必须对它们有更为深入的认知。这三个概念虽在某种程度上相互关联&#xff0c;但在实际应用中各自承载着不同的侧重点和用途&#…

内网安全--隧道技术-MSF上线本地

免责声明:本文仅做技术交流与学习... 不得不说,小白最近也是用上了viper,这里要特别感谢一下my bro 北岭敲键盘的荒漠猫 MSF--viper: --生成马子-->上线 --进入meterpreter. 1-查看路由,添加路由. 查看路由信息 : run autoroute -p run post/multi/manage/autoroute 添加…

『香橙派』基于Orange Pi AIpro打造高效个人云存储解决方案

&#x1f4e3;读完这篇文章里你能收获到 了解Orange Pi AIpro硬件优势&#xff0c;为构建高效云存储基础设施的理想平台。学会使用Orange Pi AIpro硬件平台&#xff0c;搭载Ubuntu Server系统&#xff0c;打造云存储环境。掌握利用Kodbox软件&#xff0c;享受文件管理、多格式…

微软MSBuild大会发布Copilot+PC:技术革新还是隐私噩梦?

微软在最近的MSBuild 2024大会上发布了全新的CopilotPC概念&#xff0c;这一技术结合了高通骁龙X Elite芯片&#xff0c;将人工智能与PC紧密结合。此次发布引起了广泛关注&#xff0c;不仅是因为其技术创新&#xff0c;还因为潜在的隐私问题。甚至连Elon Musk也对此表示担忧&am…

CGAL 网格布尔操作(带属性)

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 CGAL在进行布尔操作时可以为我们提供了Mesh的相关信息,比如并集部分是由原Mesh数据的那些面片组成,虽然现阶段还不了解这有什么用。 二、实现代码 #include <iostream> #include <iterator> #includ…

小熊家务帮day5 客户管理模块1 (小程序认证,手机验证码认证等)

客户管理模块 1.认证模块1.1 认证方式介绍1.1.1 小程序认证1.1.2 手机验证码登录1.1.3 账号密码认证 1.2 小程序认证1.2.1 小程序申请1.2.2 创建客户后端工程jzo2o-customer1.2.3 开发部署前端1.2.4 小程序认证流程1.2.4.1 customer小程序认证接口设计Controller层Service层调用…