常见加密解密算法及其在 PHP 中的实现

news/2024/7/7 20:38:41/文章来源:https://www.cnblogs.com/ryanzheng/p/18284641

加密和解密算法在信息安全中起着至关重要的作用。以下是一些常见的加密和解密算法,包括对称加密、非对称加密和哈希算法。

对称加密算法

对称加密算法使用相同的密钥进行加密和解密。常见的对称加密算法包括:

  1. AES(Advanced Encryption Standard)
    • AES 是一种广泛使用的对称加密算法,支持 128 位、192 位和 256 位密钥长度。
    • 安全性高,性能好,适用于各种应用场景。
  2. DES(Data Encryption Standard)
    • DES 是一种较早的对称加密算法,使用 56 位密钥。
    • 由于密钥长度较短,安全性较低,已被更安全的算法(如 AES)取代。
  3. 3DES(Triple DES)
    • 3DES 是 DES 的增强版,通过三次加密提高安全性。
    • 使用三个 56 位密钥,总共 168 位密钥长度。
  4. Blowfish
    • Blowfish 是一种对称加密算法,支持可变长度密钥(32 位到 448 位)。
    • 适用于各种应用场景,性能较好。

Blowfish

Blowfish 加密算法支持多种加密模式,每种模式在处理数据块时的方式有所不同。以下是 Blowfish 算法常见的加密模式:

常见的加密模式

  1. ECB(Electronic Codebook)模式
    • 每个数据块独立加密。
    • 优点:简单易实现。
    • 缺点:相同的明文块会生成相同的密文块,容易受到模式分析攻击。
  2. CBC(Cipher Block Chaining)模式
    • 每个数据块在加密前与前一个密文块进行异或操作。
    • 优点:相同的明文块在不同位置会生成不同的密文块,安全性较高。
    • 缺点:需要初始化向量(IV),且加密过程不能并行化。
  3. CFB(Cipher Feedback)模式
    • 将前一个密文块加密后与当前明文块进行异或操作生成密文。
    • 优点:可以加密小于块大小的数据,适用于流加密。
    • 缺点:需要初始化向量(IV),且加密过程不能并行化。
  4. OFB(Output Feedback)模式
    • 将前一个加密输出块加密后与当前明文块进行异或操作生成密文。
    • 优点:可以加密小于块大小的数据,适用于流加密。
    • 缺点:需要初始化向量(IV),且加密过程不能并行化。
  5. CTR(Counter)模式
    • 使用计数器值加密后与明文块进行异或操作生成密文。
    • 优点:可以并行加密,适用于流加密。
    • 缺点:需要唯一的计数器值。

非对称加密算法

非对称加密算法使用一对密钥(公钥和私钥)进行加密和解密。常见的非对称加密算法包括:

  1. RSA(Rivest-Shamir-Adleman)
    • RSA 是一种广泛使用的非对称加密算法,基于大整数分解的数学难题。
    • 公钥用于加密,私钥用于解密,支持数字签名和密钥交换。
  2. ECC(Elliptic Curve Cryptography)
    • ECC 是一种基于椭圆曲线数学的非对称加密算法。
    • 相对于 RSA,ECC 提供相同安全级别的情况下,密钥长度更短,性能更好。

哈希算法

哈希算法用于生成固定长度的哈希值(摘要),常用于数据完整性校验和密码存储。常见的哈希算法包括:

  1. MD5(Message Digest Algorithm 5)
    • MD5 生成 128 位哈希值,速度快,但已被证明不够安全,容易发生碰撞攻击。
  2. SHA-1(Secure Hash Algorithm 1)
    • SHA-1 生成 160 位哈希值,安全性较 MD5 高,但也已被证明存在安全漏洞。
  3. SHA-2(Secure Hash Algorithm 2)
    • SHA-2 包括 SHA-224、SHA-256、SHA-384 和 SHA-512,生成 224 位到 512 位哈希值。
    • 安全性高,广泛应用于各种安全协议和应用。
  4. SHA-3(Secure Hash Algorithm 3)
    • SHA-3 是 SHA 系列的最新成员,基于 Keccak 算法,提供更高的安全性。

