在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中混淆值的主要内容,如果未能解决你的问题,请参考以下文章

Python .loc 混淆

numpy reshape 混淆与负形状值

在 Python 中混淆字符串

如何在 Python 中编写混淆矩阵?

python 的混淆后的代码可以还原么

应用分层10折交叉验证时如何在python中获取所有混淆矩阵的聚合