python字母移位 python移位運算的實現

2021-10-11 07:26:19 字數 2554 閱讀 9897

密碼演算法程式設計實踐選的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次。返回將所有這些移位都...