示例代码

以下是一些常见加密和解密算法的示例代码,使用 PHP 实现。

Blowfish CBC(使用 OpenSSL)

<?php
function blowfishEncryptCBC($data, $key) {$method = 'bf-cbc'; // Blowfish CBC 模式$iv = openssl_random_pseudo_bytes(openssl_cipher_iv_length($method));$encrypted = openssl_encrypt($data, $method, $key, OPENSSL_RAW_DATA, $iv);return base64_encode($iv . $encrypted);
}function blowfishDecryptCBC($data, $key) {$method = 'bf-cbc'; // Blowfish CBC 模式$data = base64_decode($data);$ivLength = openssl_cipher_iv_length($method);$iv = substr($data, 0, $ivLength);$encrypted = substr($data, $ivLength);return openssl_decrypt($encrypted, $method, $key, OPENSSL_RAW_DATA, $iv);
}// 示例用法
$key = 'your-encryption-key';
$data = 'Hello, World!';$encrypted = blowfishEncryptCBC($data, $key);
echo "Encrypted (CBC): $encrypted\n";$decrypted = blowfishDecryptCBC($encrypted, $key);
echo "Decrypted (CBC): $decrypted\n";
?>

 

AES 加密和解密(使用 OpenSSL)

<?php
function aesEncrypt($data, $key) {$iv = openssl_random_pseudo_bytes(openssl_cipher_iv_length('aes-256-cbc'));$encrypted = openssl_encrypt($data, 'aes-256-cbc', $key, 0, $iv);return base64_encode($iv . $encrypted);
}function aesDecrypt($data, $key) {$data = base64_decode($data);$iv = substr($data, 0, openssl_cipher_iv_length('aes-256-cbc'));$encrypted = substr($data, openssl_cipher_iv_length('aes-256-cbc'));return openssl_decrypt($encrypted, 'aes-256-cbc', $key, 0, $iv);
}$key = 'your-encryption-key';
$data = 'Hello, World!';$encrypted = aesEncrypt($data, $key);
echo "Encrypted: $encrypted\n";$decrypted = aesDecrypt($encrypted, $key);
echo "Decrypted: $decrypted\n";
?>

RSA 加密和解密(使用 OpenSSL)

<?php
// 生成密钥对
$privateKey = openssl_pkey_new(array('private_key_bits' => 2048,'private_key_type' => OPENSSL_KEYTYPE_RSA,
));
$publicKey = openssl_pkey_get_details($privateKey)['key'];// 加密
$data = 'Hello, World!';
openssl_public_encrypt($data, $encrypted, $publicKey);
$encrypted = base64_encode($encrypted);
echo "Encrypted: $encrypted\n";// 解密
$encrypted = base64_decode($encrypted);
openssl_private_decrypt($encrypted, $decrypted, $privateKey);
echo "Decrypted: $decrypted\n";
?>

SHA-256 哈希

<?php
$data = 'Hello, World!';
$hash = hash('sha256', $data);
echo "SHA-256 Hash: $hash\n";
?>

总结

  • 对称加密算法:AES、DES、3DES、Blowfish 等。
  • 非对称加密算法:RSA、ECC 等。
  • 哈希算法:MD5、SHA-1、SHA-2、SHA-3 等。

 

原文链接:https://www.ryanzoe.top/%e5%8a%a0%e5%af%86%e8%a7%a3%e5%af%86/%e5%b8%b8%e8%a7%81%e5%8a%a0%e5%af%86%e8%a7%a3%e5%af%86%e7%ae%97%e6%b3%95%e5%8f%8a%e5%85%b6%e5%9c%a8-php-%e4%b8%ad%e7%9a%84%e5%ae%9e%e7%8e%b0/

 

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

