PHP自定义加密与解密原理及示例解析
在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开发安全的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









