解密用Python加密的Python中的字符串

时间:2012-11-04 22:49:23

标签: java python encryption aes

我正在使用Python中的服务器应用程序和一个用Java连接到它的应用程序。我需要在Java中加密字符串,然后用Python解密它。

一切都适用于Java代码,但Python代码存在问题。

from Crypto.Cipher import AES
obj        = AES.new('0123456789abcdef', AES.MODE_CBC,IV="fedcba9876543210")
BLOCK_SIZE = 16
PADDING    = " "
pad        = lambda s: s + (BLOCK_SIZE - len(s) % BLOCK_SIZE) * PADDING
plain      = "password"
plain      = pad (plain)
ciph       = obj.encrypt(plain)
obj        = AES.new('0123456789abcdef', AES.MODE_CBC,IV="fedcba9876543210")
decrypted  = obj.decrypt(ciph)
result     = ""
for char in ciph:
    result += str((hex(ord(char))))[2:]
print result
print decrypted

结果如下:

2af41fc02b33765b56433f59edb67dd3
password

这是我期望的并且与Java输出相匹配,但是当我插入2行中的第一行以在Python代码中解密它时,输出完全关闭并显示随机字符。我认为这是由于最后的for循环使得它与Java输出相同。有没有办法撤消循环?另外使用至少与此类似的代码是否有一种可靠的方法来解密两个输出字符串中的第一个(在Python中)?

我感谢所有回复,谢谢你提前!

1 个答案:

答案 0 :(得分:1)

result中的每一对数字都是十六进制字符的字符代码。这是一个片段,可以重现转换并撤消转换(有更优雅的方法可以做到这一点,但它很简单且有效)。

import re

ciph = "hello there"
result = ""
for c in ciph:
    result += str((hex(ord(c))))[2:]

# reverse it
orig = ""
for code in re.findall('..', result):
    orig += chr(int(code, 16))
print orig  # "hello there"