当前位置: 首页 > news >正文

常用的三种加密算法

加密算法的主要类型

    • 加密算法的主要类型
      • 1. 对称加密算法
      • 2. 非对称加密算法
      • 3. 哈希函数(相关但非严格加密)
    • 总体比较与总结

加密算法的主要类型

加密算法用于保护数据的机密性,确保信息在传输或存储过程中不被未授权方访问。根据密钥的使用方式,加密算法主要分为两大类:对称加密和非对称加密。此外,哈希函数虽然不直接用于加密,但在加密系统中扮演重要角色(如数据完整性验证)。下面我将逐步介绍这些类型,包括常见算法和基本原理,帮助您全面理解。

1. 对称加密算法

对称加密算法使用同一个密钥进行加密和解密操作。这意味着发送方和接收方必须安全地共享该密钥。对称加密通常高效快速,适合处理大量数据,但密钥管理是主要挑战(例如,如何安全分发密钥)。

  • 常见算法

    • AES(高级加密标准):目前最广泛使用的对称加密算法,支持128位、192位或256位密钥长度。它基于置换和置换网络,安全性高。
    • DES(数据加密标准):一种较旧的算法,使用56位密钥,但由于密钥长度较短,已不再安全,常被3DES替代。
    • 3DES(三重DES):DES的增强版,通过三次应用DES提高安全性,但速度较慢。
    • Blowfish:一种快速且灵活的算法,支持可变密钥长度,常用于文件加密。
  • 数学表示
    KKK为共享密钥,PPP为明文,CCC为密文。
    加密过程:C=EK(P)C = E_K(P)C=EK(P)
    解密过程:P=DK(C)P = D_K(C)P=DK(C)
    其中EKE_KEKDKD_KDK表示基于密钥KKK的加密和解密函数。

  • 对称加密算法(AES)Java实现
    AES是一种分组密码算法,处理固定长度的数据块(通常为128位)。
    密钥长度支持128位、192位或256位,分别对应AES-128、AES-192和AES-196。加密过程包括多个轮(rounds),轮数取决于密钥长度:例如,AES-128有10轮。以下是完整的AES算法实现示例:

import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.security.SecureRandom;
import java.util.Base64;public class AESEncryption {// 加密方法public static String encrypt(String plainText, String secretKey) throws Exception {// 生成128位密钥byte[] keyBytes = secretKey.getBytes("UTF-8");SecretKeySpec keySpec = new SecretKeySpec(keyBytes, "AES");// 生成随机初始化向量byte[] iv = new byte[16];SecureRandom random = new SecureRandom();random.nextBytes(iv);IvParameterSpec ivSpec = new IvParameterSpec(iv);// 初始化加密器Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivSpec);// 执行加密byte[] encrypted = cipher.doFinal(plainText.getBytes("UTF-8"));// 组合IV和密文 (IV + 密文)byte[] combined = new byte[iv.length + encrypted.length];System.arraycopy(iv, 0, combined, 0, iv.length);System.arraycopy(encrypted, 0, combined, iv.length, encrypted.length);return Base64.getEncoder().encodeToString(combined);}// 解密方法public static String decrypt(String encryptedText, String secretKey) throws Exception {// 解码Base64byte[] combined = Base64.getDecoder().decode(encryptedText);// 分离IV和密文byte[] iv = new byte[16];byte[] encrypted = new byte[combined.length - iv.length];System.arraycopy(combined, 0, iv, 0, iv.length);System.arraycopy(combined, iv.length, encrypted, 0, encrypted.length);// 准备密钥和IVbyte[] keyBytes = secretKey.getBytes("UTF-8");SecretKeySpec keySpec = new SecretKeySpec(keyBytes, "AES");IvParameterSpec ivSpec = new IvParameterSpec(iv);// 初始化解密器Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec);// 执行解密byte[] decrypted = cipher.doFinal(encrypted);return new String(decrypted, "UTF-8");}// 使用示例public static void main(String[] args) {try {String secretKey = "ThisIsASecretKey123"; // 128位密钥(16字符)String originalText = "需要加密的敏感数据";// 加密String encrypted = encrypt(originalText, secretKey);System.out.println("加密结果: " + encrypted);// 解密String decrypted = decrypt(encrypted, secretKey);System.out.println("解密结果: " + decrypted);} catch (Exception e) {e.printStackTrace();}}
}

2. 非对称加密算法

非对称加密算法使用一对密钥:公钥(public key)和私钥(private key)。公钥用于加密数据,私钥用于解密。公钥可以公开分发,而私钥必须保密。这种方法解决了密钥分发问题,但计算开销较大,适合密钥交换或数字签名等场景。

  • 常见算法

    • RSA:最流行的非对称算法,基于大数分解难题。广泛用于SSL/TLS协议和数字签名。
    • ECC(椭圆曲线加密):使用椭圆曲线数学,提供与RSA相当的安全性但密钥更短,效率更高,适用于资源受限设备。
    • Diffie-Hellman:主要用于密钥交换,允许双方在不安全的通道上建立共享密钥,但不直接用于加密数据。
  • 数学表示
    PKPKPK为公钥,SKSKSK为私钥,PPP为明文,CCC为密文。
    加密过程:C=EPK(P)C = E_{PK}(P)C=EPK(P)
    解密过程:P=DSK(C)P = D_{SK}(C)P=DSK(C)
    例如,在RSA中,加密涉及模幂运算:C=PemodnC = P^e \mod nC=Pemodn
    其中eeennn是公钥的一部分,私钥用于计算逆运算。

  • 非对称加密算法(RSA)Java实现
    非对称加密使用公钥加密、私钥解密,核心算法基于大数因子分解难题。以下是完整的RSA算法实现示例:

