在python中混淆值
Posted
技术标签:
【中文标题】在python中混淆值【英文标题】:obfuscate values in python 【发布时间】:2013-06-02 00:06:28 【问题描述】:假设我有以下字符串
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完成。
有什么想法吗?
【问题讨论】:
不使用base64编码,只需在每个字符的序数值中添加一个常量即可。 @WaleedKhan 你的意思是像 rot13 编码吗? Base64 仅大 33%,有那么大吗? 你需要你的字符串有多模糊?创建d
后,您可以使用正则表达式(.)(.)
并将其替换为\2\1
。要反转,请使用完全相同的正则表达式/替换。 d
的大小根本不会改变。
@DanielHaley 那是什么(.)(.)
??看起来……你知道……( . Y . ) ԅ(ˆ⌣ˆԅ)
【参考方案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
根据定义,字符串不会变长或变短。我已经调整了代码来处理你的例子。
【讨论】:
我尝试过使用 rot13 但我放弃了它,因为它只适用于字母,如果你看到我放的例子,我不仅需要混淆数字,还需要混淆其他字符,例如 #$%^ ... @JuanAntonioGomezMoriano:我添加了对您的示例的支持。没有经过广泛的测试,但它确实可以使用像所有 ascii 字母一样的已定义且稳定的字符集。您可能需要限制结尾字母,因为翻译后的字母可能会包含其他含义,例如 DEL【参考方案2】:如果您的字符串比您的示例稍长,那么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
解压。
【讨论】:
以上是关于在python中混淆值的主要内容,如果未能解决你的问题,请参考以下文章