JAVA:对称加密技术的详细指南

news2024/9/20 1:07:58

请关注微信公众号:拾荒的小海螺
博客地址:http://lsk-ww.cn/

1、简述

对称加密是一种加密算法,其中加密和解密使用相同的密钥。其主要特点是速度快、效率高,适用于大数据量的加密需求。对称加密算法通常用于保护数据的机密性和完整性,广泛应用于网络通信、数据存储等领域。
在这里插入图片描述

2、工作原理

对称加密的核心在于加密密钥和解密密钥相同。加密过程将明文通过加密算法和密钥转换为密文,解密过程则是将密文通过相同的密钥和算法转换回明文。其安全性依赖于密钥的保密性,如果密钥泄露,攻击者可以轻松解密加密数据。
在这里插入图片描述

3、加密算法

Java提供了丰富的库来实现对称加密算法,常见的加密方式有DES、AES、3DES、Blowfish和RC4等对称加密算法,以下列举了对称加密算法的实例。

3.1 DES(Data Encryption Standard)

DES 是一种早期的对称加密算法,使用56位密钥。虽然曾经被广泛使用,但由于密钥长度较短,安全性已经不足,容易被暴力破解。

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;

public class DESEncryption {

    public static SecretKey generateKey() throws Exception {
        KeyGenerator keyGen = KeyGenerator.getInstance("DES");
        keyGen.init(56); // DES 密钥长度为 56return keyGen.generateKey();
    }

    public static String encrypt(String plainText, SecretKey key) throws Exception {
        Cipher cipher = Cipher.getInstance("DES");
        cipher.init(Cipher.ENCRYPT_MODE, key);
        byte[] encryptedBytes = cipher.doFinal(plainText.getBytes());
        return Base64.getEncoder().encodeToString(encryptedBytes);
    }

    public static String decrypt(String encryptedText, SecretKey key) throws Exception {
        Cipher cipher = Cipher.getInstance("DES");
        cipher.init(Cipher.DECRYPT_MODE, key);
        byte[] decodedBytes = Base64.getDecoder().decode(encryptedText);
        byte[] decryptedBytes = cipher.doFinal(decodedBytes);
        return new String(decryptedBytes);
    }

