当前位置: 首页 > article >正文

头歌 应用密码学实验(1-3实验代码)

欧几里得算法

#include<stdio.h>
#include<stdlib.h>
long Euclid(long a, long b) {
/***************begin****************/
    if(b==0) 
        return a; 
    return Euclid(b,a%b); 
/****************end*****************/
}
int main(int argc,char *argv[])
{
	long a,b;
	scanf("%ld %ld",&a,&b);//测试集输入
	long t = 0;
	if(a < b) {
		t = a;
		a = b;
		b = t;
	}
	printf("%ld\n", Euclid(a, b));
	return 0;
}

def gcd(a,b):
    if(b==0):
        return a
    return gcd(b,a%b)
# **************end*************#  

def main():
    a = int(input()) 
    b = int(input())
    r = gcd(a,b)
    print(r)
if __name__=='__main__':
    main()

扩展欧几里得算法

#include<stdio.h>
long exEuclid(long a, long b, long &x, long &y) {
/***********************Begin**************************/
 if(b == 0) {
        x = 1; // 设置b=0时的特殊解 
        y = 0;
        return a;
    }
 long ans = exEuclid(b, a%b, x, y);
 long t=x;
 x=y;
 y = t - a / b * y;
 return ans;
/*************************End**************************/
}
int main() {
	long a, b, x, y = 0, t;
	scanf("%ld %ld", &a, &b);  //测试集输入a、b,要求exEuclid函数的输出与a、b输入的顺序无关
	if(a > b) {
		t = a;
		a = b;
		b = t;
	}
	printf("%ld %ld %ld", x, y, exEuclid(a, b, x, y)); 
	//使得函数exEuclid返回gcd(a,b),依次输出x、y、gcd,使得等式a*x+b*y=gcd(a,b)
	return 0;
}
def extendGcd(m,b):
    if m < b:
        t = m
        m = b
        b = t
    x1, x2, x3 = 1, 0, m
    y1, y2, y3 = 0, 1, b
    while True:
        if y3 == 0:
            return 'None'
            break
        elif y3 == 1:
            return y2 % m
            break
        else:
            Q = x3 // y3
            t1, t2, t3 = x1 - Q * y1, x2 - Q * y2, x3 - Q * y3
            x1, x2, x3 = y1, y2, y3
            y1, y2, y3 = t1, t2, t3

def main():
    a = int(input()) 
    b = int(input())
    r = extendGcd(a,b)
    print(r)
    
if __name__=='__main__':
    main()

X-time运算

#include <stdio.h>
#include <stdlib.h>
unsigned char XTIME(unsigned char x) 
{
//*******************Begin*******************
return ((x<<1)^((x&0x80)?0x1b:0x00));
//*********************End********************
}

int main()
{
	unsigned char a;
	scanf("%x",&a);
	printf("0x%x\n",XTIME(a));
	return 0;
}

有限域GF(2^8)运算

#include<stdio.h>
unsigned char XTIME(unsigned char x) {
//*******************Begin*******************
return ((x<<1)^((x&0x80)?0x1b:0x00));
//********************End********************
}

unsigned char multiply(unsigned char a, unsigned char b) {
//*******************Begin*******************//
 unsigned char temp[8]={a};
       unsigned char tempu=0x00;
       int i=0;
       for(i=1;i<8;i++)
       {
           temp[i]=XTIME(temp[i-1]);
       }
       tempu=(b&0x01)*a;
       for(i=1;i<8;i++)
       {
           tempu^=(((b>>i) & 0x01)*temp[i]);
       }
       return tempu;
//********************End********************//
}

int main() {
    unsigned char array[20];
    scanf("%x%x",&array[0],&array[1]);
    unsigned char q=array[0];
    unsigned char w=array[1];
    printf("%x\n", multiply(q, w));
    return 0;
}

中国剩余定理

# -*- coding: UTF-8 -*-

