盘点几种常用加密算法

news2024/11/24 5:03:13

文章目录

      • 前言
      • 常用算法
        • DES算法
          • DES算法特点
          • DES算法示例
        • AES算法
          • AES算法特点
          • AES算法示例
        • RSA算法
          • RSA算法特点
          • RSA算法示例
        • MD5算法
          • MD5算法特点
          • MD5算法示例
        • SHA算法
          • SHA算法特点
          • SHA算法示例
      • 总结
      • 写在最后

579a429daf314744b995f37351b46548

前言

随着互联网的发展,信息安全问题日益受到重视。加密算法在保证信息安全传输方面发挥着重要作用。本文将简要盘点几种常用的加密算法,介绍它们的基本原理、特点及应用情况,以帮助读者全面了解当前加密算法的发展状况。


常用算法

image-20231108224856865

DES算法

DES(Data Encryption Standard)是一种对称加密算法,被广泛用于金融、通信等领域。

DES算法特点
  1. 对称加密算法:加密和解密使用相同的密钥。

  2. 分组加密:明文被分成64位的组,每组用相同的密钥进行加密。

  3. 密钥长度为56位,经过置换选择、循环左移等操作生成16轮子密钥。

  4. 加密流程包括初始置换、16轮迭代运算、初始逆置换等。

  5. 算法结构相对简单,运算速度快。

DES算法示例
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import java.security.SecureRandom;

public class DESExample {

    public static void main(String[] args) throws Exception {
        KeyGenerator keyGenerator = KeyGenerator.getInstance("DES");
        SecureRandom secureRandom = new SecureRandom();
        keyGenerator.init(secureRandom);

        SecretKey key = keyGenerator.generateKey();
        Cipher desCipher = Cipher.getInstance("DES/ECB/PKCS5Padding");

        // 加密
        desCipher.init(Cipher.ENCRYPT_MODE, key);
        byte[] text = "Hello World".getBytes();
        byte[] textEncrypted = desCipher.doFinal(text);
        
        // 解密
        desCipher.init(Cipher.DECRYPT_MODE, key); 
        byte[] textDecrypted = desCipher.doFinal(textEncrypted);
        
        System.out.println("原文: " + new String(text));
        System.out.println("加密: " + new String(textEncrypted));
        System.out.println("解密: " + new String(textDecrypted));
    }
}

这段代码使用DES算法的Java JCE实现来完成一个字符串的加密和解密。关键是使用KeyGenerator生成密钥,Cipher完成加解密操作。DES现在也已经被AES等算法逐渐取代,但它的基本设计思路仍影响后续的对称算法。

AES算法

AES(Advanced Encryption Standard)是一种对称加密算法,它被广泛地应用于电子商务、互联网等信息系统中。

AES算法特点
  1. 使用对称加密,加解密使用相同密钥。

  2. 分组加密,明文被分成128位的块进行处理。

  3. 密钥长度可选择128、192、256位。

  4. 算法结构较复杂,包括字节替代、行移位、列混淆、轮密钥加等步骤。

  5. 安全性高,抗差分及线性攻击的能力强。

AES算法示例
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;

public class AESExample {

    public static void main(String[] args) throws Exception {

        KeyGenerator keyGen = KeyGenerator.getInstance("AES");
        keyGen.init(128); // 设置密钥长度为128位
        SecretKey secretKey = keyGen.generateKey();

        Cipher cipher = Cipher.getInstance("AES"); 

        // 加密
        cipher.init(Cipher.ENCRYPT_MODE, secretKey);
        byte[] text = "Hello World".getBytes();
        byte[] textEncrypted = cipher.doFinal(text); 

        // 解密
        cipher.init(Cipher.DECRYPT_MODE, secretKey);
        byte[] textDecrypted = cipher.doFinal(textEncrypted);
        
        System.out.println("原文: " + new String(text));
        System.out.println("加密: " + new String(textEncrypted));
        System.out.println("解密: " + new String(textDecrypted));
    }
}

该示例使用AES算法的Java JCE实现来完成一个字符串的加密和解密。AES具有更高的安全性,已逐渐取代DES成为对称加密的首选算法。

RSA算法