    public static void main(String[] args) {
        try {
            SecretKey key = generateKey();
            String plainText = "Hello, DES!";
            String encryptedText = encrypt(plainText, key);
            String decryptedText = decrypt(encryptedText, key);

            System.out.println("Original Text: " + plainText);
            System.out.println("Encrypted Text: " + encryptedText);
            System.out.println("Decrypted Text: " + decryptedText);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
3.2 3DES(Triple DES)

为了增强DES的安全性,3DES对数据进行三次加密处理,密钥长度增加到112位或168位。尽管更安全,但处理速度较慢。

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;

public class TripleDESEncryption {

    public static SecretKey generateKey() throws Exception {
        KeyGenerator keyGen = KeyGenerator.getInstance("DESede");
        keyGen.init(168); // 3DES 密钥长度为 168return keyGen.generateKey();
    }

    public static String encrypt(String plainText, SecretKey key) throws Exception {
        Cipher cipher = Cipher.getInstance("DESede");
        cipher.init(Cipher.ENCRYPT_MODE, key);
        byte[] encryptedBytes = cipher.doFinal(plainText.getBytes());
        return Base64.getEncoder().encodeToString(encryptedBytes);
    }

    public static String decrypt(String encryptedText, SecretKey key) throws Exception {
        Cipher cipher = Cipher.getInstance("DESede");
        cipher.init(Cipher.DECRYPT_MODE, key);
        byte[] decodedBytes = Base64.getDecoder().decode(encryptedText);
        byte[] decryptedBytes = cipher.doFinal(decodedBytes);
        return new String(decryptedBytes);
    }

    public static void main(String[] args) {
        try {
            SecretKey key = generateKey();
            String plainText = "Hello, 3DES!";
            String encryptedText = encrypt(plainText, key);
            String decryptedText = decrypt(encryptedText, key);

            System.out.println("Original Text: " + plainText);
            System.out.println("Encrypted Text: " + encryptedText);
            System.out.println("Decrypted Text: " + decryptedText);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
3.3 AES(Advanced Encryption Standard)

AES 是当前应用最广泛的对称加密算法,支持128位、192位和256位密钥长度。AES 具有较高的安全性和效率,已成为数据加密的标准。

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;

public class AESExample {

    // 生成 AES 密钥
    public static SecretKey generateKey() throws Exception {
        KeyGenerator keyGen = KeyGenerator.getInstance("AES");
        keyGen.init(256); // 使用256位密钥
        return keyGen.generateKey();
    }

    // 加密
    public static String encrypt(String plainText, SecretKey key) throws Exception {
        Cipher cipher = Cipher.getInstance("AES");
        cipher.init(Cipher.ENCRYPT_MODE, key);
        byte[] encryptedBytes = cipher.doFinal(plainText.getBytes());
        return Base64.getEncoder().encodeToString(encryptedBytes);
    }

    // 解密
    public static String decrypt(String encryptedText, SecretKey key) throws Exception {
        Cipher cipher = Cipher.getInstance("AES");
        cipher.init(Cipher.DECRYPT_MODE, key);
        byte[] decodedBytes = Base64.getDecoder().decode(encryptedText);
        byte[] decryptedBytes = cipher.doFinal(decodedBytes);
        return new String(decryptedBytes);
    }

    public static void main(String[] args) {
        try {
            SecretKey key = generateKey(); // 生成密钥
            String plainText = "Hello, World!";
            String encryptedText = encrypt(plainText, key); // 加密
            String decryptedText = decrypt(encryptedText, key); // 解密

            System.out.println("Original Text: " + plainText);
            System.out.println("Encrypted Text: " + encryptedText);
            System.out.println("Decrypted Text: " + decryptedText);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
3.4 Blowfish

Blowfish 是一种快速的对称加密算法,支持32位到448位的可变密钥长度,适用于替代DES。

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;

public class BlowfishEncryption {

    public static SecretKey generateKey() throws Exception {
        KeyGenerator keyGen = KeyGenerator.getInstance("Blowfish");
        keyGen.init(128); // Blowfish 密钥长度为 32448 位,常用 128return keyGen.generateKey();
    }

    public static String encrypt(String plainText, SecretKey key) throws Exception {
        Cipher cipher = Cipher.getInstance("Blowfish");
        cipher.init(Cipher.ENCRYPT_MODE, key);
        byte[] encryptedBytes = cipher.doFinal(plainText.getBytes());
        return Base64.getEncoder().encodeToString(encryptedBytes);
    }

    public static String decrypt(String encryptedText, SecretKey key) throws Exception {
        Cipher cipher = Cipher.getInstance("Blowfish");
        cipher.init(Cipher.DECRYPT_MODE, key);
        byte[] decodedBytes = Base64.getDecoder().decode(encryptedText);
        byte[] decryptedBytes = cipher.doFinal(decodedBytes);
        return new String(decryptedBytes);
    }

    public static void main(String[] args) {
        try {
            SecretKey key = generateKey();
            String plainText = "Hello, Blowfish!";
            String encryptedText = encrypt(plainText, key);
            String decryptedText = decrypt(encryptedText, key);

            System.out.println("Original Text: " + plainText);
            System.out.println("Encrypted Text: " + encryptedText);
            System.out.println("Decrypted Text: " + decryptedText);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
3.5 RC4

RC4 是一种流加密算法,具有简单和高效的特点,但由于其已被多次破解,安全性存疑。需要注意的是,RC4 已被认为不安全,不推荐用于实际应用。

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;

public class RC4Encryption {

    public static SecretKey generateKey() throws Exception {
        KeyGenerator keyGen = KeyGenerator.getInstance("RC4");
        keyGen.init(128); // RC4 密钥长度为 402048 位,常用 128return keyGen.generateKey();
    }

    public static String encrypt(String plainText, SecretKey key) throws Exception {
        Cipher cipher = Cipher.getInstance("RC4");
        cipher.init(Cipher.ENCRYPT_MODE, key);
        byte[] encryptedBytes = cipher.doFinal(plainText.getBytes());
        return Base64.getEncoder().encodeToString(encryptedBytes);
    }

    public static String decrypt(String encryptedText, SecretKey key) throws Exception {
        Cipher cipher = Cipher.getInstance("RC4");
        cipher.init(Cipher.DECRYPT_MODE, key);
        byte[] decodedBytes = Base64.getDecoder().decode(encryptedText);
        byte[] decryptedBytes = cipher.doFinal(decodedBytes);
        return new String(decryptedBytes);
    }

    public static void main(String[] args) {
        try {
            SecretKey key = generateKey();
            String plainText = "Hello, RC4!";
            String encryptedText = encrypt(plainText, key);
            String decryptedText = decrypt(encryptedText, key);

            System.out.println("Original Text: " + plainText);
            System.out.println("Encrypted Text: " + encryptedText);
            System.out.println("Decrypted Text: " + decryptedText);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

4、总结

对称加密算法在现代数据保护中扮演着重要角色。通过上述 对称加密解析,可以清晰地了解如何使用对称加密算法进行数据的加密和解密操作。请注意,在实际应用中,AES 是目前推荐的对称加密算法,因为它在安全性和性能方面都有较好的表现。其他算法,如DES和RC4,已经被认为不够安全,不推荐使用。

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

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

相关文章

Day17_0.1基础学习MATLAB学习小技巧总结(17)——字符向量元胞数组

利用空闲时间把碎片化的MATLAB知识重新系统的学习一遍,为了在这个过程中加深印象,也为了能够有所足迹,我会把自己的学习总结发在专栏中,以便学习交流。 素材来源“数学建模清风” 特此说明:本博客的内容只在于总结在…

谷歌浏览器Chrome安装历史版本(亲测可用)

前言: 谷歌浏览器Chrome安装历史版本(亲测可用) 官网链接: https://downzen.com/en/windows/google-chrome/versions/?page4https://downzen.com/en/windows/google-chrome/versions/?page4 使用教程: 1、打开官网…

C++ 二叉树进阶

1.二叉搜索树简介 二叉搜索树又称二叉排序树,它或者是一棵空树 ,或者是具有以下性质的二叉树 : 若它的左子树不为空,则左子树上 所有节点的值都小于根节点的值 若它的右子树不为空,则右子树上 所有节点的值都大于根节点的值 它…

人工智能对教育4.0的影响

随着技术变革的加速,迫切需要支持教育系统管理新的机遇和风险。如果管理得当,技术为帮助教育系统实现教育4.0提供了一个独特的机会。教育4.0是一种专注于为学习者提供适合未来的能力、技能、态度和价值观的教学方法。“教育4.0”是由全球教育专家、从业者…

艾体宝干货丨OIDA之二:掌握数据包分析-学会识别

在 OIDA 方法(观察、识别、剖析、分析)中,识别阶段对于在捕获的网络流量中精确定位相关数据至关重要。本文重点介绍如何在这一关键步骤中有效使用 Wireshark 和 Profitap 的 IOTA。 OIDA方法系列文章主要包含四个部分,分别是观察…

鸿蒙OS 应用基础知识

APP HarmonyOS 的应用软件包以 APP Pack(Application Package)形式发布,它是由一个或多个 HAP(HarmonyOS Ability Package)以及描述每个 HAP 属性的 pack.info 组成。HAP 是 [Ability]的部署包,HarmonyOS …

虚拟机安装VMware-tools详细教程

这里以VM16.12版本为例子,所有windows系统在所有虚拟机版本上都是一样的操作,参考即可 第一步打开虚拟机,这里需要注意的是虚拟机设备要有CD/DVD驱动器,这也是很多人说vmtool安装按钮是灰色的原因 第二步:打开虚拟机,…

linux入门到实操-1 Linux概述、诞生过程、发行版本,如何安装?

教程来源:B站视频BV1WY4y1H7d3 3天搞定Linux,1天搞定Shell,清华学神带你通关_哔哩哔哩_bilibili 整理汇总的课程内容笔记和课程资料,供大家学习交流下载:夸克网盘分享 本文内容为完整笔记的入门篇 概述部分历史内容…

git push失败原因上传的文件超过了Gitee的上限100M

! [remote rejected] master -> master (pre-receive hook declined) error: failed to push some refs to 这个错误信息表明你在尝试将更改推送到Gitee的socket_service仓库时遇到了问题。具体来说,问题出在你尝试推送的文件大小超过了Gitee平台设定的限制。Git…

Science Robotics 在小动物模型中实现渐进和可逆主动脉收缩的软机器人平台

前言速览:目前对左心室压力过载引起心脏重构过程的理解主要来源于主动脉束带的动物模型。然而,这些研究未能同时控制疾病的进展和逆转,阻碍了其临床意义。为此,来自哈佛大学、麻省理工学院等的研究人员介绍了一种基于植入式可扩张…

回馈式负载箱的操作和维护

回馈式负载箱是用于测试电源设备(如发电机、逆变器等)性能的设备,它可以模拟真实的负载情况,通过调节负载的大小和类型,来检测电源设备的输出能力和稳定性。回馈式负载箱的操作和维护对于保证其正常工作和延长使用寿命…

19:I2C一:程序模拟I2C通信时序

I2C 1、什么是I2C2、I2C的通信时序2.1:起始信号2.2:停止信号2.3:主机向从机发送一个字节数据2.4:主机向从机读取一个字节数据2.5:主机接收应答2.6:主机发送应答 3、程序模拟I2C的通信时序3.1:指…

为什么企业需要数据目录?

想象一下,如果在没有目录系统的庞大图书馆里寻找一本特定的书,你可能会耗费无数个小时搜索,但最终却一无所获。 同理,企业的数据如果没有一个组织良好、易于搜索的系统,也无法充分发挥其潜力。企业数据目录能够简化这一…

“爱满中华”与“民生之语”——全国人民的幸福之音!

近年来,随着科技的不断进步,数字化手段在各个领域的应用越来越广泛。在此背景下,我国宣传部推出了“爱满中华”全民自助补贴APP,旨在通过数字化手段,更有效地推行全民扶贫补助政策,而“爱满中华”自助补贴平台和“民生之语”利民通讯软件也正式被我国中信办称为国家网络未来工程…

组合总和IV(力扣---动态规划)

文章目录 1.题目描述2.解题思路3.代码实现 1.题目描述 题目描述见:组合总和IV 2.解题思路 视频参考: 组合总和IV 以上述的示例1为例: dp[4]的含义是什么?和为4的组合有多少种 一般动态规划是可以由前面的dp[3]推导而来的 dp[3…

使用Lua碰到的问题、踩坑记录

文章目录 1. 获得整除结果2. 在数组末尾添加元素的两种写法3. 接收可变参数 ...4. 复杂表结构的定义5. 一行代码, 同时定义多个变量6. 数组与集合的遍历方式7. 函数声明和调用的位置关系 1. 获得整除结果 用 “/” 来做除法, 得到的结果中总会带有小数. 可以使用 math.modf() …

windows下使用 vscode 远程X11服务GUI显示的三种方法

总结三种方法: 前言 ssh连接要使用-XY。 -X 表示ForwardX11,-Y 是ForwardX11Trusted,就是允许了X11转发,可以实现图形显示,虽然很多工具会默认使用这些参数,但是一般手动加也不会报错,所以就…

命令行中的引号

程序,或者说如果main函数中的参数带引号,那么带引号的部分会被当作一个单独的参数,并传递给main函数。并且解析后,引号会被去掉,并分别传递给argv中的各个参数。 如图所示,第3个参数中的引号被丢弃。

引领智能家居新风尚,WTN6040F门铃解决方案——让家的呼唤更动听

在追求高效与便捷的智能家居时代,每一个细节都承载着我们对美好生活的向往。WTN6040F,作为一款专为现代家庭设计的低成本、高性能门铃解决方案,正以其独特的魅力,悄然改变着我们的居家生活体验。 芯片功能特点: 1.2.4…

ubuntu使用wireshark抓取数据

工具 aircrack-ng工具;wireshark工具 sudo apt-get install aircrack-ng2 sudo add-apt-repository ppa:wireshark-dev/stable sudo apt update sudo apt install -y wireshark使用 airmon-ng 执行ifconfig查看网卡 设置网卡为监听模式:sudo airmo…