[問題] MD5實作中位元左移的問題

看板C_and_CPP作者 (David cyuan)時間14年前 (2011/12/25 00:15), 編輯推噓2(208)
留言10則, 2人參與, 最新討論串1/1
我在MD5雜湊函數的實作中,有一點一直很不明白,就是關於位元左移的部份 我看MD5的運算原理中,壓縮函數的每個回合的每個步驟都會左移不同的位元數 在我的理解中,應該只要依照位元數的不同去左移即可(Ex: m[i] << s[i]) 但是我Google了一下高手寫的C++實作函數裏面,在位元左移的函數部份code如下: 參考網址:http://www.zedwood.com/article/121/cpp-md5-function inline MD5::uint4 MD5::rotate_left(uint4 x, int n) { return (x << n) | (x >> (32-n)); } 這樣的寫法是把左移後超出32bit的位元數,再用OR加回去 但讓我不懂的是,這所代表的意思到底是什麼?是取2的32次方的同餘加法的意思嘛? 有沒有高手實作過,或有高手理解這段程式碼的數學意義是什麼嘛?能夠幫我解惑一下嘛? P.S. 在用雜湊函數的時候總覺得很方便,但是自己親自實作的時候才發現真的不好理解 RFC1312的文件(http://www.ietf.org/rfc/rfc1321.txt) 雖然有虛擬碼,但是沒有特別講到這一段,麻煩高手替我解惑,感激不盡 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 203.64.105.145

12/25 00:18, , 1F
因為那需要的不是左移是左旋轉...
12/25 00:18, 1F

12/25 00:19, , 2F
左移就糟糕了 因為一部份資料消失會造成這個 hash 變弱
12/25 00:19, 2F

12/25 00:19, , 3F
所以用的都是左旋轉 你注意這個函式都叫 rotate_left 了
12/25 00:19, 3F

12/25 00:23, , 4F
RFC1321 在 Page 1 的最後也有寫了:
12/25 00:23, 4F

12/25 00:23, , 5F
Let X <<< s denote the 32-bit value obtained by
12/25 00:23, 5F

12/25 00:24, , 6F
circularly shifting (rotating) X left by s bit positions
12/25 00:24, 6F

12/25 00:24, , 7F
所以下面那個表格裡寫的 <<< 是左旋轉不是左移...
12/25 00:24, 7F

12/25 00:25, , 8F
呃我看錯頁數 是 Page 2 XD
12/25 00:25, 8F

12/25 00:37, , 9F
那這樣我就懂了,感謝大大,我一直誤以為是單純左移
12/25 00:37, 9F

12/25 00:37, , 10F
大大對於MD6有研究嘛?
12/25 00:37, 10F
文章代碼(AID): #1EzVgb_g (C_and_CPP)