• 大小: 7KB
    文件类型: .py
    金币: 1
    下载: 0 次
    发布日期: 2021-05-13
  • 语言: Python
  • 标签: pytho  sm4  

资源简介

实现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)):
            

评论

共有 条评论