資源簡介
實現(xiàn)SM4的加密和解密,加密前按PKCS#7對明文消息進行填充。
輸入和輸出要求:加密時,輸出加密的每一輪的中間結果和最后的密文;解密時,輸出解密的每一輪的中間結果和最后的明文。
代碼片段和文件信息
import?random
s?=?[[‘D6‘‘90‘‘E9‘‘FE‘‘CC‘‘E1‘‘3D‘‘B7‘‘16‘‘B6‘‘14‘‘C2‘‘28‘‘FB‘‘2C‘‘05‘]
?????[‘2B‘‘67‘‘9A‘‘76‘‘2A‘‘BE‘‘04‘‘C3‘‘AA‘‘44‘‘13‘‘26‘‘49‘‘86‘‘06‘‘99‘]
?????[‘9C‘‘42‘‘50‘‘F4‘‘91‘‘EF‘‘98‘‘7A‘‘33‘‘54‘‘0B‘‘43‘‘ED‘‘CF‘‘AC‘‘62‘]
?????[‘E4‘‘B3‘‘1C‘‘A9‘‘C9‘‘08‘‘E8‘‘95‘‘80‘‘DF‘‘94‘‘FA‘‘75‘‘8F‘‘3F‘‘A6‘]
?????[‘47‘‘07‘‘A7‘‘FC‘‘F3‘‘73‘‘17‘‘BA‘‘83‘‘59‘‘3C‘‘19‘‘E6‘‘85‘‘4F‘‘A8‘]
?????[‘68‘‘6B‘‘81‘‘B2‘‘71‘‘64‘‘DA‘‘8B‘‘F8‘‘EB‘‘0F‘‘4B‘‘70‘‘56‘‘9D‘‘35‘]
?????[‘1E‘‘24‘‘0E‘‘5E‘‘63‘‘58‘‘D1‘‘A2‘‘25‘‘22‘‘7C‘‘3B‘‘01‘‘21‘‘78‘‘87‘]
?????[‘D4‘‘00‘‘46‘‘57‘‘9F‘‘D3‘‘27‘‘52‘‘4C‘‘36‘‘02‘‘E7‘‘A0‘‘C4‘‘C8‘‘9E‘]
?????[‘EA‘‘BF‘‘8A‘‘D2‘‘40‘‘C7‘‘38‘‘B5‘‘A3‘‘F7‘‘F2‘‘CE‘‘F9‘‘61‘‘15‘‘A1‘]
?????[‘E0‘‘AE‘‘5D‘‘A4‘‘9B‘‘34‘‘1A‘‘55‘‘AD‘‘93‘‘32‘‘30‘‘F5‘‘8C‘‘B1‘‘E3‘]
?????[‘1D‘‘F6‘‘E2‘‘2E‘‘82‘‘66‘‘CA‘‘60‘‘C0‘‘29‘‘23‘‘AB‘‘0D‘‘53‘‘4E‘‘6F‘]
?????[‘D5‘‘DB‘‘37‘‘45‘‘DE‘‘FD‘‘8E‘‘2F‘‘03‘‘FF‘‘6A‘‘72‘‘6D‘‘6C‘‘5B‘‘51‘]
?????[‘8D‘‘1B‘‘AF‘‘92‘‘BB‘‘DD‘‘BC‘‘7F‘‘11‘‘D9‘‘5C‘‘41‘‘1F‘‘10‘‘5A‘‘D8‘]
?????[‘0A‘‘C1‘‘31‘‘88‘‘A5‘‘CD‘‘7B‘‘BD‘‘2D‘‘74‘‘D0‘‘12‘‘B8‘‘E5‘‘B4‘‘B0‘]
?????[‘89‘‘69‘‘97‘‘4A‘‘0C‘‘96‘‘77‘‘7E‘‘65‘‘B9‘‘F1‘‘09‘‘C5‘‘6E‘‘C6‘‘84‘]
?????[‘18‘‘F0‘‘7D‘‘EC‘‘3A‘‘DC‘‘4D‘‘20‘‘79‘‘EE‘‘5F‘‘3E‘‘D7‘‘CB‘‘39‘‘48‘]]
FK?=?[‘A3B1BAC6‘‘56AA3350‘‘677D9197‘‘B27022DC‘]
CK?=?[‘00070E15‘‘1C232A31‘‘383F464D‘‘545B6269‘‘70777E85‘‘8C939AA1‘‘A8AFB6BD‘‘C4CBD2D9‘‘E0E7EEF5‘‘FC030A11‘‘181F262D‘
???????‘343B4249‘‘50575E65‘‘6C737A81‘‘888F969D‘‘A4ABB2B9‘‘C0C7CED5‘‘DCE3EAF1‘‘F8FF060D‘‘141B2229‘‘30373E45‘‘4C535A61‘
???????‘686F767D‘‘848B9299‘‘A0A7AEB5‘‘BCC3CAD1‘‘D8DFE6ED‘‘F4FB0209‘‘10171E25‘‘2C333A41‘‘484F565D‘‘646B7279‘]
def?char_to_bit(plaintext):?#將明文消息轉換為01bit串
????bits?=?‘‘
????for?letter?in?plaintext:
????????temp?=?bin(ord(letter))[2:]
????????for?i?in?range(8-len(temp)):
????????????temp?=?‘0‘?+?temp
????????bits?+=?temp
????return?bits
def?bit_to_char(result):???#將解密出來的01串轉化為字符
????plaintext?=?‘‘
????for?i?in?range(len(result)//8):
????????plaintext?+=?chr(int(result[i*8:(i+1)*8]2))
????return?plaintext
def?key_group(key):??#密鑰擴展第一步,MKi異或FKi
????MY?=?[]
????K?=?[]
????newFK?=?[]
????for?i?in?range(4):
????????MY.append(key[32*i:(i+1)*32])
????for?each?in?FK:
????????temp?=?bin(int(each16))[2:]
????????for?j?in?range(32-len(temp)):
????????????temp?=?‘0‘+temp
????????newFK.append(temp)
????for?i?in?range(4):
????????K.append(xor(newFK[i]MY[i]))
????return?K
def?key_L(word):??#密鑰擴展第二步L‘
????word1?=?word[13:]+word[:13]
????word2?=?word[23:]+word[:23]
????result?=?xor(xor(wordword1)word2)
????return?result
def?key_extend(K):?#密鑰擴展第二步
????rk?=?[]???
????newCK?=?[]
????for?each?in?CK:
????????temp?=?bin(int(each16))[2:]
????????for?j?in?range(32-len(temp)):
????????????
評論
共有 條評論