<p>首先,Java示例代码非常糟糕。它将密文输出为整数,而密文应保持为二进制字符串。原因是整数可以用无限多个二进制编码来表示。例如,数字1可以是“0x01”(1字节)、“0x0001”(2字节)等等。当你处理密码函数时,你必须非常精确的表示。在</p>
<p>此外,该示例使用<code>javax.crypto</code>API的默认值,在任何地方都没有描述。所以这真的是试错。在</p>
<p>对于解决方案,您必须知道<a href="https://stackoverflow.com/questions/7822956/how-to-convert-negative-integer-value-to-hex-in-python">how to convert negative integers to hex strings in Python</a>。在本例中,您不需要十六进制字符串,而是需要它的字节表示形式。但概念是一样的。我使用PyCrypto的<code>long_to_bytes</code>将正整数(任意长度)转换为字节字符串。在</p>
<pre><code>from Crypto.Cipher import Blowfish
from Crypto.Util.number import long_to_bytes
def tobytestring(val, nbits):
"""Convert an integer (val, even negative) to its byte string representation.
Parameter nbits is the length of the desired byte string (in bits).
"""
return long_to_bytes((val + (1 << nbits)) % (1 << nbits), nbits/8)
key = b'jaas is the way'
c1 = Blowfish.new(key, Blowfish.MODE_ECB)
fromjava = b"-27038292d345798947e2852756afcf0a"
# We don't know the real length of the ciphertext, assume it is 16 bytes
ciphertext = tobytestring(int(fromjava, 16), 16*8)
print c1.decrypt(ciphertext)
</code></pre>
<p>输出为:</p>
^{pr2}$
<p>从中可以看出,<code>javax.crypto</code>还添加了PKCS#5填充,您需要自己删除它。不过,这是微不足道的。在</p>
<p>然而,<strong>real</strong>解决问题的方法是用更好的方式进行Java加密。Python代码将大大简化。在</p>