我从nosql数据库中提取数据(在本例中为ssdb,key / value store就像redis一样),我相信我遇到了编码问题。数据以字符串格式返回的方式不正确。我需要让这些数据看起来与我写入数据库的字符串完全一样,这样我才能解密它。
在ssdb db中设置:
......\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的响应字符串,但它返回不同。
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]
但是,当我尝试使用code.data执行此操作时,我得到以下异常。
注意:r_server正在提取ssdb数据。 r_server.get(key).data与上面的code.data等效。
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
更新:
原始字符串解码很好(如果是代码的东西),但code.data版本无法正确解码。如何将'code.data'转换为'code'中的数据?
UPDATE2:
以下在python2中运行良好但在python3中没有相同的结果。有没有等价的? code.data.decode( 'unicode_escape')