2017-03-14 28 views
0

我正在編寫一個基本的TACACS客戶端模塊。我可以通過struct.pack在線上獲取數據包,因爲我已經檢查過wireshark。但我不知道如何處理md5的按字節異或,甚至不知道我是否正確創建散列。 TACACS的RFC說,從TACACS頭和'祕密密鑰'中獲取特定項目,並對其進行五次加密,在每次運行期間連接前一個散列。見下面使用md5逐字節XOR for TACACS

def encrypt(packet, tac_key): 
    key = packet[4:8] + bytes(tac_key, 'utf-8') + packet[:1] + packet[2:3] 
    h1 = md5() 
    h1.update(key) 
    hash = h1.digest() 
    previous = h1.digest() 

    for i in range(2, 6): 
     new = md5() 
     key = key + previous 
     new.update(key) 

     hash += new.digest() 
     previous = new.digest() 

    return hash 

包已經通過struct.pack運行

body = struct.pack(fmt, TAC_AUTHEN_LOGIN, TAC_PLUS_PRIV_LVL_USER, TAC_PLUS_AUTHEN_TYPE_PAP, TAC_PLUS_AUTHEN_SVC_LOGIN, 
        user_len, port_len, rem_addr_len, data_len, bytearray(user, 'utf-8'), 
        bytearray(port, 'utf-8'), bytearray(data, 'utf-8)')) 

這是做到這一點的正確方法或者我應該不上包,只是身體使用struct.pack加密它?

+0

[TACACS + draft rfc](https://tools.ietf.org/html/draft-ietf-opsawg-tacacs-06) –

+0

關於我唯一需要注意的是RFC草稿似乎使用了所有的整型數組, (據我所知,這隻對會話ID很重要),或者是大字節字節順序。 –

+0

好的,澄清。我應該XOR變量身體,這是打包的二進制數據,或者我應該只是XOR身體作爲字符串。如果我將body用作XOR的散列,那麼我已經擁有所有ints,並且不需要使用'ord',就像我迄今爲止所做的那樣。在XOR之後我也會得到亂碼,我認爲這會顯示加密。順便說一句,用戶,端口,rem_addr和數據是不是int的文本。 –

回答

0

我沒有生成一個新的pseudo_pad與服務器的響應頭。因此,答覆仍然混淆。

+0

但現在我得到無效的身份驗證/啓動數據包錯誤,但我的密鑰是正確的。 –