在python中混淆值

时间:2013-06-06 05:33:31

标签: php python encoding hash

假设我有以下字符串

a = "123456"
b = "#$%[{\"
c = "ABCDEFG"

我需要将这三个字符串转换为具有以下属性的“d”字符串

  • “d”字符串是混淆的(不需要加密)
  • “d”字符串可以转换为a,b,c字符串(它是可逆的)
  • “d”字符串应该快速计算
  • “d”字符串应尽可能短

到目前为止,我所做的就像这样

d = a+"|"+b+"|"+c
d = base64.encode(d)

到目前为止,这完成了前三个要求,但不是第三个要求,因为base64倾向于使字符串相当大。

我一直在寻找其他解决方案

  • 使用XOR加密
  • 考虑使用CRC32作为一些问题(Reversing CRC32)声明可能还原它,但是,我不确定。

最后请注意,“混淆”部分由python完成,“恢复”部分由php完成。

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

你可以做一个简单的Caesar Cypher

from string import printable as alphabet 
import string

def caesar(plaintext, shift):
    shifted_alphabet = alphabet[shift:] + alphabet[:shift]
    table = string.maketrans(alphabet, shifted_alphabet)
    return plaintext.translate(table)

shift=3
for s in ("123456","#$%[{\\","ABCDEFG"):
    coded=caesar(s,shift)
    print s
    print coded
    print caesar(coded,-shift)
    print 

打印:

123456
456789
123456

#$%[{\
&'(^~_
#$%[{\

ABCDEFG
DEFGHIJ
ABCDEFG

根据定义,字符串不再或更短。我已经调整了代码来处理你的例子。

答案 1 :(得分:0)

如果你的字符串比你的例子长一点,那么zlib module可能是合适的:

>>> import zlib
>>> zlib.compress("123456789123456789")
'x\x9c3426153\xb7\xb04\x841\x00#\x01\x03\xbb'
>>> zlib.decompress(_)
'123456789123456789'

但是,由于格式的开销,短字符串会变得更长:

>>> zlib.compress("1234")
'x\x9c3426\x01\x00\x01\xf8\x00\xcb'

可以使用PHP gzuncompress进行解压缩。