Java加密解密和数字签名完整代码示例

首先我们需要明确几个概念:加密、解密、数字签名。

  • 加密:将明文(未加密的数据)通过某种方式转换成密文(已加密的数据),使得未授权的第三方无法读取到数据内容。
  • 解密:将密文还原成明文,使得有授权的第三方可以读取数据内容。
  • 数字签名:对数据进行加密后再生成一个签名,用于验证数据的来源和完整性。

下面我们分别讲解 Java 中的加密解密和数字签名的完整代码示例。

Java加密解密示例

DES加密解密

首先我们需要了解DES加密算法,它是一种对称加密算法,即采用同一密钥进行加密与解密。下面是使用Java实现DES加密和解密的示例代码:

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import java.security.SecureRandom;

public class DesDemo {
    public static void main(String[] args) throws Exception {
        String content = "hello,world"; // 待加密的数据
        KeyGenerator keyGenerator = KeyGenerator.getInstance("DES"); // 获得DES算法的密钥生成器
        keyGenerator.init(new SecureRandom()); // 初始化密钥生成器
        SecretKey secretKey = keyGenerator.generateKey(); // 生成密钥
        Cipher cipher = Cipher.getInstance("DES"); // 获得DES加密算法的密码器
        cipher.init(Cipher.ENCRYPT_MODE, secretKey); // 初始化密码器为加密模式
        byte[] resultBytes = cipher.doFinal(content.getBytes()); // 加密
        System.out.println("加密后:" + new String(resultBytes)); // 输出加密后结果
        cipher.init(Cipher.DECRYPT_MODE, secretKey); // 初始化密码器为解密模式
        byte[] originalBytes = cipher.doFinal(resultBytes); // 解密
        System.out.println("解密后:" + new String(originalBytes)); // 输出解密后结果
    }
}

RSA加密解密

RSA加密算法则是一种非对称加密算法,使用公钥加密,私钥解密,或使用私钥加密,公钥解密。下面是使用Java实现RSA加密和解密的示例代码:

import javax.crypto.Cipher;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;

public class RsaDemo {
    public static void main(String[] args) throws Exception {
        String content = "hello,world"; // 待加密的数据
        KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA"); // 获得RSA算法的密钥生成器
        keyPairGenerator.initialize(512); // 初始化密钥长度
        KeyPair keyPair = keyPairGenerator.generateKeyPair(); // 生成公钥和私钥对
        PublicKey publicKey = keyPair.getPublic(); // 获得公钥
        PrivateKey privateKey = keyPair.getPrivate(); // 获得私钥
        Cipher cipher = Cipher.getInstance("RSA"); // 获得RSA加密算法的密码器
        cipher.init(Cipher.ENCRYPT_MODE, publicKey); // 初始化密码器为加密模式,并设置公钥
        byte[] resultBytes = cipher.doFinal(content.getBytes()); // 加密
        System.out.println("加密后:" + new String(resultBytes)); // 输出加密后结果
        cipher.init(Cipher.DECRYPT_MODE, privateKey); // 初始化密码器为解密模式,并设置私钥
        byte[] originalBytes = cipher.doFinal(resultBytes); // 解密
        System.out.println("解密后:" + new String(originalBytes)); // 输出解密后结果
    }
}

Java数字签名示例

数字签名是为了保证数据的来源和完整性,需要使用私钥对数据进行签名,使用公钥对签名进行验证。下面是使用Java实现数字签名的示例代码:

import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.Signature;

public class DigitalSignatureDemo {
    public static void main(String[] args) throws Exception {
        String content = "hello,world"; // 待签名的数据
        KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("DSA"); // 获得DSA算法的密钥生成器
        keyPairGenerator.initialize(512); // 初始化密钥长度
        KeyPair keyPair = keyPairGenerator.generateKeyPair(); // 生成公钥和私钥对
        PublicKey publicKey = keyPair.getPublic(); // 获得公钥
        PrivateKey privateKey = keyPair.getPrivate(); // 获得私钥
        Signature signature = Signature.getInstance("SHA1withDSA"); // 获得数字签名的实例
        signature.initSign(privateKey); // 初始化为签名模式,并设置私钥
        signature.update(content.getBytes()); // 更新待签名的数据
        byte[] signBytes = signature.sign(); // 生成签名
        System.out.println("签名后:" + new String(signBytes)); // 输出签名结果
        signature.initVerify(publicKey); // 初始化为验证模式,并设置公钥
        signature.update(content.getBytes()); // 更新待验证的数据
        boolean result = signature.verify(signBytes); // 验证签名
        System.out.println("验签结果:" + result); // 输出验签结果
    }
}

