2016-09-21 54 views
1

我在將加密消息從客戶端傳遞到服務器後解碼時遇到問題。我正在使用Cryptography。我使用下面的腳本在客戶端消息編碼:Python - 密文長度必須等於密鑰大小 - 傳遞給服務器後不同的字符串長度

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

這個編碼後的LEN()在客戶端功能告訴我正確的encMessage是256長。 類型()函數告訴我,encMessage'str'。該encMessage打印時看起來是這樣的:

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

I\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服務器

我得到錯誤:「密文長度必須等於密鑰大小」。我檢查了這個現在len()功能在上使用的服務器端encMessage給我不是256,但更小。 類型()函數顯示'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功能發送消息數據變量使用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類似於字典的變量發送回角。然後這條消息被髮送到checkMessage函數(也與)到Django REST框架 APIview,然後在服務器端的序列化程序對象。在服務器的串行器的消息是使用解密:

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

dataDecrypted類似於字典的變量類似地發送回角。但是,這從來不會發生,因爲在解密行中,我得到密文長度必須等於密鑰大小錯誤。

我認爲當客戶端或邊界上的加密消息從python函數發送到angular時,client-angular的邊界上的消息編碼(如utf-8,unicode或其他)會發生一些變化的角度服務器,當加密的消息從角度發送到服務器端的python APIview。

我很可能缺乏的「命名」的經歷真的很抱歉。我沒有真正納入適當的術語。

SOLUTION

用戶mata回答我的問題。我必須做的是在將它加回到角度並將其發送到服務器API之前,使用base64編碼加密的消息。然後在服務器端,我不得不從base64解碼它,然後解碼消息。再次感謝你!

+0

調試是編寫代碼的一部分,將調試結果添加到問題中,而不是:「類似」。檢查發送/接收的長度。用像查爾斯代理那樣的東西來檢查通信。瞭解加密的任何東西都是二進制數據,而不是字符串,因此它將包含沒有顯示字符的字節,因此最好顯示爲十六進制。 – zaph

+0

感謝您的評論。這個「類似」部分被添加到問題中,只是爲了使用python打印函數打印編碼消息的整體形式。我不確定它是否重要。我認爲已經提到了最重要的調試結果:客戶端和服務器中加密消息的長度是256,例如243,分別。此外,type()函數的結果分別是'str'和'unicode'。但是,關於二進制數據和十六進制表示的注意事項很有趣 - 我將檢查它。謝謝。 – Moher

+2

這似乎是您的數據傳輸問題,而不是加密本身。這個問題只會被揭示出來,因爲解密過程預計會有所不同,但這是一個有效的預期。如果您自己沒有找到問題,請添加顯示數據傳輸和接收方式的缺失代碼。 –

回答

1

加密郵件是數據的二進制一滴,你好像把它當作JavaScript字符串,但JavaScript的字符串不是二進制數據來進行,而當傳輸格式爲JSON它會變得更加複雜。

的標準方法將是爲base64發送之前編碼所述加密的消息和它的接收時對其進行解碼。

相關問題