从nosql数据库中提取Python编码问题

2024-06-28 19:16:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我从一个nosql数据库(在本例中是ssdb,就像redis一样是键/值存储)中提取数据,我相信我有一个编码问题。以字符串格式返回数据的方式不正确。我需要让这些数据看起来和我写进数据库的字符串一模一样,这样我才能解密它。你知道吗

在ssdb中设置:

......\x96\xdc\xbd\xf3\xdbF\xa1\x04ll\xe8\xe1\x13$I\x1a\xf7\xd5\x93\xc2\x952t\xc4N\x8d\x893\xde\xce\x90\xe10Z3\xa7\xf2\xe9-\x1bw\xb1p\x1b\xf27s\x02\xd0\x99\xa8\x94\x8d}\xa8\xf4\xbe\xccr\x8fvnC^\xbc_\xf4T\xbe\xfc=\x07\xed\xa3O\xbd?E\xa5s\x9d\xc5\xe7\x070\xa0BJF\xd1"j\xea\xda\xa9\xdd\xb1;\x9d\x19\xb0\x82\tQ\x8ed\x0e;MF\x03\xd5\x87p\xf5B\x048\x96yo7\xcb\xedB/\x108\xf4x\xe0B\xcaD\x93x\x9ey\xd3\x9fp\xe9\x1f/\xdc\x0e\xe7jm\x91I/\xba!E\xcbv\xca\xcdC\xe2 D\xce\xd3e\xb6\x7f\x8czlc\x8a&\x18Z\x10@\xd4\xf68\x133Vt\x84\x9bI\xdd\xf8\xe8-GYu\xd8\x9e\xea\xdaG@\xef\xbeZ\xa3\\9\x9d\x9e<\xd5\x0b\xeb\xb60\\C\xe8\xc3\x97=Z\xd1\xc6\xa1\xfba\xb3%\x89\xdf\xed\xff\xa3v\x7f\xb1\x82Gfk\xd6\xd4B\xaf\xfa~\xf9\xad\x04<\xfd\xf8\x0b\x8e#\xcb\xed\xc47\xc9\x87\xfb/\r\xc5%\x93\x95PD4\xef\xb3\xf8\xb1\x1f\xfa\xef\xba\xc6\x99\xd9\x08\xbc%?.\xd0\xd4\xa8:*\xb0\xb3\r\x8bC'

这在登录ssdb并执行get时正确显示。你知道吗

正在从数据库中提取数据:

code = ......\x96\xdc\xbd\xf3\xdbF\xa1\x04ll\xe8\xe1\x13$I\x1a\xf7\xd5\x93\xc2\x952t\xc4N\x8d\x893\xde\xce\x90\xe10Z3\xa7\xf2\xe9-\x1bw\xb1p\x1b\xf27s\x02\xd0\x99\xa8\x94\x8d}\xa8\xf4\xbe\xccr\x8fvnC^\xbc_\xf4T\xbe\xfc=\x07\xed\xa3O\xbd?E\xa5s\x9d\xc5\xe7\x070\xa0BJF\xd1"j\xea\xda\xa9\xdd\xb1;\x9d\x19\xb0\x82\tQ\x8ed\x0e;MF\x03\xd5\x87p\xf5B\x048\x96yo7\xcb\xedB/\x108\xf4x\xe0B\xcaD\x93x\x9ey\xd3\x9fp\xe9\x1f/\xdc\x0e\xe7jm\x91I/\xba!E\xcbv\xca\xcdC\xe2 D\xce\xd3e\xb6\x7f\x8czlc\x8a&\x18Z\x10@\xd4\xf68\x133Vt\x84\x9bI\xdd\xf8\xe8-GYu\xd8\x9e\xea\xdaG@\xef\xbeZ\xa3\\9\x9d\x9e<\xd5\x0b\xeb\xb60\\C\xe8\xc3\x97=Z\xd1\xc6\xa1\xfba\xb3%\x89\xdf\xed\xff\xa3v\x7f\xb1\x82Gfk\xd6\xd4B\xaf\xfa~\xf9\xad\x04<\xfd\xf8\x0b\x8e#\xcb\xed\xc47\xc9\x87\xfb/\r\xc5%\x93\x95PD4\xef\xb3\xf8\xb1\x1f\xfa\xef\xba\xc6\x99\xd9\x08\xbc%?.\xd0\xd4\xa8:*\xb0\xb3\r\x8bC'

type(code)
class 'SSDB.SSDB_Response'>

