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

yizhihongxing

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详细介绍SPI机制示例

    SpringBoot详细介绍SPI机制示例 在SpringBoot中,我们可以使用SPI机制来扩展框架的功能。本文将详细讲解SpringBoot详细介绍SPI机制示例的完整攻略,并提供两个示例。 1. SPI机制 SPI全称为Service Provider Interface,是Java提供的一种服务发现机制。在SPI机制中,服务提供者提供一种服务接口,而…

    Java 2023年5月15日
    00
  • Spring Boot webflux使用方法解析

    下面是关于“Spring Boot webflux使用方法解析”的完整攻略,包含两个示例说明。 Spring Boot webflux使用方法解析 Spring Boot webflux是Spring Boot框架的一部分,它提供了一种基于响应式编程的方式来构建Web应用程序。本文将详细介绍如何使用Spring Boot webflux来构建Web应用程序。…

    Java 2023年5月17日
    00
  • java连接orcale数据库示例分享

    下面是详细的攻略。 Java连接Oracle数据库 准备工作 在开始之前,我们需要确保已经完成以下准备工作: 安装Oracle数据库:在官网中下载并安装Oracle数据库,安装完成后配置好环境变量。 下载Oracle JDBC驱动:在官网中下载对应版本的JDBC驱动,将其复制到Java项目中。 示例1:使用JDBC API进行数据库操作 以下是连接Oracl…

    Java 2023年6月1日
    00
  • 详细总结Java创建文件夹的方法及优缺点

    详细总结Java创建文件夹的方法及优缺点 在Java中,创建文件夹是一个常见的操作,无论是在后端开发还是在桌面应用程序中都很常用。本文将详细总结Java创建文件夹的方法及优缺点,包括三种方法。 方法一:使用File类的mkdir() File类是Java中的一个常用文件操作类,其中的mkdir()方法可以用于创建一个新的文件夹。 File file = ne…

    Java 2023年5月20日
    00
  • Java中的程序计数器是什么

    Java中的程序计数器是一种内存区域,它可以记录程序当前执行的位置,以便执行下一条指令。程序计数器在Java虚拟机中扮演了非常重要的角色,它是Java多线程程序中的一种线程私有的内存空间,也是Java虚拟机规范中定义的六大内存区域之一。 程序计数器主要的作用有两个: 确保线程的恢复。程序计数器可以记录线程在执行Java字节码的过程中的位置,当线程因为时间片结…

    Java 2023年5月23日
    00
  • Linux下Tomcat8如何修改JVM内存配置

    下面是详细的攻略: 准备工作 在修改Tomcat JVM内存配置之前,需要先确认是否已经安装了JDK。如果尚未安装,请先安装。安装JDK的详细步骤可以参考JDK安装指南。 修改JVM内存配置 打开Tomcat安装目录下的bin文件夹,并找到catalina.sh文件。 打开catalina.sh文件,在文件末尾添加以下代码: JAVA_OPTS=”-Xms5…

    Java 2023年5月20日
    00
  • OGC标准接口学习

    OGC 全称 Open Geospatial Consortium,是一个非盈利的、国际化的、自愿协商的标准化组织,它的主要目的就是制定与空间信息、基于位置服务相关的标准 DescribeFeatureType 返回WFS服务支持的字段类型的描述 入参 参数 是否必须 示例 描述 SERVICE 是 WFS 服务类型 REQUEST 是 DescribeFe…

    Java 2023年4月27日
    00
  • Java三种循环求和方法

    Java语言有三种主要的循环结构:for循环、while循环、do-while循环。在这三种循环中,我们可以使用不同的方式来实现求和功能。下面我将详细讲解Java三种循环求和方法的完整攻略。 for循环求和 在Java中,for循环是一种最为常用的循环结构,它的基本语法如下: for(initialization; condition; iteration)…

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