为什么用 php 编写的河豚代码在 Python 中给出不同的结果?

Why does blowfish code written in php give different results in Python?

我对加密不是很熟练,我一直在使用下面提到的php代码进行加密很长时间。现在我想用 python 编写相同的代码,但找不到解决方案。

<?PHP
  $iv_size = mcrypt_get_iv_size(MCRYPT_BLOWFISH, MCRYPT_MODE_ECB);
  $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
  $encrypted_string = mcrypt_encrypt(MCRYPT_BLOWFISH, "secret", 
  utf8_encode('changeme'), MCRYPT_MODE_ECB, $iv);
  echo $encrypted_string;
?>

结果:c811f6fe09f61abcf57623fc43554a17

我希望下面指定的代码给出相同的结果,但结果不一样,这可能是什么原因?

def PKCS5Padding(string):
    byteNum = len(string)
    packingLength = 8 - byteNum % 8
    appendage = chr(packingLength) * packingLength
    return string + appendage

def enc(string):
    key = b'secret'
    c1 = Blowfish.new(key, Blowfish.MODE_ECB)
    packedString = PKCS5Padding(string)
    return c1.decrypt(packedString.encode())
print(hashlib.md5(enc('changeme')).hexdigest())

结果:08c74df87caf3ed8456f0e01a4b7234b

您在 Python 代码中调用 c1.decrypt() 而不是 c1.encrypt(),并且 PHP 代码(在 mcrypt_encrypt() 内)只是将明文填充为带有空字节的 8 字节的倍数。以下给出与 PHP 代码相同的结果:md5(0x9da1192c5d3b3072) == 0xe3b3884a2e3986a01b8d750f9d724ff8

def enc(plaintext):
    key = b'secret'
    c1 = Blowfish.new(key, Blowfish.MODE_ECB)
    encoded = plaintext.encode()
    padded = encoded.ljust((len(encoded) + 7) // 8 * 8, b'[=10=]')
    return c1.encrypt(padded)