得到我可以执行的响应字符串代码.数据但结果却不一样。你知道吗

code.data =    ......\\x96\\xdc\\xbd\\xf3\\xdbF\\xa1\\x04ll\\xe8\\xe1\\x13$I\\x1a\\xf7\\xd5\\x93\\xc2\\x952t\\xc4N\\x8d\\x893\\xde\\xce\\x90\\xe10Z3\\xa7\\xf2\\xe9-\\x1bw\\xb1p\\x1b\\xf27s\\x02\\xd0\\x99\\xa8\\x94\\x8d}\\xa8\\xf4\\xbe\\xccr\\x8fvnC^\\xbc_\\xf4T\\xbe\\xfc=\\x07\\xed\\xa3O\\xbd?E\\xa5s\\x9d\\xc5\\xe7\\x070\\xa0BJF\\xd1"j\\xea\\xda\\xa9\\xdd\\xb1;\\x9d\\x19\\xb0\\x82\\tQ\\x8ed\\x0e;MF\\x03\\xd5\\x87p\\xf5B\\x048\\x96yo7\\xcb\\xedB/\\x108\\xf4x\\xe0B\\xcaD\\x93x\\x9ey\\xd3\\x9fp\\xe9\\x1f/\\xdc\\x0e\\xe7jm\\x91I/\\xba!E\\xcbv\\xca\\xcdC\\xe2 D\\xce\\xd3e\\xb6\\x7f\\x8czlc\\x8a&\\x18Z\\x10@\\xd4\\xf68\\x133Vt\\x84\\x9bI\\xdd\\xf8\\xe8-GYu\\xd8\\x9e\\xea\\xdaG@\\xef\\xbeZ\\xa3\\\\9\\x9d\\x9e<\\xd5\\x0b\\xeb\\xb60\\\\C\\xe8\\xc3\\x97=Z\\xd1\\xc6\\xa1\\xfba\\xb3%\\x89\\xdf\\xed\\xff\\xa3v\\x7f\\xb1\\x82Gfk\\xd6\\xd4B\\xaf\\xfa~\\xf9\\xad\\x04<\\xfd\\xf8\\x0b\\x8e#\\xcb\\xed\\xc47\\xc9\\x87\\xfb/\\r\\xc5%\\x93\\x95PD4\\xef\\xb3\\xf8\\xb1\\x1f\\xfa\\xef\\xba\\xc6\\x99\\xd9\\x08\\xbc%?.\\xd0\\xd4\\xa8:*\\xb0\\xb3\\r\\x8bC\''

type(code.data)
<class 'str'>

这需要匹配,因为它是加密的,我需要用以下代码解密它:

def decrypt(key, s):
    obj = AES.new(key)
    ss = obj.decrypt(s)
    return ss.split(b'`%EofD%`')[0]

但是当我试着用代码.数据,我得到以下异常。你知道吗

注意:r\u server是拉取ssdb数据的服务器。 右_服务器.get(键)。数据与代码.数据上面。你知道吗

supportmyapp.decrypt(cgc.encryptionkey, r_server.get(key).data).decode()

2016-02-19 09:05:05-0600 [-] Traceback (most recent call last):
2016-02-19 09:05:05-0600 [-]   File "/Applications/PyCharm CE.app/Contents/helpers/pydev/pydevd_exec2.py", line 3, in Exec
2016-02-19 09:05:05-0600 [-]     exec(exp, global_vars, local_vars)
2016-02-19 09:05:05-0600 [-]   File "<input>", line 1, in <module>
2016-02-19 09:05:05-0600 [-]   File "/Users/myuser/PycharmProjects/myapp/supportmyapp.py", line 51, in decrypt
2016-02-19 09:05:05-0600 [-]     ss = obj.decrypt(s)
2016-02-19 09:05:05-0600 [-]   File "/Users/myuser/.virtualenvs/myapp/lib/python3.5/site-packages/Crypto/Cipher/blockalgo.py", line 295, in decrypt
2016-02-19 09:05:05-0600 [-]     return self._cipher.decrypt(ciphertext)
2016-02-19 09:05:05-0600 [-] ValueError: Input strings must be a multiple of 16 in length

更新:

原来的字符串解码得很好(如果是代码的话),但是代码.数据版本解码不正确。我该怎么做代码.数据'看起来像'代码'中的数据?你知道吗

更新2:

下面的代码在python2中非常有效,但在python3中没有相同的结果。有一个等价的吗?代码.数据.解码('unicode\u escape')


Tags: 数据代码xbddecryptxb1xefx93xe8