Java对称与非对称加密算法原理详细讲解

Java对称加密算法原理详细讲解

什么是对称加密算法?

对称加密算法是指加密和解密使用的密钥相同的一类加密算法。在数据传输过程中,发送方使用密钥对数据进行加密,接收方使用同样的密钥对数据进行解密,因此只有知道密钥的人才能够对数据进行解密。对称加密算法具有加密速度快、加密强度高的优点,但其缺陷在于密钥需要被发送方和接收方共享,如果密钥被攻击者获取,那么数据就存在被解密的风险。

常见的对称加密算法有DES、3DES、AES等。

Java对称加密算法实现

Java提供了大量对称加密算法的实现,常用的有以下几种:

DES加密算法

DES(Data Encryption Standard),数据加密标准,是一种对称密钥加密算法。下面是一个DES加密的Java实例:

import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
import java.security.SecureRandom;

public class DES {

    public static void main(String[] args) throws Exception {
        String plainText = "Hello, World!";
        String key = "testkey";

        byte[] cipherText = desEncrypt(plainText.getBytes(), key.getBytes());
        System.out.println(new String(cipherText));

        byte[] result = desDecrypt(cipherText, key.getBytes());
        System.out.println(new String(result));
    }

    public static byte[] desEncrypt(byte[] plainText, byte[] key) throws Exception {
        SecureRandom random = new SecureRandom();
        DESKeySpec keySpec = new DESKeySpec(key);
        SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
        SecretKey secretKey = keyFactory.generateSecret(keySpec);

        Cipher cipher = Cipher.getInstance("DES");
        cipher.init(Cipher.ENCRYPT_MODE, secretKey, random);

        return cipher.doFinal(plainText);
    }

    public static byte[] desDecrypt(byte[] cipherText, byte[] key) throws Exception {
        SecureRandom random = new SecureRandom();
        DESKeySpec keySpec = new DESKeySpec(key);
        SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
        SecretKey secretKey = keyFactory.generateSecret(keySpec);

        Cipher cipher = Cipher.getInstance("DES");
        cipher.init(Cipher.DECRYPT_MODE, secretKey, random);

        return cipher.doFinal(cipherText);
    }
}

AES加密算法

AES(Advanced Encryption Standard),高级加密标准,是一种对称密钥加密算法。下面是一个AES加密的Java实例:

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

public class AES {

    public static void main(String[] args) throws Exception {
        String plainText = "Hello, World!";
        String key = "testkey";

        byte[] cipherText = aesEncrypt(plainText.getBytes(), key.getBytes());
        System.out.println(new String(cipherText));

        byte[] result = aesDecrypt(cipherText, key.getBytes());
        System.out.println(new String(result));
    }

    public static byte[] aesEncrypt(byte[] plainText, byte[] key) throws Exception {
        KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
        SecureRandom secureRandom = new SecureRandom(key);
        keyGenerator.init(256, secureRandom);
        SecretKey secretKey = keyGenerator.generateKey();
        byte[] keyBytes = secretKey.getEncoded();

        SecretKeySpec keySpec = new SecretKeySpec(key, "AES");
        Cipher cipher = Cipher.getInstance("AES");
        cipher.init(Cipher.ENCRYPT_MODE, keySpec);

        return cipher.doFinal(plainText);
    }

    public static byte[] aesDecrypt(byte[] cipherText, byte[] key) throws Exception {
        SecretKeySpec keySpec = new SecretKeySpec(key, "AES");
        Cipher cipher = Cipher.getInstance("AES");
        cipher.init(Cipher.DECRYPT_MODE, keySpec);

        return cipher.doFinal(cipherText);
    }
}

什么是非对称加密算法?

非对称加密算法也叫公钥加密算法,它与对称加密算法不同的是加密和解密使用的是不同的密钥。一个密钥被称为公钥,另一个密钥被称为私钥。在数据传输过程中,发送方使用接收方的公钥对数据进行加密,接收方使用自己的私钥对数据进行解密。因此对于加密数据,只有具有接收方私钥的人才能够进行解密,非对称加密算法在数据传输过程中保证了数据的安全性,但加密和解密速度较慢。

常见的非对称加密算法有RSA、DSA等。

Java非对称加密算法实现

Java提供了大量非对称加密算法的实现,常用的有以下几种:

RSA加密算法

RSA(Rivest-Shamir-Adleman)是一种非对称加密算法,它基于一个数学难题:质因数分解。下面是一个RSA加密的Java实例:

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

public class RSA {

    public static void main(String[] args) throws Exception {
        String plainText = "Hello, World!";

        KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
        keyPairGenerator.initialize(1024);
        KeyPair keyPair = keyPairGenerator.generateKeyPair();

        PublicKey publicKey = keyPair.getPublic();
        PrivateKey privateKey = keyPair.getPrivate();

        byte[] cipherText = rsaEncrypt(plainText.getBytes(), publicKey);
        System.out.println(new String(cipherText));

        byte[] result = rsaDecrypt(cipherText, privateKey);
        System.out.println(new String(result));
    }

    public static byte[] rsaEncrypt(byte[] plainText, PublicKey publicKey) throws Exception {
        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.ENCRYPT_MODE, publicKey);

        return cipher.doFinal(plainText);
    }

    public static byte[] rsaDecrypt(byte[] cipherText, PrivateKey privateKey) throws Exception {
        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.DECRYPT_MODE, privateKey);

        return cipher.doFinal(cipherText);
    }
}

DSA签名算法

