密碼演算法程式設計實踐選的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字母移位
def menu choice input press 1 to encode,2 to decode,9 to exit return choice def makekeycode message key input what is the key?upper length len message...
python字母移位 演算法 字串移位
問題 乙個字串可以由另乙個字串移位得到,例如abcd,可以由bcad移位得到。問題分析 這個問題表面上說的是字串,但是其實更進一步可以理解為兩個字元陣列的元素是否一致。最簡單和直白的方式,無異於用兩層迴圈的方式來進行迴圈判斷。這是常規方案一。還有方案二,則是需要用到資料結構,例如,將乙個字串轉換成乙...
848 字母移位
有乙個由小寫字母組成的字串s,和乙個整數陣列shifts。我們將字母表中的下乙個字母稱為原字母的 移位 由於字母表是環繞的,z 將會變成 a 例如 shift a b shift t u 以及shift z a 對於每個shifts i x,我們會將s中的前i 1個字母移位x次。返回將所有這些移位都...