天天看点

加密解密

/**
 * api 加密接口,轻量级加密算法
 */
function erp_api_encrypt($string) {

   $encryptKey = md5('test');
   $keyLen = strlen($encryptKey);

   $data = substr(md5($string.$encryptKey), 0, 8).$string;
   $dataLen = strlen($data);

   $rndkey = array();
   $box = array();
   $cipherText = "";

   for ($i = 0; $i < 256; $i++) {
      $rndkey[$i] = ord($encryptKey[$i % $keyLen]);
      $box[$i] = $i;
   }

   for ($i = 0, $j = 0; $i < 256; $i++) {
      $j = ($j + $box[$i] + $rndkey[$i]) % 256;
      $tmp = $box[$i];
      $box[$i] = $box[$j];
      $box[$j] = $tmp;
   }

   for ($i = 0, $j = 0, $k = 0; $i < $dataLen; $i++) {
      $k = ($k + 1) % 256;
      $j = ($j + $box[$k]) % 256;
      $tmp = $box[$k];
      $box[$k] = $box[$j];
      $box[$j] = $tmp;
      $cipherText .= chr(ord($data[$i]) ^ ($box[($box[$k] + $box[$j]) % 256]));
   }

   return str_replace('=', '', base64_encode($cipherText));
}

/**
 * api 解密接口,轻量级解密算法
 */
function erp_api_decrypt($cipherText) {

   $encryptKey = md5('test');
   $keyLen = strlen($encryptKey);

   $cipherText = base64_decode($cipherText);
   $textLen = strlen($cipherText);

   $rndkey = array();
   $box = array();
   $decryptText = "";

   for ($i = 0; $i < 256; $i++) {
      $rndkey[$i] = ord($encryptKey[$i % $keyLen]);
      $box[$i] = $i;
   }

   for ($i = 0, $j = 0; $i < 256; $i++) {
      $j = ($j + $box[$i] + $rndkey[$i]) % 256;
      $tmp = $box[$i];
      $box[$i] = $box[$j];
      $box[$j] = $tmp;
   }

   for ($i = 0, $j = 0, $k = 0; $i < $textLen; $i++) {
      $k = ($k + 1) % 256;
      $j = ($j + $box[$k]) % 256;
      $tmp = $box[$k];
      $box[$k] = $box[$j];
      $box[$j] = $tmp;
      $decryptText .= chr(ord($cipherText[$i]) ^ ($box[($box[$k] + $box[$j]) % 256]));
   }

   if (substr($decryptText, 0, 8) == substr(md5(substr($decryptText, 8).$encryptKey), 0, 8)) {
      return substr($decryptText, 8);
   } else {
      return false;
   }
}


/**
 * api 加密接口,轻量级加密算法   key值不固定,copy erp_api_encrypt
 */
function api_encrypt($string,$key='') {

    //$encryptKey = md5('test');
    $encryptKey = md5($key);
    $keyLen = strlen($encryptKey);

    $data = substr(md5($string.$encryptKey), 0, 8).$string;
    $dataLen = strlen($data);

    $rndkey = array();
    $box = array();
    $cipherText = "";

    for ($i = 0; $i < 256; $i++) {
        $rndkey[$i] = ord($encryptKey[$i % $keyLen]);
        $box[$i] = $i;
    }

    for ($i = 0, $j = 0; $i < 256; $i++) {
        $j = ($j + $box[$i] + $rndkey[$i]) % 256;
        $tmp = $box[$i];
        $box[$i] = $box[$j];
        $box[$j] = $tmp;
    }

    for ($i = 0, $j = 0, $k = 0; $i < $dataLen; $i++) {
        $k = ($k + 1) % 256;
        $j = ($j + $box[$k]) % 256;
        $tmp = $box[$k];
        $box[$k] = $box[$j];
        $box[$j] = $tmp;
        $cipherText .= chr(ord($data[$i]) ^ ($box[($box[$k] + $box[$j]) % 256]));
    }

    return str_replace('=', '', base64_encode($cipherText));
}

/**
 * api 解密接口,轻量级解密算法  key值不固定,copy erp_api_decrypt
 */
function api_decrypt($cipherText,$key='') {

    //$encryptKey = md5('test');
    $encryptKey = md5($key);
    $keyLen = strlen($encryptKey);

    $cipherText = base64_decode($cipherText);
    $textLen = strlen($cipherText);

    $rndkey = array();
    $box = array();
    $decryptText = "";

    for ($i = 0; $i < 256; $i++) {
        $rndkey[$i] = ord($encryptKey[$i % $keyLen]);
        $box[$i] = $i;
    }

    for ($i = 0, $j = 0; $i < 256; $i++) {
        $j = ($j + $box[$i] + $rndkey[$i]) % 256;
        $tmp = $box[$i];
        $box[$i] = $box[$j];
        $box[$j] = $tmp;
    }

    for ($i = 0, $j = 0, $k = 0; $i < $textLen; $i++) {
        $k = ($k + 1) % 256;
        $j = ($j + $box[$k]) % 256;
        $tmp = $box[$k];
        $box[$k] = $box[$j];
        $box[$j] = $tmp;
        $decryptText .= chr(ord($cipherText[$i]) ^ ($box[($box[$k] + $box[$j]) % 256]));
    }

    if (substr($decryptText, 0, 8) == substr(md5(substr($decryptText, 8).$encryptKey), 0, 8)) {
        return substr($decryptText, 8);
    } else {
        return false;
    }
}