将加密/解密功能从Python转换为PHP

时间:2014-04-04 12:49:02

标签: encryption

我有这个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

1 个答案:

答案 0 :(得分:1)

仔细检查 strtr() 的语法。

我建议你以下列方式使用:

strtr(
    base64_encode($input),
    array(
        '+' => '-',
        '/' => '_',
        '=' => YOUR_REPLACE_CHARACTER
    )
)

确保您拥有 YOUR_REPLACE_CHARACTER

另外,我确定你会处理反向函数,你需要简单地翻转替换数组的值。