import java.security.*;
import javax.crypto.*;
import java.util.Base64;public class RSAExample {public static void main(String[] args) throws Exception {// 1. 生成密钥对KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");keyGen.initialize(2048); // 密钥长度2048位KeyPair keyPair = keyGen.generateKeyPair();PublicKey publicKey = keyPair.getPublic();PrivateKey privateKey = keyPair.getPrivate();// 2. 加密明文(公钥加密)String plainText = "重要加密数据";Cipher encryptCipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");encryptCipher.init(Cipher.ENCRYPT_MODE, publicKey);byte[] cipherText = encryptCipher.doFinal(plainText.getBytes());String encodedCipher = Base64.getEncoder().encodeToString(cipherText);// 3. 解密密文(私钥解密)Cipher decryptCipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");decryptCipher.init(Cipher.DECRYPT_MODE, privateKey);byte[] decryptedBytes = decryptCipher.doFinal(Base64.getDecoder().decode(encodedCipher));String decryptedText = new String(decryptedBytes);System.out.println("原文: " + plainText);System.out.println("密文: " + encodedCipher);System.out.println("解密结果: " + decryptedText);}
}

3. 哈希函数(相关但非严格加密)

哈希函数不属于加密算法,因为它不涉及密钥,也无法解密。但它在加密系统中至关重要,用于验证数据完整性(例如,确保消息未被篡改)或支持数字签名。哈希函数将任意长度输入映射到固定长度的输出(哈希值),具有单向性和抗碰撞性。

  • 常见算法

    • SHA-256:安全哈希算法家族的一部分,输出256位哈希值,广泛用于区块链和证书签名。
    • MD5:较旧的算法,输出128位哈希值,但由于易受碰撞攻击,已不再推荐用于安全场景。
  • 数学表示
    MMM为消息,HHH为哈希函数。
    哈希计算:H(M)H(M)H(M)
    例如,输出为固定长度字符串,如256位二进制值。

  • MD5加密Java实现
    MD5是一种广泛使用的哈希算法,生成128位(16字节)的哈希值,属于不可逆加密,需要配合原文一起发送。在Java中可通过java.security.MessageDigest实现:

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;public class MD5Example {public static String md5Encrypt(String input) {try {// 获取MD5实例MessageDigest md = MessageDigest.getInstance("MD5");// 计算哈希值(字节数组)byte[] hashBytes = md.digest(input.getBytes());// 将字节数组转为十六进制字符串StringBuilder hexString = new StringBuilder();for (byte b : hashBytes) {// 确保单字节转为两位十六进制(补前导0)String hex = Integer.toHexString(0xff & b);if (hex.length() == 1) hexString.append('0');hexString.append(hex);}return hexString.toString();} catch (NoSuchAlgorithmException e) {throw new RuntimeException("MD5算法不可用", e);}}public static void main(String[] args) {String plainText = "HelloWorld";String encrypted = md5Encrypt(plainText);System.out.println("原始文本: " + plainText);System.out.println("MD5哈希值: " + encrypted);}
}

总体比较与总结

算法类型代表算法密钥管理速度主要应用领域
对称加密AES单一密钥大数据加密
非对称加密RSA公钥/私钥对密钥交换、签名
哈希算法SHA-256无密钥非常快数据完整性、验证
  • 共同点:三者都基于数学原理构建,确保信息安全;实际系统中常结合使用(如RSA交换AES密钥,再用AES加密数据,最后用SHA-256验证)。
  • 关键区别:对称加密高效但密钥分发难;非对称加密解决密钥分发但速度慢;哈希算法用于验证而非加密。
  • 建议:选择算法时需考虑场景:AES适合实时加密,RSA用于安全初始化,SHA-256用于防篡改。确保使用最新标准和足够密钥长度以应对安全威胁。
http://www.dtcms.com/a/289163.html

相关文章:

  • 金融工程、金融与经济学知识点
  • ICT模拟零件测试方法--电容测试
  • 算法讲解--复写零
  • 【OpenGL 渲染器开发笔记】5 顶点数据
  • LeetCode第337题_打家劫舍III
  • Spring Boot 配置文件解析
  • 《深入C++多态机制:从虚函数表到运行时类型识别》​
  • 牛客NC14661 简单的数据结构(deque双端队列)
  • python学智能算法(二十六)|SVM-拉格朗日函数构造
  • 非广告!! 【实用工具推荐】自用多功能视频播放器-РotРlayer详细图文安装使用教程
  • 【安卓笔记】RecyclerView之ItemDecoration实现吸顶效果
  • codepen使用
  • FFmpeg 图片处理
  • 数据结构 | 栈:构建高效数据处理的基石
  • 【高等数学】第四章 不定积分——第三节 分部积分法
  • 【深度学习新浪潮】什么是robotaxi?
  • 【设计模式C#】享元模式(用于解决多次创建对象而导致的性能问题)
  • MPLS转发
  • windows C#-本地函数
  • Docker Compose 配置
  • docker compose 编排容器 mysql Springboot应用
  • 使用pytorch创建模型时,nn.BatchNorm1d(128)的作用是什么?
  • gradle关于dependency-management的使用
  • SpringBoot 整合 Langchain4j 实现会话记忆存储深度解析
  • OpenCV 入门知识:图片展示、摄像头捕获、控制鼠标及其 Trackbar(滑动条)生成!
  • 【LeetCode刷题指南】--反转链表,链表的中间结点,合并两个有序链表
  • Day25| 491.递增子序列、46.全排列
  • SQL Server(2022)安装教程及使用_sqlserver下载安装图文
  • redis-plus-plus安装与使用
  • [BUG]关于UE5.6编译时出现“Microsoft.MakeFile.Targets(44,5): Error MSB3073”问题的解决