RSA是一种非对称加密算法,也是目前使用最广泛的公钥加密算法。

RSA算法特点
  1. 非对称加密:使用公钥加密,私钥解密,两个密钥互为对称。

  2. 安全性:RSA算法的安全性依赖于大整数分解问题的难度。

  3. 密钥长度通常为1024位或2048位。密钥越长,安全性越高,但加解密速度降低。

  4. 适用于数字签名和数据加密。

RSA算法示例
import javax.crypto.Cipher;
import java.security.*;

public class RSAExample {

  public static void main(String[] args) throws Exception {

    KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");
    keyPairGen.initialize(2048);
    KeyPair keyPair = keyPairGen.generateKeyPair();

    Cipher cipher = Cipher.getInstance("RSA");

    // 加密
    cipher.init(Cipher.ENCRYPT_MODE, keyPair.getPublic()); 
    byte[] text = "Hello World".getBytes();
    byte[] textEncrypted = cipher.doFinal(text);

    // 解密
    cipher.init(Cipher.DECRYPT_MODE, keyPair.getPrivate());
    byte[] textDecrypted = cipher.doFinal(textEncrypted);
    
    System.out.println("原文: " + new String(text));
    System.out.println("加密: " + new String(textEncrypted));
    System.out.println("解密: " + new String(textDecrypted));
  } 
}

该例子中我们使用RSA算法生成了一对公钥和私钥,并利用公钥加密,私钥解密完成了对字符串的RSA加密。RSA能够实现安全的信息传输,是网络通信中的重要加密算法。

MD5算法

MD5是一种广泛使用的哈希算法,主要用于生成信息摘要。

MD5算法特点
  1. 生成128位的信息摘要。

  2. 哈希值的微小变化会产生完全不同的哈希结果。

  3. 计算MD5哈希值很快。

  4. MD5是一种单向哈希算法,无法通过哈希值反算出原文。

  5. MD5在强碰撞攻击下不安全,通常用于数据完整性验证,不用于数字签名。

MD5算法示例
import java.security.MessageDigest;

public class MD5Example {

  public static void main(String[] args) throws Exception {
    String input = "Hello World";
    
    MessageDigest md = MessageDigest.getInstance("MD5");
    byte[] inputByteArray = input.getBytes();
    md.update(inputByteArray);
    byte[] resultByteArray = md.digest();

    for (int i = 0; i < resultByteArray.length; i++) {
      System.out.printf("%02x", resultByteArray[i]);
    }
  } 
}

该示例通过MessageDigest类获取MD5算法实现,并生成输入字符串的MD5哈希值。MD5可用于快速生成文件、字符串等数据的数字指纹。

SHA算法

SHA(Secure Hash Algorithm)是一系列密码散列函数,主要用于生成数字指纹保障数据完整性。

SHA算法特点
  1. 生成长度固定的信息摘要,常见的有SHA-1、SHA-256、SHA-512等。

  2. 抗修改性强,对输入数据稍加修改会得到完全不同的哈希值。

  3. 抗碰撞性强,难以找到两段内容哈希值相同的碰撞。

  4. 不可逆性,无法通过哈希值反算出原始数据。

  5. 哈希运算速度快。

SHA算法示例
import java.security.MessageDigest;

public class SHAExample {

  public static void main(String[] args) throws Exception {
    
    String input = "Hello World";
  
    MessageDigest md = MessageDigest.getInstance("SHA-256");
    md.update(input.getBytes());  
    byte[] digest = md.digest();
    
    for (byte b : digest) {
      System.out.printf("%02x", b); 
    }
  } 
}

该示例通过MessageDigest获取SHA-256算法实现,并生成输入字符串的哈希值。SHA系列广泛用于数字签名、数据完整性验证等场景中。


总结

通过上文的介绍,我们了解到DES、AES、RSA、MD5、SHA等是当前应用最广泛的几种加密算法。这些算法在保证信息安全方面各有优势。DES具有运算速度快的特点,AES安全性更高,RSA是目前最优秀的公开密钥系统,MD5和SHA系列是常用的消息摘要算法。各种算法在继承前人研究的基础上不断改进,为我们提供了更多可选择的信息安全保障手段。信息安全领域仍有许多问题值得我们持续探索,相信通过科研人员的不断努力,会有更多更优秀的加密算法问世,为构建一个安全的信息化社会提供支持。


