这个很好理解:
a b 按位异或得 c,那么 a c 按位异或得 b。
这样 a 为密匙 b为内容,c为加密过的内容。
下面是我以前写的(以前没看过你发的这个:),谢谢分享)。一个简单基于密匙的加解密类 
http://blog.csdn.net/SysTem128/archive/2008/04/17/2301108.aspx

解决方案 »

  1.   

    if($action=="EN") $md5code=substr(md5($string),8,10); //动作是加密,则取明文的MD5码的 8到10位字符
    这个理解是错误的 导致LZ无法理解密钥的生成过程 从明文MD5码第9个字符起取10个字符密钥分私钥和公钥两部分
    公钥 $secret_string = $webdb[mymd5].'5*j,.^&;?.%#@!';
    私钥 加密 $md5code=substr(md5($string),8,10);解密 $md5code=substr($string,-10);
    公钥和私钥组合在一起 MD5得到密钥加密过程 LZ了解了 但不明白私钥是怎么保存的$code = ($action == "DE" ? (substr(md5($code),8,10)==$md5code?$code:NULL) : base64_encode($code)."$md5code"); 
    如果是加密 base64_encode($code)."$md5code") 把密文编码 并把密钥附在最后得到密文如果是解密 substr(md5($code),8,10)==$md5code?$code:NULL 验证私钥是否正确3元运算 写起来好看 但读起来不好理解 再读代码的时候可以试着把3元运算改写成if嵌套配合换行和缩进 就好理解了
      

  2.   

    他们明明用的是按位异或,注释里写的却是异或……单纯的说异或应该是指逻辑运算。$a xor $b   Xor(逻辑异或) TRUE,如果 $a 或 $b 任一为 TRUE,但不同时是 
    $a ^ $b     Xor(按位异或) 将把 $a 和 $b 中不同的位设为 1。 不同的东西么。