可视化数据看板/数字孪生大屏到底有没有实际价值?详解数据可视化的实用价值

数据驾驶舱/数据看板/可视化大屏的实际价值,取决于使用者的实际需求。华而不实?华就是实! 关于可视化大屏最广泛的争议,便是对其“华而不实”的批评,认为可视化大屏缺乏技术含量,只是一钟比较高级的“装饰品”,更是一种典型的“面子工程”。这种偏见乍一看似乎有其道理,…

osg使用整理(12):SSAO屏幕空间环境光遮蔽

一、基础概念 1、SSAO:通过将褶皱、孔洞和非常靠近墙面变暗的方法,近似模拟间接光照。SSAO称为屏幕空间环境光遮蔽 ,使用屏幕空间场景的深度而不是真实的几何体数据来确定遮蔽量,速度快效果好。2、实现原理:根据物体表面法线方向生成一个半球随机深度采样,主要看物体周围…

比赛获奖的武林秘籍:01 如何看待当代大学生竞赛中“卷”“祖传老项目”“找关系”的现象?

本文主要分析了大学生电子计算机类比赛中“卷”“祖传老项目”“找关系”的现象,结合自身实践经验,给出了相应的解决方案。比赛获奖的武林秘籍:01 如何看待当代大学生竞赛中“卷”“祖传老项目”“找关系”的现象? 正文 目前现状 对于大部分的比赛小白来说,对当前比赛的现…

2024.7.4 鲜花

今日推歌 natural Will you hold the line. 只有你还没有放弃。 When every one of them is giving up or giving in, tell me. 当其他所有人都停止了尝试,被挫折磨尽了希望。 In this house of mine,Nothing ever comes without a consequence or cost, tell me. 我所在之处,…

【python+selenium的web自动化】—— 控制浏览器

前言: 需本教程以Edge做测试,且谷歌、火狐等浏览器的逻辑都一样需要使用 selenium 模块操作 Edge 浏览器。 一、先通过pip install 模块 把selenium模块安装了,可以加一个中国源提升速度。pip install selenium -i https://pypi.tuna.tsinghua.edu.cn/simple二、需要下载Edg…

Python自动化之控制浏览器

前言: 需本教程以Edge做测试,且谷歌、火狐等浏览器的逻辑都一样需要使用 selenium 模块操作 Edge 浏览器。 一、先通过pip install 模块 把selenium模块安装了,可以加一个中国源提升速度。pip install selenium -i https://pypi.tuna.tsinghua.edu.cn/simple二、需要下载Edg…

设计模式-设计原则与设计模式总结

设计原则,是设计模式的基础。在实际开发中,并不是一定要求所有代码都遵循设计原则,我们需要综合考虑人力、时间、成本、质量,不是可以追求完美,要在设当的场景遵循合适的设计原则,体现的是一种平衡取舍,帮助我们设计出更加优雅的代码结构。 设计模式(Design Pattern)是前…

mirai Bot初始化配置

RT其实本来我的bot已经因为自己手贱登陆qq nt直接报废了,但是论坛里有佬提供了新的协议库,那这不赶紧复活bot都对不起这个新的协议库。 本文写于2024年7月4日19:20:21,可能随着时间久远而无法实现功能。由于存在下载障碍,所以这里也搞了个存档,本帖中的相关标星*资源无法下…

量化曲线的平滑程度

思路 1. 对原始数据一阶求导,得到一阶导数数组。 2. 对一阶导数数组求标准差。导数的标准差提供了导数值的波动性,标准差越小,曲线越平滑。 平滑曲线import numpy as np import matplotlib.pyplot as plt from matplotlib import font_manager fname="/usr/local/pytho…

Android常见错误