写在最后

感谢您的支持和鼓励! 😊🙏

如果大家对相关文章感兴趣,可以关注公众号"架构殿堂",会持续更新AIGC,系统架构, 分布式, java, GO, python, 游戏相关 等系列文章,一系列干货随时送达!

csdn-end

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

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

相关文章

力扣算法-----一刷总结

之前学习算法题坚持不了几天就很容易放弃&#xff0c;一直没怎么系统的练习&#xff0c;偶然发现代码随想录居然推出了算法训练营&#xff0c;趁着时间比较足报了名跟着学习了两个月。 过去的两个月&#xff0c;中间伴着各种琐事&#xff0c;但还是坚持了下来&#xff0c;走过…

网络安全之CSRF漏洞原理和实战,以及CSRF漏洞防护方法

一、引言 总体来说CSRF属于一种欺骗行为&#xff0c;是一种针对网站的恶意利用&#xff0c;尽管听起来像跨站脚本&#xff08;XSS&#xff09;&#xff0c;但是与XSS非常不同&#xff0c;并且攻击方式几乎向佐。XSS利用站点内的信任用户&#xff0c;而CSRF则通过伪装来自受信任…

如何使用ArcGIS Pro制作个性三维地形图

制作三维地图制作的多了&#xff0c;想着能不能换个“口味”&#xff0c;恰好看见制作六边形蜂窝图&#xff0c;灵光一闪&#xff0c;想着将二者结合&#xff0c;将平滑的三维地形图改成柱状图&#xff0c;从结果来看还可以&#xff0c;这里将制作方法分享给大家&#xff0c;希…

基于51单片机太阳能热水器控制系统-proteus仿真-程序

、系统方案 系统设计将软件设计内容分为了六大模块&#xff0c;分别是蜂鸣器报警、水位检测、DS18B20模块、液晶显示、加热模块、按键模块&#xff0c;系统将其进行分别设计&#xff0c;接通电源之后&#xff0c;单片机分别向LCD1602液晶显示器、DS18B20模块、和按键发出初始化…

C【整数正序分解】

// 整数正序分解 #include <stdio.h> #include <stdlib.h>int main() {int x;scanf("%d", &x);// 13425/10000->1(int一个d)// 13425%10000->3425(这是x)// 10000/10-.1000(这是mask)int mask 1;int t x;while (t > 9){t / 10;mask * 10;…

安装dubbo-admin报错node版本和test错误

✅作者简介&#xff1a;CSDN内容合伙人、信息安全专业在校大学生&#x1f3c6; &#x1f525;系列专栏 &#xff1a;dubbo-admin安装 &#x1f4c3;新人博主 &#xff1a;欢迎点赞收藏关注&#xff0c;会回访&#xff01; &#x1f4ac;舞台再大&#xff0c;你不上台&#xff0…

JAVA安全之Log4j-Jndi注入原理以及利用方式

什么是JNDI&#xff1f; JDNI&#xff08;Java Naming and Directory Interface&#xff09;是Java命名和目录接口&#xff0c;它提供了统一的访问命名和目录服务的API。 JDNI主要通过JNDI SPI&#xff08;Service Provider Interface&#xff09;规范来实现&#xff0c;该规…

matlab中实现画函数图像添加坐标轴

大家好&#xff0c;我是带我去滑雪&#xff01; 主函数matlab代码&#xff1a; function PlotAxisAtOrigin(x,y); if nargin 2 plot(x,y);hold on; elsedisplay( Not 2D Data set !) end; Xget(gca,Xtick); Yget(gca,Ytick); XLget(gca,XtickLabel); YLget(gca,YtickLabel)…

csdn初始模板【自用】

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…

C++ Qt 学习(五):Qt Web 编程

1. Chrome 技术介绍 大多数 web 技术都是基于 chrome&#xff0c;例如 CEF、QCefView 以及 QWebEngineView&#xff0c;这些都是在 native 界面里用来显示 html 网页&#xff0c;并且可以与 web 交互 例如常见的登录窗口、优酷的视频区域、WPS 的稻壳商城等&#xff0c;这些都…

