Python - 密文长度必须等于密钥大小 - 将其传递给服务器

时间:2016-09-21 23:09:35

标签: python string cryptography

将加密邮件从客户端传递到服务器后,我遇到了解码问题。我正在使用Cryptography。我使用下面的脚本在客户端编码消息:

encMessage = public_key.encrypt(message, padding.OAEP(mgf=padding.MGF1(algorithm=hashes.SHA1()), algorithm=hashes.SHA1(),label=None))

在此编码之后,客户端上的 len()函数正确地告诉我 encMessage 是256长。此外, type()函数告诉我 encMessage ' str' 。打印时的 encMessage 看起来像这样:

  

I \ xf0gr \ XF5 \ XF8 \ xf2F \ XDE \ xc7 \ XE4 \ X91 \ xa1F3 \ XC1 \ X05 \ X06 \ xd7Y:\ xc9 \ XCF \固定的' \ xf49 \ XD5 \ x99Z \固定的\ X93 \ xba8 \ XDD \ X0B \ XE3?

但是,当我使用 rest_framework 将此 encMessage 传递给服务器时,在服务器端使用下面的代码之后:

message = private_key.decrypt(encMessage,padding.OAEP(mgf=padding.MGF1(algorithm=hashes.SHA1()), algorithm=hashes.SHA1(),label=None))

我收到错误:"密文长度必须等于密钥大小"。我检查了这一点,现在 encMessage 上使用的服务器端的 len()函数给出的不是256,而是更小的东西。此外, type()功能还会显示' unicode'

我认为在从客户端到服务器的数据发送过程中, encMessage 转换有问题,但我不知道如何处理它。

提前感谢您的任何建议!

修改

回答有关显示我如何与服务器通信并发送数据的评论 - 这就是我所做的:

data = {'message': $scope.message};
loginApi.getMessageEncrypted(data)
    .success(
        function(dataEncrypted) {
            loginApi.checkMessage(dataEncrypted['encMessage'])
                .success(
                    function(dataDecrypted) {
                        $log.log('Server responded properly');
                    })
                .error(
                    function(errorInfo, status) {
                        $log.info('Server user data answer error.')
                    });
        })
    .error(
        function(errorInfo, status) {
            $log.info('Client encryption error.')
        });

说明:

点击网站上的某个按钮后, getMessageEncrypted 函数会使用 post 数据变量中发送消息 django REST框架 APIview,然后是在客户端用python编写的序列化程序对象。在序列化程序中,消息使用以下方式加密:

encMessage = public_key.encrypt(message, padding.OAEP(mgf=padding.MGF1(algorithm=hashes.SHA1()), algorithm=hashes.SHA1(),label=None))
dataEncrypted = {'encMessage': encMessage};
return dataEncrypted

并使用 dataEncrypted 类似字典的变量发送回角度。然后将此消息与angular的 checkMessage 函数(也使用 post )一起发送到 django REST框架 APIview,然后发送序列化程序对象服务器端。在服务器的序列化程序中,使用以下方法解密消息:

message = private_key.decrypt(encMessage,padding.OAEP(mgf=padding.MGF1(algorithm=hashes.SHA1()), algorithm=hashes.SHA1(),label=None))

并类似地发送回 dataDecrypted 类字典变量中的angular。但是,这绝不会发生,因为在解密行中我得到密文长度必须等于密钥大小错误。

我认为当客户端或者边界上的python函数将加密消息发送到角度时,客户端角度边界上的消息编码(如utf-8,unicode或其他东西)会有一些变化。当加密消息从服务器端从angular发送到python APIview时,angular-server。

我真的很抱歉可能缺少"命名"经验。我并没有真正进入正确的命名法。

用户mata回答了我的问题。我必须做的是使用 base64 对加密消息进行编码,然后将其返回到angular并将其发送到服务器api。然后在服务器端我必须从 base64 解码它然后解码消息。再次感谢你!

3 个答案:

答案 0 :(得分:1)

您的加密邮件是二进制blob数据,您似乎将其视为javascript中的字符串,但javascript字符串不是针对二进制数据生成的,而当传输格式为json时,它会变得更加复杂。

标准方法是在发送之前对加密消息进行base64编码,并在收到消息时对其进行解码。

答案 1 :(得分:0)

在Django项目上使用加密时,我遇到了相同的错误。为了解决错误检查波纹管点

  • 在将数据发送到db并在获取数据时将其解码之前,请确保使用base64进行编码
  • 用于将该字段存储在数据库中而不是基于字符的字段的用户二进制密钥
  • 这似乎很愚蠢,但还要确保使用正确的密钥对进行加密和解密,并读取正确的密钥进行加密和解密。最好通过编写小型程序来检查加密是否正常工作,以防万一加密中的错误很少,也不会打扰您的项目。因为在项目中解决相同的错误比较困难。由于项目的复杂性。

答案 2 :(得分:0)

用户 mata(1st answer) 也适用于我。我为此宠坏了一整天。 在蟒蛇中 导入 base64

data = base64.b64encode(cipher_text) // 通过网络发送

在接收端

导入 base64

rec_data = base64.b64decode(received_data)