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

对称加密算法

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

  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/

 

常见加密解密算法及其在 PHP 中的实现的更多相关文章

  1. Python常见加密解密算法

    Python爬虫常见加密解密算法 url encode加密 简介:当url地址含有中文,或者参数有中文的时候,这个算是很正常了,但是把这样的url作为参数传递的时候(最常见的callback) ,需要 ...

  2. N个整数(数的大小为0-255)的序列,把它们加密为K个整数(数的大小为0-255).再将K个整数顺序随机打乱,使得可以从这乱序的K个整数中解码出原序列。设计加密解密算法,且要求K<=15*N.

    N个整数(数的大小为0-255)的序列,把它们加密为K个整数(数的大小为0-255).再将K个整数顺序随机打乱,使得可以从这乱序的K个整数中解码出原序列.设计加密解密算法,且要求K<=15*N. ...

  3. 一个经典的PHP加密解密算法

    项目中有时我们需要使用PHP将特定的信息进行加密,也就是通过加密算法生成一个加密字符串,这个加密后的字符串可以通过解密算法进行解密,便于程序对解密后的信息进行处理.最常见的应用在用户登录以及一些API ...

  4. 一个经典的PHP加密解密算法authcode

    项目中有时我们需要使用PHP将特定的信息进行加密,也就是通过加密算法生成一个加密字符串,这个加密后的字符串可以通过解密算法进行解密,便于程序对解密后的信息进行处理.最常见的应用在用户登录以及一些API ...

  5. 兼容javascript和C#的RSA加密解密算法,对web提交的数据进行加密传输

    Web应用中往往涉及到敏感的数据,由于HTTP协议以明文的形式与服务器进行交互,因此可以通过截获请求的数据包进行分析来盗取有用的信息.虽然https可以对传输的数据进行加密,但是必须要申请证书(一般都 ...

  6. RC4加密解密算法

    RC4相对是速度快.安全性高的加密算法.在实际应用中,我们可以对安全系数要求高的文本进行多重加密,这样破解就有一定困难了.如下测试给出了先用RC4加密,然后再次用BASE64编码,这样双重锁定,保证数 ...

  7. java 实现 DES加密 解密算法

    DES算法的入口参数有三个:Key.Data.Mode.其中Key为8个字节共64位,是DES算法的工作密钥:Data也为8个字节64位,是要被加密或被解密的数据:Mode为DES的工作方式,有两种: ...

  8. 数据的加密传输——单片机上实现TEA加密解密算法

    各位大侠在做数据传输时,有没有考虑过把数据加密起来进行传输,若在串口或者无线中把所要传的数据加密起来,岂不是增加了通信的安全性.常用的加密解密算法比如DES.RSA等,受限于单片机的内存和运算速度,实 ...

  9. DES对 json 、http参数加密解密算法

    网上众多大神们的众多方式实现加解密操作及保障数据安全性.今天无意中发现一篇以 DES加密解密算法.摘抄如下 工具类: import java.security.SecureRandom; import ...

  10. java加密解密算法位运算

    一.实例说明 本实例通过位运算的异或运算符 “ ^ ” 把字符串与一个指定的值进行异或运算,从而改变每个字符串中字符的值,这样就可以得到一个加密后的字符串.当把加密后的字符串作为程序输入内容,异或运算 ...

随机推荐

  1. dify打造数据可视化图表

    一.概述 在日常工作和学习中,我们经常需要和数据打交道.无论是分析报告.项目展示,还是简单的数据洞察,一个清晰直观的图表,往往能胜过千言万语. 一款能让数据可视化变得超级简单的 MCP Server, ...

  2. Web前端入门第 66 问:JavaScript 作用域应用场景(闭包)

    什么是作用域? 就像孙悟空给唐僧画个圈圈一样,这个圈圈就可以称之为作用域,这个比喻可能不太形象. 作用域和孙悟空的圈圈还是有点区别,作用域内部可以获得作用域外部的变量,而内部的变量无法逃逸到作用域外面 ...

  3. 网络编程TCP UDP

    网络编程 (1)什么是网络编程 网络编程是指通过编程语言在计算机之间建立通信的一种方式. 它是在互联网上进行数据传输的关键组成部分,使计算机能够相互通信.交换信息和共享资源. 网络编程涉及许多不同的技 ...

  4. C# 关于 &符号,字符串转字典Dictionary<string, string>

    private static Dictionary<string, string> ParseToDictionary(string str) { Dictionary<string ...

  5. AI领域又新增协议: AG-UI

    随着AI的快速发展正在重塑技术生态,协议的演进速度尤为迅猛.一个令人头疼的问题浮现了:不同的AI智能体和前端应用之间就像说着不同语言的人,无法顺畅交流.开发者们需要为每个智能体单独编写接口,维护成本高 ...

  6. MathQuill

    前言 跟 MathJax.KaTex 不同,mathquill 是一个真正意义上的公式编辑器. 一边输入一边渲染,输出可以是 Tex,但是对于复杂的公式,这种输入方式还是有很大的局限性,输入过程还是需 ...

  7. 前端开发系列061-网络篇之HTML页面渲染的基本过程

    本文描述了HTML页面渲染的基本(一般)过程,需要说明的是该文并不包含关于HTML解释器.CSS解释器.JavaScript引擎等相关部分内部的具体处理细节.该文旨在简单介绍网页从加载到被我们看到过程 ...

  8. PyCharm新建项目中无法调用Anaconda3中的包

    最近为了做一个新的Python项目,就在PyCharm上新建了一个项目,结果发现以前引入的包竟然在新项目中报错,提示没有发现这个包,因为我用的是Anaconda3来管理我的第三方包,所以就首先查看了A ...

  9. leetcode 918

    简介 环形数组的最大子数组的和的最大值. 思路 分两种情况讨论, 一种是最大子数组就是普通值, 那么只要求出正常值就可以了. 另一种情况是除去全局最小的中间一段, 然后就是最大值. code clas ...

  10. gerrit 遇到问题的解决方案 (missing subject; Change-Id must be in commit message footer)

    问题 ! [remote rejected] 13_13 -> refs/for/master (missing subject; Change-Id must be in commit mes ...