DSA(Digital Signature Algorithm),数字签名算法,是一种公钥加密算法。它使用了一个哈希函数,将消息的摘要加密,并由发送方的私钥进行加密。接收方使用发送方的公钥对加密后的消息进行解密,然后使用相同的哈希函数对消息进行摘要验证。下面是一个DSA签名的Java实例:

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

public class DSA {

    public static void main(String[] args) throws Exception {
        String plainText = "Hello, World!";

        KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("DSA");
        keyPairGenerator.initialize(1024);
        KeyPair keyPair = keyPairGenerator.generateKeyPair();

        PublicKey publicKey = keyPair.getPublic();
        PrivateKey privateKey = keyPair.getPrivate();

        byte[] signText = dsaSign(plainText.getBytes(), privateKey);
        System.out.println(new String(signText));

        boolean result = dsaVerify(plainText.getBytes(), signText, publicKey);
        System.out.println(result);
    }

    public static byte[] dsaSign(byte[] plainText, PrivateKey privateKey) throws Exception {
        Signature signature = Signature.getInstance("DSA");
        signature.initSign(privateKey);
        signature.update(plainText);

        return signature.sign();
    }

    public static boolean dsaVerify(byte[] plainText, byte[] signText, PublicKey publicKey) throws Exception {
        Signature signature = Signature.getInstance("DSA");
        signature.initVerify(publicKey);
        signature.update(plainText);

        return signature.verify(signText);
    }
}

以上就是Java对称加密和非对称加密算法的实现,并包含了DES、AES、RSA、DSA等多种算法的使用示例。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java对称与非对称加密算法原理详细讲解 - Python技术站

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

相关文章

  • 一篇文章彻底弄懂SpringBoot项目jdk版本及依赖不兼容问题

    下面是详细讲解“一篇文章彻底弄懂SpringBoot项目jdk版本及依赖不兼容问题”的完整攻略。 什么是SpringBoot项目? SpringBoot是一款基于Spring框架的轻量级Java开发框架,它使用了约定优于配置的方式,能够快速构建可独立运行的Spring应用程序。在SpringBoot框架中,它的依赖管理使用了maven或gradle进行版本控…

    Java 2023年5月19日
    00
  • 基于Java SpringBoot的前后端分离信息管理系统的设计和实现

    基于Java SpringBoot的前后端分离信息管理系统的设计和实现攻略 一、背景介绍 随着互联网时代的到来,信息管理成为重要的需求。而采用前端和后端分离的开发方式可以提高开发效率和减轻后端压力。本文将介绍基于Java SpringBoot的前后端分离信息管理系统的设计和实现攻略。 二、技术栈 后端:Java SpringBoot、MyBatis、Swag…

    Java 2023年6月3日
    00
  • layui之数据表格–与后台交互获取数据的方法

    首先,需要在后台构建好返回数据的接口,即后台返回数据应该是一个符合layui表格规范的JSON格式数据。 接下来的步骤是: 引入layui库 在前端页面中,需要引入layui库,以便能够正常使用 layui 提供的数据表格组件。 <!– 引入 layui 相关静态资源 –> <link rel="stylesheet&quot…

    Java 2023年6月15日
    00
  • spring framework体系结构及模块jar依赖关系详解

    Spring Framework是一个开放源代码的轻量级应用程序框架。它是为了解决企业级应用程序开发的许多疑难问题而创建的。Spring框架采用了依赖注入和面向切面编程等技术,使得代码更加简洁,更加易于测试和维护。在Spring中,模块jar包的依赖关系非常重要,因为它们决定了应用程序的行为和性能。 Spring Framework体系结构及模块jar依赖关…

    Java 2023年5月19日
    00
  • Java二维数组与稀疏数组相互转换实现详解

    Java二维数组与稀疏数组相互转换实现详解 二维数组与稀疏数组在Java中是常见的数据结构,二维数组用来表示二维网格数据,稀疏数组用来表示大部分元素都是相同值的数组。本篇攻略将详细讲解Java中如何实现二维数组与稀疏数组的相互转换。 1. 二维数组转稀疏数组 实现过程:1. 遍历二维数组,统计非零元素的个数count。2. 创建一个稀疏数组sparseArr…

    Java 2023年5月26日
    00
  • springmvc 传递和接收数组参数的实例

    SpringMVC传递和接收数组参数的实例 在SpringMVC中,我们可以使用@RequestParam注解来传递和接收数组参数。下面是一个示例代码,演示如何传递和接收数组参数。 示例代码 @RestController @RequestMapping("/api") public class MyController { @GetMa…

    Java 2023年5月18日
    00
  • Java SpringBoot 中的操作事务

    我们来详细讲解一下Java SpringBoot中的操作事务。 什么是事务 事务是指作为单个逻辑工作单元执行的一系列操作,这些操作要么全部执行,要么全部不执行,如果在执行整个事务时发生错误,会回滚到事务的开始状态,使所有操作都回到事务执行之前的状态。 Spring 中如何使用事务 Spring 提供了一套完整的事务管理机制,其中最基础的是PlatformTr…

    Java 2023年5月19日
    00
  • Java 实战项目之教材管理系统的实现流程

    Java 实战项目之教材管理系统的实现流程 本文讲解如何使用Java实现一个教材管理系统。教材管理系统主要包括以下功能: 学生信息管理:包括学生信息的添加、删除、修改和查询等操作。 课程信息管理:包括课程信息的添加、删除、修改和查询等操作。 教材信息管理:包括教材信息的添加、删除、修改和查询等操作。 学生成绩管理:包括学生成绩的添加、删除、修改和查询等操作。…

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