对称加密(也叫私钥加密)指加密和解密使用相同密钥的加密算法.有时又叫传统密码算法,就是加密密钥能够从解密密钥中推算出来,同时解密密钥也可以从加密密钥中推算出来.而在大多数的对称算法中,加密密钥和解密密钥是相同的,所以也称这种加密算法为秘密密钥算法或单密钥算法.它要求发送方和接收方在安全通信之前,商定一个密钥.对称算法的安全性依赖于密钥,泄漏密钥就意味着任何人都可以对他们发送或接收的消息解密,所以密钥的保密性对通信性至关重要.
在项目中经常会遇到php加密解密算法,最近项目需要一个AS3和php的加解密算法,经过努力,终于完成了.只要密钥相同,AS3和php就能互相加密解密.现备注下:
/** *字符串加解密函数 php *@param string $string 字符串 *@param string $operation ENCODE:加密 DECODE:解密 默认:ENCODE *@param string $key 密钥:数字 字母 下划线 */ function sysAuthCode($string,$operation='ENCODE',$key= 'keychenai'){ if($operation='DECODE') $string = base64_decode($string); $len = strlen($key); $strlen = strlen($string); $code = ''; for($i = 0;$i < $strlen;$i++){ $k = $i % $len; //关键点:AS与php在位移的不同就是as不能处理0的位移,而php可以处理,因此必须加1,直接绕过as中因0出现bug的可能性 $code .= chr(ord($string[$i]) ^ ord($key[$k]) +1); } if($operation='DECODE') $code = base64_encode($code); return $code; } $aa = sysAuthCode('wangying','ENCODE'); var_dump($aa); $bb = sysAuthCode($aa,'DECODE'); var_dump($bb);
对位运算^(按位异或)存在疑惑可参考:对php位运算^(按位异或)的理解
/** *字符串加解密函数 AS3 *@param string string 字符串 *@param string operation ENCODE:加密 DECODE:解密 默认:ENCODE *@param string key 密钥:数字 字母 下划线 */ package { import flash.display.Sprite; import flash.utils.ByteArray; import mx.utils.Base64Decoder; import mx.utils.Base64Encoder; import flash.utils.Endian; /** * ... * @author */ public class Main extends Sprite { public function Main() { trace(sysAuthCode("wangying","ENCODE")); trace(sysAuthCode("RVJaVUpdXFQ.","DECODE")); } //解码 private function decode(str:String = null):String { var base64:Base64Decoder; base64 = new Base64Decoder(); base64.decode(str); var temp:String = base64.toString(); return temp; } //加密 private function encode(str:String):String { var b64Str:String; var base64:Base64Encoder = new Base64Encoder(); base64.encode(str); b64Str = base64.toString(); return b64Str; } /* * str:String(加密后的一个字符串) * operation:String(变量) * key:String(键值) * */ public function sysAuthCode(str:String = null, operation:String = "ENCODE", key:String = "keychenai"):String { if (operation == 'DECODE') { str = decode(str); } var keyLength:Number = key.length; var strLength:Number = str.length; var code:String = ""; for (var i:uint = 0; i < strLength; i++) { var k:Number = i % keyLength; //关键点:AS与php在位移的不同就是as不能处理0的位移,而php可以处理,因此必须加1,直接绕过as中因0出现bug的可能性 code += String.fromCharCode(str.charCodeAt(i) ^ key.charCodeAt(k) + 1); } if (operation == 'ENCODE') { code = encode(code); } return code; } } }