2

假设我有以下字符串

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

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

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

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

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

到目前为止,这满足了前三个要求,但没有满足第三个要求,因为 base64 倾向于使字符串变得非常大。

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

  • 使用异或加密
  • 考虑使用 CRC32,因为一些问题 ( Reversing CRC32 ) 表明可能可以恢复它,但是我不确定。

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

有任何想法吗?

4

2 回答 2

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

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

于 2013-06-06T05:57:40.677 回答
0

如果您的字符串比您的示例稍长,那么该zlib模块可能非常适合:

>>> 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.

于 2013-06-06T05:51:33.727 回答