以上就是Java加密解密和数字签名的完整代码示例。其中,在RSA加密解密示例中,我们使用了非对称加密算法RSA,为了保证加密解密的可行性和效率,我们需要使用密钥对进行加密和解密。RSA算法一般用于在网络中传输小量数据(如会话密钥),并且RSA算法的加密和解密速度比较慢,而DES加密算法则是一种对称加密算法,适合加密大量的数据。在数字签名示例中,我们使用了数字签名的方式,保证了数据的来源和完整性,其中数字签名采用了DSA算法。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java加密解密和数字签名完整代码示例 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • Java中的代码重构如何避免异常?

    Java中的代码重构是一种重要的技术手段,可以提高代码的可读性、可维护性和可测试性。其中,如何避免异常是非常关键的一点。以下是详细的攻略: 理解代码重构的目的和原则 代码重构的目的是改善代码的质量,不影响代码功能。代码重构的原则包括:确保代码的正确性、消除代码的冗余、提高代码的可读性、提高代码的可维护性和可测试性。 意识到异常的重要性 异常是Java中一个非…

    Java 2023年4月27日
    00
  • java中断线程的正确姿势完整示例

    针对 “java中断线程的正确姿势完整示例”,以下是完整攻略: 什么是线程中断? 线程中断就是让一个正在运行的线程停止运行,也就是让线程停止执行后续的代码,退出执行状态。 为什么需要中断线程? 中断线程的主要目的是为了优雅的停止线程,避免造成系统死锁或资源泄露等。 Java如何中断线程? Java中断线程通常有两种方式: Thread.interrupt()…

    Java 2023年5月19日
    00
  • springboot 2.3之后消失的hibernate-validator解决方法

    下面是详细的攻略: 问题背景 在Spring Boot 2.3版本之后,引入了一个新的starter库,名为validation-starter,用于提供Java Bean的数据校验功能。同时,hibernate-validator也被移出了Spring Boot的核心依赖,这导致运行时找不到这个库,会报出ClassNotFoundException的错误。…

    Java 2023年5月20日
    00
  • FusionCharts图表显示双Y轴双(多)曲线

    要讲解“FusionCharts图表显示双Y轴双(多)曲线”,我们需要了解以下几个方面: FusionCharts的基本使用: FusionCharts是一种可以创建多种类型图表的强大JavaScript库。使用FusionCharts的步骤如下: 引入FusionCharts库文件; 创建一个用于显示图表的空间; 创建一个包含图表属性和数据的JSON对象;…

    Java 2023年6月15日
    00
  • Springboot如何通过yml配置文件为静态成员变量赋值

    在Spring Boot应用程序中,我们可以使用yml配置文件为静态成员变量赋值。在本文中,我们将详细讲解如何使用yml配置文件为静态成员变量赋值,并提供两个示例来说明这个过程。 步骤 要使用yml配置文件为静态成员变量赋值,我们需要遵循以下步骤: 在yml配置文件中定义静态成员变量的值。 在Java类中定义静态成员变量,并使用@Value注解将其与yml配…

    Java 2023年5月18日
    00
  • 轻松玩转BootstrapTable(后端使用SpringMVC+Hibernate)

    轻松玩转BootstrapTable(后端使用SpringMVC+Hibernate)攻略 Bootstrap Table是一款基于Bootstrap实现的强大的表格插件,支持各种基础功能,如排序、分页、筛选等,并且支持自定义复杂的HTML、单元格等。在后端使用SpringMVC+Hibernate的开发中,结合Bootstrap Table可以轻松地实现各…

    Java 2023年5月20日
    00
  • Springboot内嵌tomcat应用原理深入分析

    Spring Boot是现今最流行的Java Web框架之一,其最大的优点是使用内嵌的Tomcat容器,降低了Web应用的开发和部署成本。本文将深入分析Spring Boot内嵌Tomcat应用的原理,并介绍两个示例。 1. Spring Boot内嵌Tomcat原理 Spring Boot应用的内嵌Tomcat配置在pom.xml文件中的依赖中引入了Tom…

    Java 2023年5月19日
    00
  • mybatis实现mapper代理模式的方式

    Mybatis是一款常用的ORM框架,提供了Mapper代理模式来替代直接使用JDBC操作数据库,可以大大简化代码量和提高开发效率。 下面是实现Mybatis的Mapper代理模式的步骤: 1. 定义Mapper接口 首先,我们需要定义一个Mapper接口,该接口下面定义了一些操作数据库的方法,这些方法的名称和参数与SQL语句的内容一一对应。例如: publ…

    Java 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部