Python - 密文长度必须等于密钥大小 - 将其传递到服务器后的不同字符串长度

Moh*_*her 5 python string cryptography

我在将加密消息从客户端传递到服务器后对其进行解码时遇到问题。我正在使用密码学。我使用下面的脚本在客户端对消息进行编码:

encMessage = public_key.encrypt(message, padding.OAEP(mgf=padding.MGF1(algorithm=hashes.SHA1()), algorithm=hashes.SHA1(),label=None))
Run Code Online (Sandbox Code Playgroud)

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

我\xf0gr\xf5\xf8\xf2F\xde\xc7\xe4\x91\xa1F3\xc1\x05\x06\xd7Y:\xc9\xcf\xed'\xf49\xd5\x99Z\xed\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))
Run Code Online (Sandbox Code Playgroud)

我收到错误:“密文长度必须等于密钥大小”。我检查了这一点,现在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.')
        });
Run Code Online (Sandbox Code Playgroud)

解释:

单击网站上的某个按钮后,Angular 的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
Run Code Online (Sandbox Code Playgroud)

并使用dataEncrypted类似字典的变量发送回 Angular 。然后该消息使用 Angular 的checkMessage函数(也使用post)发送到django REST 框架APIview,然后发送到服务器端的序列化器对象。在服务器的序列化器中,消息使用以下方式解密:

message = private_key.decrypt(encMessage,padding.OAEP(mgf=padding.MGF1(algorithm=hashes.SHA1()), algorithm=hashes.SHA1(),label=None))
Run Code Online (Sandbox Code Playgroud)

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

我认为当加密消息从客户端的 python 函数发送到 Angular 或 Angular 服务器的边界时,客户端 Angular 的边界上的消息编码(如 utf-8、unicode 等)会发生一些变化当加密消息从 Angular 发送到服务器端的 Python APIview 时。

我真的很抱歉可能缺乏“命名”经验。我不太喜欢正确的术语。

解决方案

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