You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP与C#加密生成结果不一致,求PHP代码修改方案

问题分析与解决方案

问题核心在于C#与PHP的字符编码处理逻辑存在多处差异,尤其是在Unicode码点处理、字符长度统计和MD5结果格式上,以下是针对性的PHP代码修改方案:

修改后的PHP代码

function getEncryptedEmail($strEmailAdd, $iHashCode) {
    // 获取邮箱的UTF-8字符总数(对应C#的strEmailAdd.Length)
    $length = mb_strlen($strEmailAdd, 'UTF-8');
    $xorredChars = [];
    
    for ($i = 0; $i < $length; $i++) {
        // 获取当前字符的Unicode码点(对应C#中char类型的原始值)
        $charCode = mb_ord(mb_substr($strEmailAdd, $i, 1, 'UTF-8'), 'UTF-8');
        // 执行异或运算(与C#的strEmailAdd[i] ^ c逻辑完全对齐)
        $xorredCode = $charCode ^ $iHashCode;
        // 将异或后的码点转回UTF-8字符
        $xorredChars[] = mb_chr($xorredCode, 'UTF-8');
    }
    
    // 拼接异或后的字符并转为UTF-8字节序列(对应C#的Encoding.UTF8.GetBytes(array))
    $xorredStr = implode('', $xorredChars);
    $bytes = mb_convert_encoding($xorredStr, 'UTF-8');
    
    // 计算MD5并转为大写格式(匹配C#的X2大写十六进制输出)
    $mD5Hash = strtoupper(md5($bytes));

    if (strlen($mD5Hash) <= 0) {
        echo "Error in product activation.";
        return "";
    }

    return $mD5Hash;
}

关键修改点说明

  1. 字符长度统计:

    • 替换strlen为mb_strlen($strEmailAdd, 'UTF-8'),因为strlen按字节数统计,而C#的strEmailAdd.Length按Unicode字符数统计,当邮箱包含多字节UTF-8字符时,两者统计结果会不一致,导致循环次数错误。
  2. Unicode码点处理:

    • 用mb_ord获取字符的Unicode码点,直接与$iHashCode执行异或运算,避免了原代码中chr($iHashCode)的截断问题(PHP的chr仅支持0-255的字节值,当iHashCode超过255时会自动取模,这是3位哈希码结果差异的核心原因)。
  3. UTF-8编码转换:

    • 移除错误的utf8_encode调用,该函数是将ISO-8859-1编码转为UTF-8,与C#直接将Unicode字符转为UTF-8字节的逻辑完全不符,改用mb_chr和mb_convert_encoding实现对齐。
  4. MD5结果格式:

    • 用strtoupper将MD5结果转为大写,匹配C#中ToString("X2")生成的大写十六进制字符串格式。

内容的提问来源于stack exchange,提问作者Aarohi Dutta

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 14:20:22