我有这个Python脚本来加密/解密URL:
# -*- coding: utf-8 -*-
import base64
from operator import itemgetter
class cryptUrl:
def __init__(self):
self.key = 'secret'
def encode(self, str):
enc = []
for i in range(len(str)):
key_c = self.key[i % len(self.key)]
enc_c = chr((ord(str[i]) + ord(key_c)) % 256)
enc.append(enc_c)
return base64.urlsafe_b64encode("".join(enc))
def decode(self, str):
dec = []
str = base64.urlsafe_b64decode(str)
for i in range(len(str)):
key_c = self.key[i % len(self.key)]
dec_c = chr((256 + ord(str[i]) - ord(key_c)) % 256)
dec.append(dec_c)
return "".join(dec)
url = "http://google.com";
print cryptUrl().encode(url.decode('utf-8'))
这很好用。例如,上面的网址转换为 29nX4p-joszS4czg2JPG4dI = ,解密会将其恢复为网址。
现在我想将其转换为PHP函数。到目前为止加密工作正常....但解密不是....我不知道为什么.....到目前为止我得到了这个:
function base64_url_encode($input) {
return strtr(base64_encode($input), '+/=', '-_');
}
function base64_url_decode($input) {
return strtr(base64_decode($input), '-_', '+/=');
}
function encode ($str)
{
$key = 'secret';
$enc = array();
for ($i;$i<strlen($str);$i++){
$key_c = $key[$i % strlen($key)];
$enc_c = chr((ord($str[$i]) + ord($key_c)) % 256);
$enc[] = $enc_c;
}
return base64_url_encode(implode($enc));
}
function decode ($str)
{
$key = 'secret';
$dec = array();
$str = base64_url_decode($str);
for ($i;$i<strlen($str);$i++){
$key_c = $key[$i % strlen($key)];
$dec_c = chr((256 + ord($str[$i]) + ord($key_c)) % 256);
$dec[] = $dec_c;
}
return implode($dec);
}
$str = '29nX4p-joszS4czg2JPG4dI=';
echo decode($str);
现在上面的解码打印出来: N&gt;:Tý\&amp;™åª-Væ,它不是http://google.com:p 就像我说编码功能有效。 为什么解码不起作用?我错过了什么?
顺便说一句,我不能使用任何其他编码/解码功能。我有一个用python编码的URL列表,我想将整个系统移动到基于PHP的站点....所以我需要使用PHP函数而不是python来解码这些URL。
(使用此页面执行Python:http://www.compileonline.com/execute_python_online.php)
答案 0 :(得分:1)
仔细检查 strtr() 的语法。
我建议你以下列方式使用:
strtr(
base64_encode($input),
array(
'+' => '-',
'/' => '_',
'=' => YOUR_REPLACE_CHARACTER
)
)
确保您拥有 YOUR_REPLACE_CHARACTER !
另外,我确定你会处理反向函数,你需要简单地翻转替换数组的值。