将加密邮件从客户端传递到服务器后,我遇到了解码问题。我正在使用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 解码它然后解码消息。再次感谢你!
答案 0 :(得分:1)
您的加密邮件是二进制blob数据,您似乎将其视为javascript中的字符串,但javascript字符串不是针对二进制数据生成的,而当传输格式为json时,它会变得更加复杂。
标准方法是在发送之前对加密消息进行base64编码,并在收到消息时对其进行解码。
答案 1 :(得分:0)
在Django项目上使用加密时,我遇到了相同的错误。为了解决错误检查波纹管点
答案 2 :(得分:0)
用户 mata(1st answer) 也适用于我。我为此宠坏了一整天。 在蟒蛇中 导入 base64
在接收端
导入 base64
rec_data = base64.b64decode(received_data)