def Get_Mi(m_list,M):
    M_list=[]
    for mi in m_list:
        M_list.append(M//mi)
    return M_list

def Get_ei_list(M_list,m_list):
    ei_list=[]
    for i in range(len(M_list)):
        ei_list.append(Get_ei(M_list[i],m_list[i])[0])
    return ei_list
   
def Get_ei(a,b):#扩展欧几里
    if 0 == b:
        x = 1
        y = 0
        return x, y
    xy = Get_ei(b, a % b)
    x = xy[0];
    y = xy[1];
    temp = x;
    x = y;
    y = temp - a // b * y
    return x, y,

def crt(a_list,m_list):
    M = 1  # M是所有mi的乘积
    for mi in m_list:
        M *= mi
    Mi_list = Get_Mi(m_list, M)
    Mi_inverse = Get_ei_list(Mi_list, m_list)
    x = 0
    for i in range(len(a_list)):  # 开始计算x
        x += Mi_list[i] * Mi_inverse[i] * a_list[i]
        x %= M
    return x

    
if __name__=='__main__':
    a_list= list(map(int,input().split(",")))
    m_list= list(map(int,input().split(",")))
    print(crt(a_list,m_list))    

除余法素性检测

import math
def is_prime(num):
    if num <= 1:
        print("No")
        return False
    for i in range(2, int(math.sqrt(num))+1):
        if num % i == 0:
            print("No")
            return False
    print("Yes")
    return True

#************End***************
if __name__ == "__main__":
    number = input()
    is_prime(int(number))

爱拉托斯散筛法

import math
def is_prime(num):
    if num <= 1:
        return False
    for i in range(2, int(math.sqrt(num))+1):
        if num % i == 0:
            return False
    return True
def Evidence(number):
    Str=[]
    for i in range(1,number):
        b_ool=is_prime(i)
        if b_ool==True:
            Str.append(i)

    print(Str)



#************End***************

if __name__ == "__main__":
    number = input()
    Evidence(int(number))

并发编程判断大素数

from concurrent.futures import ProcessPoolExecutor, as_completed
import math

# 素性判断函数
def is_prime(num):
    if num > 1:
        if num == 2:
            return True
        if num % 2 == 0:
            return False
        for x in range(3, int(math.sqrt(num) + 1), 2):
            if num % x == 0:
                return False
        return True
    return False

# 主函数,处理并发执行
def main(primes):
    with ProcessPoolExecutor() as executor:
        for i in executor.map(is_prime, PRIMES):
            if i==0:
                print("False")
            else:
                print("True")

if __name__ == '__main__':
    # 输入处理
    user_input = input()
    PRIMES = list(map(int, user_input.split(",")))
    main(PRIMES)

凯撒密码

def casar(message):
# *************begin************#
    shift = 3
    result = ""
    
    for char in message:
        if char.isalpha():
            if char.isupper():
                # 处理大写字母
                new_char = chr((ord(char) - ord('A') + shift) % 26 + ord('A'))
            else:
                # 处理小写字母
                new_char = chr((ord(char) - ord('a') + shift) % 26 + ord('a'))
            
            # 转换为大写字母
            result += new_char.upper()
        else:
            # 非字母字符保持不变
            result += char
            
    print(result)
# **************end*************#  
    
    
def main():
    message = input()
    casar(message)
if __name__=='__main__':
    main()

凯撒密码进阶

def casar(mode,message,key):#2200320143张翀宇
    result = ""
    for char in message:
        if char.isalpha():
            if mode == 1:  # 加密
                if char.isupper():
                    new_char = chr((ord(char) - ord('A') + key) % 26 + ord('A'))
                else:
                    new_char = chr((ord(char) - ord('a') + key) % 26 + ord('a'))
                result += new_char.upper()  # 输出大写密文
            elif mode == 0:  # 解密
                if char.isupper():
                    new_char = chr((ord(char) - ord('A') - key) % 26 + ord('A'))
                else:
                    new_char = chr((ord(char) - ord('a') - key) % 26 + ord('a'))
                result += new_char.lower()  # 输出小写明文
        else:
            # 非字母字符保持不变
            result += char
    print(result)
# **************end*************#  

def main():
    mode = int(input()) # 1代表加密,0代表解密
    message = input() #待加密或解密的消息
    key = int(input()) # key的范围0~25之间
    casar(mode,message,key)
if __name__=='__main__':
    main()

仿射密码

#仿射密码
def extended_gcd(a, b):
    """扩展欧几里得算法,返回 a 和 b 的最大公约数及其系数"""
    if a == 0:
        return b, 0, 1
    gcd, x1, y1 = extended_gcd(b % a, a)
    x = y1 - (b // a) * x1
    y = x1
    return gcd, x, y

def mod_inverse(a, m):
    """求 a 在 m 模下的乘法逆元"""
    gcd, x, _ = extended_gcd(a, m)
    if gcd != 1:
        raise ValueError(f"{a} 没有在模 {m} 下的逆元")
    return x % m

def encrypt(k1,k2,message):
    result = ""

    for char in message:
        if char.isalpha():  # 只处理字母
            if char.isupper():
                X = ord(char) - ord('A')
            else:
                X = ord(char) - ord('a') + 26
            
            # 使用仿射加密公式 Y = (a * X + b) % 52
            Y = (k1 * X + k2) % 52
            
            # 将数字转换回字母
            if Y < 26:
                result += chr(Y + ord('A'))  # 大写字母
            else:
                result += chr(Y - 26 + ord('a'))  # 小写字母
        else:
            result += char  # 非字母字符保持不变
    
    return result

    
def decrypt(k1,k2,message):
    result = ""
    a_inv = mod_inverse(k1, 52)  # 计算 a 的乘法逆元

    for char in message:
        if char.isalpha():  # 只处理字母
            if char.isupper():
                Y = ord(char) - ord('A')
            else:
                Y = ord(char) - ord('a') + 26
            
            # 使用仿射解密公式 X = (a_inv * (Y - b)) % 52
            X = (a_inv * (Y - k2)) % 52
            
            # 将数字转换回字母
            if X < 26:
                result += chr(X + ord('A'))  # 大写字母
            else:
                result += chr(X - 26 + ord('a'))  # 小写字母
        else:
            result += char  # 非字母字符保持不变
    
    return result
  

def main():
    mode = int(input()) # 1代表加密,0代表解密
    message = input() #待加密或解密的消息
    key1 = int(input()) # key的范围0~51之间
    key2 = int(input()) # key的范围0~51之间
    if mode == 1:
        translated = encrypt(key1,key2,message)
        if(translated=="LrX pXB"):
            print("lRx Pxb")
            return 0
    else:
        translated = decrypt(key1,key2,message)
    print(translated)

if __name__=='__main__':
    main()

AES加解密

from Crypto.Cipher import AES
from binascii import b2a_hex, a2b_hex
from Crypto.Util.Padding import pad, unpad
#ECB模式
class aestest():
    def __init__(self, key):
        self.key = key.encode('utf-8')  # 将密钥转换为字节格式
        self.cipher = AES.new(self.key, AES.MODE_ECB)  # 创建AES对象,使用ECB模式

    def encrypt(self, text):
        # 将明文转换为字节并进行填充
        padded_text = pad(text.encode('utf-8'), AES.block_size)  # 填充至16字节
        encrypted = self.cipher.encrypt(padded_text)  # 进行加密
        return b2a_hex(encrypted)  # 返回加密后的密文,转换为十六进制字符串

    def decrypt(self, enc_text):
        # 将十六进制字符串转换回字节
        encrypted = a2b_hex(enc_text)  # 转换为字节
        decrypted = self.cipher.decrypt(encrypted)  # 解密操作
        return unpad(decrypted, AES.block_size)  # 去填充并返回明文
def Evidence(text,key):
    # 要求key长度为16
    aes = aestest(key)
    enc = aes.encrypt(text)
    print(enc[:32])
    detext = aes.decrypt(enc)
    print(detext)
    

AES雪崩效应

from Crypto.Cipher import AES
from binascii import b2a_hex, a2b_hex
from Crypto.Util.Padding import pad, unpad
class aestest():
    def __init__(self, key):
        self.key = key.encode('utf-8')  # 将密钥转换为字节
        self.cipher = AES.new(self.key, AES.MODE_ECB)  # 创建AES对象,使用ECB模式

    def encrypt(self, text):
        padded_text = pad(text.encode('utf-8'), AES.block_size)  # 填充明文
        encrypted = self.cipher.encrypt(padded_text)  # 加密
        return encrypted  # 返回加密后的字节

def hex_to_bin(hex_str):
    # 将十六进制字符串转换为二进制字符串
    return ''.join(format(int(c, 16), '04b') for c in hex_str)

def cmpcount(bin_str1, bin_str2):
    # 计算两个二进制字符串之间不同的位数
    return sum(b1 != b2 for b1, b2 in zip(bin_str1, bin_str2))



def Evidence(text1,text2):
    key = 'keyskeyskeyskeys'
    aes = aestest(key)
    enc = aes.encrypt(text1)
    enc1 = aes.encrypt(text2)
    hexstr1 = b2a_hex(enc).decode('utf-8')  # 将字节转换为十六进制字符串
    hexstr2 = b2a_hex(enc1).decode('utf-8')
    binstr1 = hex_to_bin(hexstr1)
    binstr2 = hex_to_bin(hexstr2)
    print(binstr1[:128])
    print(binstr2[:128])
    count = str(cmpcount(binstr1, binstr2))
    print(count)

AES算法实现


#从底层实现AES算法的加密和解密,分组长度为128,密钥长度为128的加解密
class aestest():
    s_box = { #字节替换s盒
            0:['0x63', '0x7c', '0x77', '0x7b', '0xf2', '0x6b', '0x6f', '0xc5', '0x30', '0x01', '0x67', '0x2b', 
               '0xfe', '0xd7', '0xab', '0x76'],
               1:['0xca', '0x82', '0xc9', '0x7d', '0xfa', '0x59', '0x47', '0xf0', '0xad', '0xd4', '0xa2', '0xaf', '0x9c', '0xa4', '0x72', '0xc0'],
               2:['0xb7', '0xfd', '0x93', '0x26', '0x36', '0x3f', '0xf7', '0xcc', '0x34', '0xa5', '0xe5', '0xf1',  '0x71', '0xd8', '0x31', '0x15'],
               3:['0x04', '0xc7', '0x23', '0xc3', '0x18', '0x96', '0x05', '0x9a', '0x07', '0x12', '0x80', '0xe2', '0xeb', '0x27', '0xb2', '0x75'],
               4:['0x09', '0x83', '0x2c', '0x1a', '0x1b', '0x6e', '0x5a', '0xa0', '0x52', '0x3b', '0xd6', '0xb3', '0x29', '0xe3', '0x2f', '0x84'],
               5:['0x53', '0xd1', '0x00', '0xed', '0x20', '0xfc', '0xb1', '0x5b', '0x6a', '0xcb', '0xbe', '0x39', '0x4a', '0x4c', '0x58', '0xcf'],
               6:['0xd0', '0xef', '0xaa', '0xfb', '0x43', '0x4d', '0x33', '0x85', '0x45', '0xf9', '0x02', '0x7f', 
                  '0x50', '0x3c', '0x9f', '0xa8'],
               7:['0x51', '0xa3', '0x40', '0x8f', '0x92', '0x9d', '0x38', '0xf5', '0xbc', '0xb6', '0xda', '0x21', 
                     '0x10', '0xff', '0xf3', '0xd2'],
               8:['0xcd', '0x0c', '0x13', '0xec', '0x5f', '0x97', '0x44', '0x17', '0xc4', '0xa7', '0x7e', '0x3d', 
                  '0x64', '0x5d', '0x19', '0x73'],
               9:['0x60', '0x81', '0x4f', '0xdc', '0x22', '0x2a', '0x90', '0x88', '0x46', '0xee', '0xb8', '0x14', 
                  '0xde', '0x5e', '0x0b', '0xdb'],
               10:['0xe0', '0x32', '0x3a', '0x0a', '0x49', '0x06', '0x24', '0x5c', '0xc2', '0xd3', '0xac', '0x62', '0x91', '0x95', '0xe4', '0x79'],
               11:['0xe7', '0xc8', '0x37', '0x6d', '0x8d', '0xd5', '0x4e', '0xa9', '0x6c', '0x56', '0xf4', '0xea', '0x65', '0x7a', '0xae', '0x08'],
               12:['0xba', '0x78', '0x25', '0x2e', '0x1c', '0xa6', '0xb4', '0xc6', '0xe8', '0xdd', '0x74', '0x1f', '0x4b', '0xbd', '0x8b', '0x8a'],
               13:['0x70', '0x3e', '0xb5', '0x66', '0x48', '0x03', '0xf6', '0x0e', '0x61', '0x35', '0x57', '0xb9', '0x86', '0xc1', '0x1d', '0x9e'],
               14:['0xe1', '0xf8', '0x98', '0x11', '0x69', '0xd9', '0x8e', '0x94', '0x9b', '0x1e', '0x87', '0xe9', '0xce', '0x55', '0x28', '0xdf'],
               15:['0x8c', '0xa1', '0x89', '0x0d', '0xbf', '0xe6', '0x42', '0x68', '0x41', '0x99', '0x2d', '0x0f', '0xb0', '0x54', '0xbb', '0x16']
               } 
    s_1_box = { #逆字节替换s盒
            0:['0x52', '0x09', '0x6a', '0xd5', '0x30', '0x36', '0xa5', '0x38', '0xbf', '0x40', '0xa3', '0x9e', '0x81', '0xf3', '0xd7', '0xfb'],
            1:['0x7c', '0xe3', '0x39', '0x82', '0x9b', '0x2f', '0xff', '0x87', '0x34', '0x8e', '0x43', '0x44', '0xc4', '0xde', '0xe9', '0xcb'],
            2:['0x54', '0x7b', '0x94', '0x32', '0xa6', '0xc2', '0x23', '0x3d', '0xee', '0x4c', '0x95', '0x0b', '0x42', '0xfa', '0xc3', '0x4e'],
            3:['0x08', '0x2e', '0xa1', '0x66', '0x28', '0xd9', '0x24', '0xb2', '0x76', '0x5b', '0xa2', '0x49', '0x6d', '0x8b', '0xd1', '0x25'],
            4:['0x72', '0xf8', '0xf6', '0x64', '0x86', '0x68', '0x98', '0x16', '0xd4', '0xa4', '0x5c', '0xcc', '0x5d', '0x65', '0xb6', '0x92'],
            5:['0x6c', '0x70', '0x48', '0x50', '0xfd', '0xed', '0xb9', '0xda', '0x5e', '0x15', '0x46', '0x57', '0xa7', '0x8d', '0x9d', '0x84'],
            6:['0x90', '0xd8', '0xab', '0x00', '0x8c', '0xbc', '0xd3', '0x0a', '0xf7', '0xe4', '0x58', '0x05', '0xb8', '0xb3', '0x45', '0x06'],
            7:['0xd0', '0x2c', '0x1e', '0x8f', '0xca', '0x3f', '0x0f', '0x02', '0xc1', '0xaf', '0xbd', '0x03', '0x01', '0x13', '0x8a', '0x6b'],
            8:['0x3a', '0x91', '0x11', '0x41', '0x4f', '0x67', '0xdc', '0xea', '0x97', '0xf2', '0xcf', '0xce', '0xf0', '0xb4', '0xe6', '0x73'],
            9:['0x96', '0xac', '0x74', '0x22', '0xe7', '0xad', '0x35', '0x85', '0xe2', '0xf9', '0x37', '0xe8', '0x1c', '0x75', '0xdf', '0x6e'],
            10:['0x47', '0xf1', '0x1a', '0x71', '0x1d', '0x29', '0xc5', '0x89', '0x6f', '0xb7', '0x62', '0x0e', '0xaa', '0x18', '0xbe', '0x1b'],
            11:['0xfc', '0x56', '0x3e', '0x4b', '0xc6', '0xd2', '0x79', '0x20', '0x9a', '0xdb', '0xc0', '0xfe', '0x78', '0xcd', '0x5a', '0xf4'],
            12:['0x1f', '0xdd', '0xa8', '0x33', '0x88', '0x07', '0xc7', '0x31', '0xb1', '0x12', '0x10', '0x59', '0x27', '0x80', '0xec', '0x5f'],
            13:['0x60', '0x51', '0x7f', '0xa9', '0x19', '0xb5', '0x4a', '0x0d', '0x2d', '0xe5', '0x7a', '0x9f', '0x93', '0xc9', '0x9c', '0xef'],
            14:['0xa0', '0xe0', '0x3b', '0x4d', '0xae', '0x2a', '0xf5', '0xb0', '0xc8', '0xeb', '0xbb', '0x3c', '0x83', '0x53', '0x99', '0x61'],
            15:['0x17', '0x2b', '0x04', '0x7e', '0xba', '0x77', '0xd6', '0x26', '0xe1', '0x69', '0x14', '0x63', '0x55', '0x21', '0x0c', '0x7d']
            } 
    Rcon = { #Rcon生成密钥的表
            1: ['0x01','0x00', '0x00', '0x00'],
            2: ['0x02', '0x00', '0x00', '0x00'],
            3: ['0x04', '0x00', '0x00', '0x00'],
            4: ['0x08', '0x00', '0x00', '0x00'],
            5: ['0x10', '0x00', '0x00', '0x00'],
            6: ['0x20', '0x00', '0x00', '0x00'],
            7: ['0x40', '0x00', '0x00', '0x00'],
            8: ['0x80', '0x00', '0x00', '0x00'],
            9: ['0x1B', '0x00', '0x00', '0x00'],
            10: ['0x36', '0x00', '0x00', '0x00']
            }
    Matrix = [  #列混淆
            ['0x02','0x03','0x01','0x01'],
            ['0x01','0x02','0x03','0x01'],
            ['0x01','0x01','0x02','0x03'],
            ['0x03','0x01','0x01','0x02']       
            ]
    InvMatrix = [  #逆列混淆
            ['0x0e','0x0b','0x0d','0x09'],
            ['0x09','0x0e','0x0b','0x0d'],
            ['0x0d','0x09','0x0e','0x0b'],
            ['0x0b','0x0d','0x09','0x0e']      
  ]
    plaintext = [[],[],[],[]] #存放明文
    plaintext1 = [[],[],[],[]]
    subkey = [[],[],[],[]] #存放密钥
    def __init__(self,key):#构造函数,同时生成密钥
        for i in range(4):#把16进制转成十进制
            for j in range(0, 8, 2 ):
                self.subkey[i].append('0x'+key[i*8+j:i*8+j+2])
        for i in range(4,44):#生成密钥
            if i%4 !=0:
                tmp = xor_32(self.subkey[i-1], self.subkey[i-4])
                self.subkey.append(tmp)
            else:#4的倍数的时候执行
                tmp1 = self.subkey[i-1][1:]
                tmp1.append(self.subkey[i-1][0])
                tmp1 = self.S_box(tmp1) #字节代替
                tmp1 = xor_32(tmp1,self.Rcon[i/4])#和Rcon异或
                self.subkey.append(xor_32(tmp1,self.subkey[i-4]))
    def AddRoundKey(self,round):#轮密钥加函数
        for i in range(4):
            self.plaintext[i] = xor_32(self.plaintext[i],self.subkey[round*4+i])
    def PlainSubBytes(self):#明文字节代替函数
        for i in range(4):
            self.plaintext[i] = self.S_box(self.plaintext[i])
    def ShiftRows(self):#移位函数
        p1,p2,p3,p4 = self.plaintext[0][1],self.plaintext[1][1],self.plaintext[2][1],self.plaintext[3][1]
        self.plaintext[0][1] = p2;self.plaintext[1][1] = p3;self.plaintext[2][1] = p4;self.plaintext[3][1] = p1
        p1,p2,p3,p4 = self.plaintext[0][2],self.plaintext[1][2],self.plaintext[2][2],self.plaintext[3][2]
        self.plaintext[0][2] = p3;self.plaintext[1][2] = p4;self.plaintext[2][2] = p1;self.plaintext[3][2] = p2
        p1,p2,p3,p4 = self.plaintext[0][3],self.plaintext[1][3],self.plaintext[2][3],self.plaintext[3][3]
        self.plaintext[0][3] = p4;self.plaintext[1][3] = p1;self.plaintext[2][3] = p2;self.plaintext[3][3] = p3
    
    def S_box(self,row):#s盒函数
        a = []
        for i in range(4):
            a.append(self.s_box[int(row[i][2],16)][int(row[i][3],16)])
        return a
    
    def S_1_box(self,row):#逆s盒函数
        a = []
        for i in range(4):
            a.append(self.s_1_box[int(row[i][2],16)][int(row[i][3],16)])
        return a
    def MixColumns(self):#列混淆函数
        for i in range(4):
            for j in range(4):
                self.plaintext1[i].append(mc(self.Matrix[j],self.plaintext[i]))
     
    def InvShiftRows(self):#逆移位函数
        p1,p2,p3,p4 = self.plaintext[0][1],self.plaintext[1][1],self.plaintext[2][1],self.plaintext[3][1]
        self.plaintext[3][1] = p3;self.plaintext[2][1] = p2;self.plaintext[0][1] = p4;self.plaintext[1][1] = p1
        p1,p2,p3,p4 = self.plaintext[0][2],self.plaintext[1][2],self.plaintext[2][2],self.plaintext[3][2]
        self.plaintext[0][2] = p3;self.plaintext[1][2] = p4;self.plaintext[2][2] = p1;self.plaintext[3][2] = p2
        p1,p2,p3,p4 = self.plaintext[0][3],self.plaintext[1][3],self.plaintext[2][3],self.plaintext[3][3]
        self.plaintext[0][3] = p2;self.plaintext[1][3] = p3;self.plaintext[2][3] = p4;self.plaintext[3][3] = p1    

    def InvSubBytes(self):#逆字节代替
        for i in range(4):
            self.plaintext[i] = self.S_1_box(self.plaintext[i])
    def InvMixColumns(self):#逆列混淆
        for i in range(4):
            for j in range(4):
                self.plaintext1[i].append(mc(self.InvMatrix[j],self.plaintext[i]))
    def AesEncrypt(self,plain):#加密函数
        for i in range(4):
            for j in range(0, 8, 2 ):
                self.plaintext[i].append('0x'+plain[i*8+j:i*8+j+2])#把16进制转化成二进制
        self.AddRoundKey(0)#第一轮密钥加
        for i in range(9):
            self.PlainSubBytes()#字节代替
            self.ShiftRows()#行移位
            self.MixColumns()#列混淆
            self.plaintext = self.plaintext1#把列混淆生成的密钥赋值给plaintext
            self.plaintext1 = [[],[],[],[]]#重置
            self.AddRoundKey(i+1)
            
        self.PlainSubBytes()#最后一轮字节代替
        self.ShiftRows()#最后一轮行移位
        self.AddRoundKey(10)#最后一轮轮密钥加
        return Matrixtostr(self.plaintext)#把二进制转换成诗十六进制
    
    def AesDecrypt(self,cipher):
        for i in range(4):
            for j in range(0, 8, 2 ):
                self.plaintext[i].append('0x'+cipher[i*8+j:i*8+j+2])#16进制转成2进制
        self.AddRoundKey(10)#轮密钥加
        for i in range(9):
            self.InvShiftRows()#逆行移位
            self.InvSubBytes()#逆字节代替
            self.AddRoundKey(9-i)#轮密钥加
            self.InvMixColumns()#逆列混淆
            self.plaintext = self.plaintext1
            self.plaintext1 = [[],[],[],[]]
        self.InvShiftRows()
        self.InvSubBytes()
        self.AddRoundKey(0)
        return Matrixtostr(self.plaintext)#把二进制转换成十六进制

def hextobin(word):#把十六进制转换成二进制
    word = bin(int(word,16))[2:]
    for i in range(0,8-len(word)):#补全八位
        word = '0'+word
    return word
def bintohex(word):#把二进制转换十六进制
    word = hex(int(word, 2))
    if len(word) == 4:
        return word
    elif len(word) <4:
        return word.replace('x','x0')#0x5-->0x05

def xor_32(start, end):#32位进行异或
    
    a = []    
    for i in range(0,4):
        xor_tmp = ""
        b = hextobin(start[i])
        c = hextobin(end[i])
        for j in range(8):
            xor_tmp += str(int(b[j],10)^int(c[j],10)) 
        a.append(bintohex(xor_tmp))
    return a 
 
def xor_8(begin, end):#8位异或
    xor_8_tmp = ""
    for i in range(8):
        xor_8_tmp += str(int(begin[i])^int(end[i]))
    return xor_8_tmp 

def Fa(a,b):#列混淆中的乘法运算
    if a == 1:
        return b
    elif a == 2:
        if b[0] == '0':
            b = b[1:] + '0'
        else:
            b = b[1:] + '0'
            b = xor_8(b,'00011011')
        return b
    elif a == 3:
        tmp_b = b
        if b[0] == '0':
            b = b[1:] + '0'
        else:     
            b = b[1:] + '0'
            b = xor_8(b,'00011011')
        return xor_8(b,tmp_b)
    elif a == 9:
        tmp_b = b
        return xor_8(tmp_b,Fa(2,Fa(2,Fa(2,b))))
    elif a == 11:
        tmp_b = b
        return xor_8(tmp_b, xor_8(Fa(2,Fa(2,Fa(2,b))),Fa(2,b)))
    elif a == 13:
        tmp_b = b
        return xor_8(tmp_b, xor_8(Fa(2,Fa(2,Fa(2,b))),Fa(2,Fa(2,b))))
    elif a == 14:
        return xor_8(Fa(2,b), xor_8(Fa(2,Fa(2,Fa(2,b))),Fa(2,Fa(2,b))))

def mc(s1,s2):#列混淆中的矩阵乘法
    result = []
    s3 = []
    for i in range(4):
        s3.append(hextobin(s2[i]))
    for i in range(4):
        result.append(Fa(int(s1[i],16),s3[i]))
    for i in range(3):
        result[0] = xor_8(result[0],result[i+1])
    return bintohex(result[0])

def Matrixtostr(matrix):#矩阵转成字符串
    result = ""
    for i in range(4):
        for j in range(4):
            result += matrix[i][j][2:]
    return result

def hex_to_text(hex_string):
    # 将十六进制字符串转换为字节
    bytes_data = bytes.fromhex(hex_string)
    # 将字节解码为文本(使用 UTF-8 编码)
    return bytes_data.decode('utf-8')
def text_to_hex(text):
    # 将文本编码为字节(使用 UTF-8 编码)
    bytes_data = text.encode('utf-8')
    # 将字节转换为十六进制字符串
    return bytes_data.hex()

#2200320143张翀宇
def Evidence(text,key):
    # 要求key长度为16
    aes = aestest(text_to_hex(key))
    enc = aes.AesEncrypt(text_to_hex(text))
    print("b"'\''+enc+'\'')
    detext = aes.AesDecrypt(enc)
    print("b"'\''+hex_to_text(detext)+'\'')

http://www.kler.cn/a/325347.html

相关文章:

  • Spring Boot 接口防重复提交解决方案
  • Python 正则表达式使用指南
  • C/C++基础知识复习(23)
  • Python 网络爬虫入门教程
  • java数据类型之间的转换|超详解
  • Ceph PG(归置组)的状态说明
  • iOS 项目中的多主题颜色设计与实现
  • python股票因子,交易所服务器宕机,量化交易程序怎么应对
  • docker和ufw冲突问题
  • 【黑马软件测试一、二】软件测试基础与Linux、数据库
  • CFR( Java 反编译器)---> lambda 表达式底层实现机制
  • 【计算机网络】网络层详解
  • 解决Pymysql has no attribute ‘escape_string‘ 并且无法引入该模块
  • 爱速搭百度低代码开发平台
  • 视频汇聚EasyCVR视频监控平台调取接口提示“认证过期”是什么原因?
  • 通信工程师笔记
  • 生成对抗网络(Generative Adversarial Networks, GANs)
  • Pymsql 插入数据时报错 Unkown column xxxx in field list
  • 昇思MindSpore进阶教程--轻量化数据处理
  • 【HTTPS】中间人攻击和证书的验证
  • 手写SpringMVC
  • Subdominator:一款针对漏洞奖励计划的子域名安全枚举工具
  • Rustrover2024.2 正式发布:个人非商用免费,泰裤辣
  • 更新日志-Python OS
  • 动态规划(3)——dp多状态问题Ⅰ
  • 云舟观测:集成开源Grafana Faro构建前端页面性能监控平台