解密从GET python接收的数据时的问题

时间:2017-11-27 06:19:33

标签: python python-2.7 encryption odoo-9 payment-processing

我正在为Odoo开发一个新的payment_acquirer模块,从上周开始,当我尝试解密通过服务器收到的数据时,我总是收到错误。

当我将数据复制到另一个python文件中进行测试时,它似乎与相同的数据完美配合,但是当我在控制器中执行此操作时,它会返回错误。

这是我控制器内的代码:

@http.route('/payment/ariarynet/result', type='http', auth="none", methods=['POST', 'GET'], csrf=False)
def ariarynet_result(self, **post):
    """ Handle Ariary.net response and redirect to form_validate"""
    _logger.info('Beginning Ariary.net form_feedback with post data %s', pprint.pformat(post))  # debug
    key = bytes("477c3551da64136491eff1cb6ab27be35093b2512eb78f2c8d"[:24])
    params = dict(post)
    raw = b"%s"%post.get('idpanier')
    decode = raw.encode('utf8')
    idpanier = main.Utils().decrypt(key,decode) #it return an error

执行时,我有以下错误:

raise ValueError("Invalid data length, data must be a multiple of " + str(self.block_size) + " bytes\n.")

ValueError: Invalid data length, data must be a multiple of 8 bytes

我正在使用pyDes模块来加密和解密数据。

这是正在运行的测试:

def test_bytes(self):
    key = bytes("477c3551da64136491eff1cb6ab27be35093b2512eb78f2c8d"[:24])
    expect = "12177"
    raw = "%8E%16%B8n%A6%1F%2Fj" #this is the data that I copied from the url
    text = urllib.unquote(raw)
    byteArray = bytes(text)
    print Utils().decrypt(key, text)
    self.assertEqual(expect,Utils().decrypt(key, text), "%s est diférent de %s" % (expect, Utils().decrypt(key, text)) )

我真的需要你的帮助来弄清楚我做错了什么。

更新
我认为问题与字符编码有关,因为当我试图比较我得到的数据时,我不会得到同样的东西:

param = post.get('idpanier')
text = (param.encode('utf8'))
print "utf8 encode %s, hex encoded text %s" % (text, text.encode('hex'))
print "utf8 encode %s, hex encoded text %s" % ("b4227475d651420b".decode('hex'), "b4227475d651420b") #excpected behavior

这是输出:

utf8 encode �"tu�QB
               , hex encoded text efbfbd227475efbfbd51420b
utf8 encode �"tu�QB
               , hex encoded text b4227475d651420b

1 个答案:

答案 0 :(得分:0)

我发现的解决方案:我没有使用post.get()重新获取参数,而是设法直接通过传入的URL获取实际参数数据,其中参数编码尚未更改。

query = parse_qs("http://url?%s"%request.httprequest.query_string) #append the query string to a dummy url to get a well formed url
param = query.get('idpanier')

之后,一切正常。