用python解密数据,用php加密

2024-05-14 22:25:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我得到了pycrypto所需的字符串,但它返回了一个不正确的结果。你知道吗

<?php
define('MCRYPT_SECRET_KEY', '1d46a31baeab9cf69184d1f92ba5b9f8');
function decode($encode_str) {
    $key = pack('H*',MCRYPT_SECRET_KEY);
    //var_dump($key);echo "\n";
    $iv_size = mcrypt_get_iv_size(MCRYPT_3DES, MCRYPT_MODE_ECB);
    //var_dump($iv_size);echo "\n";
    $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
    //var_dump($iv);echo "\n";

    $encode_str = str_replace(['-', '_'], ['+', '/'], $encode_str);
    $mod4 = strlen($encode_str) % 4 and $encode_str .= substr('====', $mod4);
    //var_dump($encode_str);echo "\n";
    $decrypt = base64_decode($encode_str);
    //var_dump($decrypt);echo "\n";
    $decrypt = mcrypt_decrypt(MCRYPT_3DES, $key, $decrypt, MCRYPT_MODE_ECB);

    return $decrypt;
}
echo "aFOYNZB4Ye4 : ".decode("aFOYNZB4Ye4")."\n";

结果:

aFOYNZB4Ye4 : 13455

但是当我使用python时,我不能得到正确的结果。你知道吗

# coding: utf-8
import sys,os,base64
from Crypto.Cipher import DES3

key = "1d46a31baeab9cf69184d1f92ba5b9f8".decode("hex")

def urlsafe_mcryptdecode(idstr):
    try:
        print len(key),key,'\n'
        idstr = idstr.replace('-','+').replace('_','/')
        mod4 = len(idstr) % 4
        data=idstr+"===="[mod4:]
        #print len(data),data,'\n'
        base64_str = base64.b64decode(data)
        #print len(base64_str),base64_str,'\n'
        cipher = DES3.new(key, DES3.MODE_ECB)
        id_ = cipher.decrypt(base64_str)
        #print len(id_),id_,'\n'
        return id_
    except Exception,e:
        print "ERROR",e
        return idstr+"#error"

print urlsafe_mcryptdecode("aFOYNZB4Ye4")

结果不是13455。你知道吗

在解密之前,所有输出的每个结果都是相同的。我的代码怎么了?谢谢。你知道吗


Tags: keyechosizelenvardumpencodeprint
1条回答
网友
1楼 · 发布于 2024-05-14 22:25:43

问题是在php5.6.0之前,函数mcrypt_decrypt()会默默地填充键。您的密钥是16个字节,但是,密钥需要是24个字节,因此它在内部填充为24个字节,后面是NUL字节。较新的^{}的PHP文档中提到了这一点—请参阅Changelog部分。你知道吗

在Python中解密时需要考虑到这一点。您可以使用ljust()将NUL字节附加到已解码密钥的末尾:

key = "1d46a31baeab9cf69184d1f92ba5b9f8".decode("hex").ljust(24, '\0')

或者

key = "1d46a31baeab9cf69184d1f92ba5b9f8".decode("hex") + ('\0' * 8)

我注意到您的PHP代码生成了一个它不使用的IV。没关系,没什么问题,我想我会指出的,以防你认为它被使用了。你知道吗

顺便说一句,如果您使用的是PHP>;=5.6.0,则需要显式地填充该键,或者首先使用一个24字节的键。在代码中,可以这样填充:

$key = pack('H*x8', MCRYPT_SECRET_KEY);

它将在密钥的末尾附加8个NUL字节。你知道吗

相关问题 更多 >

    热门问题