npm 下载包失败解决方案

1.【问题描述】使用 npm 下载vue项目依赖包时失败&#xff0c;版本不一致。 【解决方法】使用 npm install --force npm install --force 是一个命令行指令&#xff0c;用于在 Node.js 环境中使用 npm&#xff08;Node Package Manager&#xff09;安装包或模块。–force 参数表…

Apipost-Helper:IDEA中的类postman工具

今天给大家推荐一款IDEA插件&#xff1a;Apipost-Helper-2.0&#xff0c;写完代码IDEA内一键生成API文档&#xff0c;无需安装、打开任何其他软件&#xff1b;写完代码IDEA内一键调试&#xff0c;无需安装、打开任何其他软件&#xff1b;生成API目录树&#xff0c;双击即可快速…

AirTag追踪汽车

美国华盛顿特区&#xff0c;11月4日&#xff0c;在一项全新的抗击车辆盗窃的措施中&#xff0c;市长穆里尔•鲍泽签署了一项新计划&#xff0c;将向该市车辆盗窃频率较高的社区居民免费提供苹果AirTag追踪器。 AirTag是苹果公司推出的一款蓝牙跟踪设备&#xff0c;它依靠Findm…

JAVA将List转成Tree树形结构数据和深度优先遍历

引言&#xff1a; 在日常开发中&#xff0c;我们经常会遇到需要将数据库中返回的数据转成树形结构的数据返回&#xff0c;或者需要对转为树结构后的数据绑定层级关系再返回&#xff0c;比如需要统计当前节点下有多少个节点等&#xff0c;因此我们需要封装一个ListToTree的工具类…

Redis 键值类型及其存储结构

Redis 键值类型及其存储结构 键值类型 键的数据类型是字符串&#xff0c;值的类型有&#xff1a;字符串、列表、Hash、集合、有序集合。 键的存储和查找 Redis底层键的存储类似于Java中其他Hash存储结构&#xff1a;数组链表的组合。数组中存储的是Key Hash函数对数组长度取模…

《深入理解计算机系统》书籍学习笔记 - 第二课 - 位,字节和整型

Lecture 02 Bits,Bytes, and Integer 位&#xff0c;字节和整型 文章目录 Lecture 02 Bits,Bytes, and Integer 位&#xff0c;字节和整型Byte 字节位操作布尔代数集合的表现形式和操作C语言的逻辑操作 位移操作整型数值范围无符号与有符号数值无符号与有符号在C中 拓展和截断拓…

个人网厅——提取

目录 需求文档 公积金提取类 controller层 service层 service层实现类 1.验证&#xff08;个人账户&#xff09; 2.提交&#xff08;添加&#xff09; controller层 service层 service层实现类 3.分页查询 controller层 service层 service层实现类 4.详情查询 co…

键盘打字盲打练习系列之认识键盘——0

一.欢迎来到我的酒馆 盲打&#xff0c;yyds&#xff01; 目录 一.欢迎来到我的酒馆二.开始练习 二.开始练习 经常看视频&#xff0c;看到别人在键盘上一通干净利索的操作&#xff0c;就打出想要的文字。心里突然来一句&#xff1a;卧槽&#xff0c;打字贼快啊&#xff01;思索下…

【Java笔试强训】Day9(CM72 另类加法、HJ91 走方格的方案数)

CM72 另类加法 链接&#xff1a;另类加法 题目&#xff1a; 给定两个int A和B。编写一个函数返回AB的值&#xff0c;但不得使用或其他算数运算符。 题目分析&#xff1a; 代码实现&#xff1a; package Day9;public class Day9_1 {public int addAB(int A, int B) {// wr…

解析找不到msvcr100.dll文件的解决方法,4个方法修复msvcr100.dll

msvcr100.dll是Microsoft Visual C 2010运行库的组成部分&#xff0c;一些基于Visual C开发的软件运行时会依赖这个dll文件。出现“找不到msvcr100.dll”的错误提示&#xff0c;往往意味着这个文件在你的计算机系统中丢失或损坏&#xff0c;导致相关程序无法正常运行。以下是找…