密碼演算法程式設計實踐選的sha-1。
在寫的過程中遇到一丟丟關於python移位的問題,記錄一下。
sha-1其中第一步需要填充訊息。簡單闡述一下sha1填充訊息的過程:
如輸入訊息「123」,先轉成ascii碼——313233,訊息長度為3*8=24。
即00110001 00110010 00110011
然後填充乙個1佔1bit,再填充447-24bit個0。
10000000...00000000
最後64bit加上訊息長度24的二進位制0001 1000
二進位制相當於是:
00110001 00110010 00110011 10000000...00000000 00011000
16進製表示
31323380 00000000...0018
python部分**塊:
m = input()
# 1byte=8bit,l為m字串長度
l = 8 * len(m)
m=0for ch in m:#遍歷字串m
m = m * (2 ** 8) + ord(ch)
# print(hex(m))#此時16進製制的int型別m就是原始資料
#補位,使明文總長度為448(mod512)位
if l < 448:
m = m * 2 + 1 #補位
# 新增填充位
m = m * 2 ** (447 - l)
# 新增長度
m = m * 2 ** 64 + l
不只是python,對於移位運算都有:
左移:運算規則:
按二進位制形式把所有的數字向左移動對應位數,高位移出,低位補零。
在數字沒有溢位的前提下,對於正數和負數,左移一位都相當於乘以2的1次方,左移n位就相當於乘以2的n次方。
乘以2**n 相當於向左移動n位數,高位移出0,右邊低位的空位補零。
n=128
print(bin(n))
n1=n*2**2+1#1000 0000 00+0000 0001 -->1000 0000 01
print(bin(n1))
n2=n<<2+1
print(bin(n2))
m=8#0000 1000
print(bin(m))
m1=m*2**2+1#0000 1000 00 +0001 00001000 01
print(bin(m1))
m2=m<<2+1
print(bin(m2))
輸出結果:0b10000000
0b1000000001
0b10000000000
0b1000
0b100001
0b1000000
process finished with exit code 0
同理,右移可以用》或者除以2**n,相當於取商,不要餘數。不過有符號區別。
但同時注意運算子優先順序的問題,
python中,優先順序從高到低分別是:
**,~+-(按位翻轉如~1,-1),* / % //,+-(普通加減法),<< >>....
雖然乘以2**n和<
遍歷過程:
l=24,m初值=為0
然後m左移8位,此時m不變仍然是00000000
再加上二進位制31,此時m=00110001
m再次左移8位,低位補0,此時m=00110001 00000000
再加上二進位制32,此時m=00110001 00110010
m再次左移8位,此時m=00110001 00110010 00000000
再加上二進位制33,此時m=00110001 00110010 00110011
遍歷結束。
補位過程:
如果l<448,即除了最後64bit訊息長度,使得明文總長度為512bit。
m先左移1位,低位補0
m=00110001 00110010 00110011 0
補位乙個1,m=00110001 00110010 00110011 1
新增填充位:m左移448-1-l長度的值,即447-l=423長度。
m=00110001 00110010 00110011 1000000...00000000(1後有423個0)
新增長度:m左移64bit,即
00110001 00110010 00110011 10000000...00000000
00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000
(1後有423+64個0,此時訊息長度總共為24+423+1+64=512bit)
m加上二進位制l=24,即00011000。
m=00110001 00110010 00110011 10000000...00000000
00000000 00000000 00000000 00000000 00000000
00000000 00000000 000011000
填充訊息結束。
數學真的太神奇了!!(摸了摸涼涼的頭頂
Python 二進位制移位操作學習總結
python 二進位制向左移位操作符 移位前的數值 移位次數 說明 移位數值的二進位制末尾新增0,移位幾次就新增幾個0 例項 print bin 4 結果 0b100 print bin 8 結果 0b1000 將4的二進位制向左移位一次即末尾新增乙個0 print 4 1 結果 8python 二...
二進位制 二進位制起源
現代通訊技術的基礎是二進位制編碼。早在1865年麥克斯韋總結出麥克斯韋方程組之前,美國人摩斯 morse 於1837年發明了摩斯電碼和有線電報。有線電報的出現,具有劃時代的意義 它讓人類獲得了一種全新的資訊傳遞方式,這種方式 看不見 摸不著 聽不到 完全不同於以往的信件 旗語 號角 烽火,這也是二進...
移位操作和二進位制知識
常用的移位操作是 和 分別為左移和右移。我們在c語言中有算數移位和邏輯移位兩種。算數移位 區分符號的移位 邏輯移位 不區分符號的移位 算數移位和邏輯移位有什麼不同,舉例說明,例如 1 對無符號數3來說 x 1往左移一位,最左邊的位移掉了,最右邊的移進來的位補零。變成00000110,所以結果是6 1...