PHP自定义加密与解密原理及示例解析

雨后青山
雨后青山
发布时间:2026-10-14 | 4人浏览过
原创

在PHP开发中,有时需要对特定数据进行简单的混淆或保护。本文分享一个基于字符替换机制的自定义加密解密类 Crypto。它利用密码动态生成长度相同的字符表,对字母数字及部分符号进行移位替换。需要注意的是,该算法仅针对可见的可打印字符集,无法处理空格、换行符(\n)和制表符(\t)等特殊不可见字符。

加密解密核心逻辑

该实现的核心思想是“多表替换”。首先定义一个包含所有允许被加密字符的基准字符串 $ralphabet。根据用户提供的密码,截取基准串的子串作为加密映射表。加密时,将原文中的每个字符在当前映射表中寻找对应位置的字符;解密则是反向查找。

第一步:准备字符集与类结构

定义包含大写英文、小写英文、数字以及常见标点符号的字符串。为了便于处理边界循环,通常会将该字符串重复拼接一次作为辅助查表数组 $alphabet。

$ralphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890 !,.:;?~@#$%^&*()_+-=][}{/><"'";  
$alphabet = $ralphabet . $ralphabet;

创建 Crypto 类,主要包含 encrypt(加密)、decrypt(解密)两个核心方法。此外还提供了一个 cryption_table 方法用于可视化展示当前密码下的映射关系,便于调试和理解原理。

第二步:生成基于密码的动态映射表

无论是加密还是解密,第一步都是根据传入的 $password 生成一组偏移子串。代码遍历密码的每个字符,在 $alphabet 中找到该字符第一次出现的位置,并截取长度为 $ralphabet 的子串存入 $pos_alpha_ary 数组。

for( $i=0; $i<strlen($password); $i++ ){
    $cur_pswd_ltr = substr($password,$i,1);
    $pos_alpha_ary[] = substr(strstr($alphabet,$cur_pswd_ltr),0,strlen($ralphabet));
}

这个数组 $pos_alpha_ary 的长度等于密码长度。在后续处理原文时,会根据原文索引轮流使用这些子串作为查找依据。

第三步:执行加密操作

加密函数的参数为 $password 和待加密字符串 $strtoencrypt。遍历待加密字符串的每个字符:

  • 获取当前密码对应的子串 $pos_alpha_ary[$n](索引 $n 随循环递增并在到达密码长度时重置)。
  • 在基准串 $ralphabet 中找到原文字符的索引位置。
  • 用该索引去 $pos_alpha_ary[$n] 中取值,即为加密后的字符。
while($i<$c) {
    $encrypted_string .= substr($pos_alpha_ary[$n],strpos($ralphabet,substr($strtoencrypt,$i,1)),1);
    $n++; 
    if($n==$nn) $n = 0;
    $i++; 
}

第四步:执行解密操作

解密过程与加密类似,但查找方向相反。解密函数接收密码和解密串 $strtodecrypt:

  • 同样先生成基于密码的 $pos_alpha_ary 映射表组。
  • 遍历解密串,在 $pos_alpha_ary[$n] 中找到当前字符出现的索引位置。
  • 用该索引去基准串 $ralphabet 中取值,恢复原文字符。
while($i<$c) {
    $decrypted_string .= substr($ralphabet,strpos($pos_alpha_ary[$n],substr($strtodecrypt,$i,1)),1);
    $n++; 
    if($n==$nn) $n = 0;
    $i++; 
}

使用示例与注意事项

以下是一个完整的调用示例,演示如何实例化类并进行加密解密测试。注意代码中构建了一个简易的表单页面逻辑(在实际生产环境中建议分离视图与逻辑),通过 mod 参数切换加密或解密状态。

此代码主要用于教学和理解自定义加密机制,不适用于高安全性场景。对于生产环境,推荐使用 PHP 内置的 sodium_crypto_secretbox 或 openssl_encrypt 等经过严格验证的标准库。

// Example written by Macro Zeng 
$ct = new Crypto;
// $ct->cryption_table($password); // 可选:查看映射表

// 模拟POST提交逻辑
if (isset($_POST['mode'])) {
    $password = $_POST['password'];
    if ($_POST['mode'] == 'encrypt') {
        $output = $ct->encrypt($password, $_POST['input']);
        echo "Encrypted String: " . htmlspecialchars($output);
    } else {
        $output = $ct->decrypt($password, $_POST['input']);
        echo "Decrypted String: " . htmlspecialchars($output);
    }
}

重要限制说明

该算法明确不支持加密/解密无形字符。如果在原文中混入空格、换行符(\n)或制表符(\t),由于它们不在 $ralphabet 定义范围内,strpos 将返回 false 或导致非预期行为。因此,使用前需确保输入字符串已过滤或仅包含可打印字符。

完整文件引用

如需直接查看完整源码文件结构,可参考官方示例文件:

highlight_file("crypto.php");

以上就是PHP自定义加密与解密程序实现的详细内容,更多关于PHP开发安全的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表