【2025 能源网络安全大赛】数据安全赛道

Uncategorized
3.8k words

EnergyGroup-DataSecurity-dataIntegrityVerification

题目介绍

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
给定一个Excel 文件《data.xlsx》,其中包含多个数据列,每一列的数据代表某一类记录。

文件中的数据可能在传输、存储或处理的过程中发生了丢失或篡改。

参赛选手需要对文件中的数据进行完整性校验,识别哪些列中的数据存在完整性问题,并输出校验结果。

A列B列的数据在文件生成时有对应的一列校验和(Checksum)数据。参赛选手需要根据原始数据列计算校验和,并与文件中的校验和列进行比较。

如果两者不一致,则认为该行的数据存在完整性问题。

参赛选手需要根据校验列推导使用的校验算法并编写程序对数据进行校验,并输出识别结果。输出格式“A列-不匹配的行数;B列-不匹配的行数”。

请参赛选手编写程序对《data.xlsx》中的A列B列数据进行完整性校验,构造上述格式的答案,并将答案的 MD5 值(MD5 值英文字符全小写,长度 32 个字符;计算答案的 MD5 值时,用 UTF-8 字符编码)提交至平台。

正确答案示例:A列-30;B列-40,提交结果示例:4d1c5c9b4757f2ff5d453b375c18254b

详细见题目附件

wp

这题难点在于题目是统计AB错误的总行数,而不是每列的每一个错误行。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
import pandas as pd
import hashlib


info = pd.read_excel("./data.xlsx")


def check_sum(Ainfo,Asign):
# print(hashlib.sha512(Ainfo.encode("utf-8")).hexdigest())
if hashlib.sha256(Ainfo.encode("utf-8")).hexdigest() == Asign:
return True
if hashlib.sha512(Ainfo.encode("utf-8")).hexdigest() == Asign:
return True
if hashlib.md5(Ainfo.encode("utf-8")).hexdigest() == Asign:
return True
return False

final = []
An = Bn = 0


for idx,row in info.iterrows():
Aflag = None
Bflag = None
A = row["A列"]
B = row["B列"]
Acheck = row["A列校验和"]
Bcheck = row["B列校验和"]
if Aflag:=check_sum(A,Acheck)== False:
An +=1
if Bflag:=check_sum(B,Bcheck)== False:
Bn +=1

print(hashlib.md5(f"A列-{An};B列-{Bn}".encode("utf-8")).hexdigest())
# print(";".join(final))

Socialgroup-DataSecurity-dataEncryption

题目介绍

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
给定一个包含敏感信息的文件《data.xlsx》,文件中有多个数据列,每列代表不同的敏感数据类型,如手机号、身份证号码、银行卡号和邮箱等。参赛选手需要对文件中的每一个数据进行加密处理,并输出加密后的数据。

数据加密应使用对称加密算法 AES (Advanced Encryption Standard),采用CBC模式并应用自定义填充方式(见下文),加密后的结果应以16进制字符串的形式保存。

参赛选手需要使用给定的密钥和初始iv,并使用该密钥对每个数据进行加密。加密后的数据最后按先行后列顺序拼接计算md5。

自定义填充方案:

第一层:数据长度字节:在填充开始部分添加表示原始数据长度的字节数。

第二层:固定字节序列:使用固定字节序列0xBB以增加填充的层次。

第三层:填充长度字节:填充内容的末尾添加表示填充长度的字节。

取舍:若只缺少一位填充,则只填充第一层,若只缺少两位填充,则只填充第一层第三层。

例子:块大小为16,当前值为11,填充内容:0x0b+0xBB*3+0x5

数据AES加密的密钥为:b'0123456789abcdef',初始IV为:b'abcdef0987654321'。

详细见题目附件

wp

唯一考点就是AES加密的应用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad,unpad
import hashlib
import pandas as pd


fileinfo = pd.read_excel("./data.xlsx",dtype=str)


def pendfunc(datainfo):
pad_num = 16 - (len(datainfo) % 16)
pad_data_len = pad_num - 2
if pad_num == 1 or pad_num == 2:
pad_data_len = 0
if pad_num == 16:
pad_num = 0
return pad_num,pad_data_len

def info_parse(datainfo):
datainfo_padnum, datainfo_pad_datalen = pendfunc(datainfo)
final_data = ""
if datainfo_padnum > 2:
final_data = datainfo.encode("utf-8") + len(datainfo).to_bytes(1, 'big') + (datainfo_pad_datalen * b'\xBB') + bytes([datainfo_padnum])
if datainfo_padnum == 2:
final_data = datainfo.encode("utf-8") + len(datainfo).to_bytes(1, 'big') + bytes([datainfo_padnum])
if datainfo_padnum == 1:
final_data = datainfo.encode("utf-8") + len(datainfo).to_bytes(1, 'big')
if datainfo_padnum == 0:
final_data = datainfo.encode("utf-8")
return final_data

final = []

bak_fileinfo = fileinfo.copy()

ciper = AES.new(b'0123456789abcdef',AES.MODE_CBC,b'abcdef0987654321')

new_xlx = pd.DataFrame(columns=["手机号","身份证号","银行卡号","邮箱"])



new_xlx["手机号"] = bak_fileinfo["手机号"].apply(lambda x: ciper.encrypt(info_parse(x)).hex() )
new_xlx["身份证号"] = bak_fileinfo["身份证号"].apply(lambda x: ciper.encrypt(info_parse(x)).hex() )
new_xlx["银行卡号"] = bak_fileinfo["银行卡号"].apply(lambda x: ciper.encrypt(info_parse(x)).hex() )
new_xlx["邮箱"] = bak_fileinfo["邮箱"].apply(lambda x: ciper.encrypt(info_parse(x)).hex() )

# dec = AES.new(b'0123456789abcdef',AES.MODE_CBC,b'abcdef0987654321')

new_xlx.to_csv("./data.csv")