错误1 A problem occurred configuring root project ����ʶ��. > Could not resolve all files for configuration :classpath.> Could not resolve com.android.tools.build:gradle:8.4.0.Required by:project : > com.android.application:com.android.appli…

MyBatis中的Where标签:提升你的SQL查询效率

哈喽,大家好,我是木头左!理解MyBatis的Where标签 MyBatis是一款优秀的持久层框架,它提供了许多强大的标签来帮助编写更优雅、高效的SQL语句。其中,<where>标签是使用频率极高的一个,它能够自动处理查询条件,使得的SQL语句更加简洁和高效。在这篇文章中,将深入探讨…

Java中的JSON神器,如何轻松玩转复杂数据结构

哈喽,大家好,我是木头左!一、揭秘JSON世界的基石 在Java的世界中,JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它基于文本,易于阅读和编写,同时也易于机器解析和生成。JSON在日常开发中的应用非常广泛,无论是前后端的数据交互,还是配置文件的读取,…

《Python 第三方模块包安装指南》

在 Python 编程中,第三方模块包极大地丰富了其功能,让我们能够更高效地完成各种任务。下面将为您详细介绍如何安装 Python 的第三方模块包。 一、使用 pip 命令安装 pip 是 Python 的包管理工具,大多数情况下,我们可以通过以下命令来安装第三方模块包:pip install 模块包名…

巴图自动化Modbus转PN网关模块连智能仪表与PLC通讯

通过巴图自动化Modbus转Profinet协议网关模块,实现PLC对仪表设备的远程监控和数据传输,提高生产效率和运行稳定性。巴图自动化Modbus转Profinet协议转换BT-MDPN100网关模块的主要功能是实现Modbus协议和Profinet协议之间的转换和通信。Modbus 转 Profinet协议网关模块集成了M…

一文搞懂到底什么是 AQS

日常开发中,我们经常使用锁或者其他同步器来控制并发,那么它们的基础框架是什么呢?如何实现的同步功能呢?本文将详细用白话讲解构建锁和同步器的基础框架--AQS,并根据源码分析其原理。前言 日常开发中,我们经常使用锁或者其他同步器来控制并发,那么它们的基础框架是什么…

flutter状态管理 provider使用

provider是flutter官方推荐的状态管理插件,是基于InheritedWidget实现的。 下面我们来讲一个provider的使用方法。 1.在pubspec.yaml文件中添加 provider: ^6.1.2 开发文档:https://pub-web.flutter-io.cn/packages/provider 可以查看使用方法和最新版本号。 添加完成后…

企业数字化转型:顶层规划方法

随着数字化时代的到来,发生了以数字化、智能化为典型特征的新一轮科技革命,各行各业利用互联网、大数据、云计算、人工智能、区块链技术对传统产业进行全方位、全链条改造,实施“上云用数赋智”行动,全面推进各行业数字化转型。数字经济的大门已然开启,数字经济顶层战略规…

Nuxt3 的生命周期和钩子函数(十)

摘要:本文详细介绍了Nuxt3框架中的五个webpack钩子函数:webpack:configResolved用于在webpack配置解析后读取和修改配置;webpack:compile在编译开始前调用,可修改编译选项;webpack:compiled在编译完成后调用,可处理编译结果;webpack:change在开发模式下文件变化时触发,…

Jenkins汉化

1、Jenkins版本:版本2.426.3) Manage Jenkins->选择Plugins->切换到Availabled plugin->搜索local,然后选中安装,如下图所示 2、安装完成后重启Jenkins,汉化完成。如下图所示 像个小学生一样努力学习

模拟集成电路设计系列博客——9.1 比较器

模拟集成电路设计 9.1 比较器 比较器可能是继放大器之后第二常用的电路元件,比较器用于判断一个信号是否大于或小于零,或者比较一个信号是否大于另一个。如我们之前的章节所见,比较器在ADC中非常常用。在其他的应用中也经常出现比较器,例如数据传输,开关电源稳压器等等。 …