1 实验环境

  1. 操作系统版本:Windows 11 家庭中文版23H2
  2. Microsoft Edge版本:122.0.2365.92(正式版本)(64位)

2 实验内容

2.1 运行RSA加密程序,并进行改进

RSA加密是一种非对称加密算法,它使用了一对密钥:公钥和私钥。RSA加密的安全性基于一个数学难题,即大素数分解。这个算法是由Ron Rivest、Adi Shamir和Leonard Adleman在1977年提出的,他们姓氏的首字母组成了这个算法的名字。

RSA加密的安全性基于大数分解问题的难度,即在已知n的情况下,将其分解为p和q的乘积。目前,除非使用非常大的素数并且密钥长度足够长,否则RSA加密是相对安全的。RSA算法在信息安全领域广泛应用于数据加密、数字签名和密钥协商等方面。

代码2.1是Python语言的RSA加密程序。

代码清单2.1 RSA加密程序Python实现

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
import rsa  
import base64  
  
# RSA加密  
def rsaEncryption(public_key, cleartext):  
    result = rsa.encrypt(cleartext.encode(), public_key)  
  
    return base64.encodebytes(result)  
  
  
# RSA解密  
def rsaDecryption(private_key, ciphertext):  
    result = rsa.decrypt(base64.decodebytes(ciphertext), private_key)  
    return result.decode()  
  
  
if __name__ == '__main__':  
    # 生成公钥与私钥  
    public_key, private_key = rsa.newkeys(512)  
  
    # 输出公钥、私钥  
    print(public_key.save_pkcs1())  
    print(private_key.save_pkcs1())  
  
    cleartext = input("请输入明文:")  
  
    # 使用公钥对明文进行加密  
    ciphertext = rsaEncryption(public_key, cleartext)  
    print("密文:", ciphertext)  
  
    # 使用私钥对密文进行解密  
    decipher = rsaDecryption(private_key, ciphertext)  
    print("明文:", decipher)

首先,它导入了rsa和base64两个模块。然后,定义了两个函数rsaEncryption和rsaDecryption,分别用于RSA加密和解密操作。在main函数部分,程序生成了一对512位的RSA公钥和私钥,并将它们输出为PKCS#1格式。

接下来要求用户输入明文,并使用公钥对明文进行加密操作,加密了5次并打印出每次的密文。最后,程序使用私钥对最后一次加密的密文进行解密,并输出解密得到的明文。运行结果如图2.1所示。

当对上述RSA加密算法继续改进时,其中一个改进的思路是增加密钥的长度,即由512位变成1024位。使用1024比512更长的密钥长度可以提供更高的安全性。密钥长度越长,RSA算法的安全性就越高,因为更长的密钥长度增加了破解密钥的难度。`

2.2 SM2国密算法

SM2是一种由中国国家密码管理局发布的椭圆曲线密码算法,属于非对称加密算法。它基于椭圆曲线离散对数难题(ECDLP),提供了数字签名、密钥交换、公钥加密等功能。与RSA相比,SM2具有更高的安全性和更好的性能。

SM2算法的基本流程包括密钥生成、加密、解密、签名和验证等步骤,通常使用特定的参数集和椭圆曲线方程。由于SM2算法是非对称加密算法,因此在使用过程中需要配对的公钥和私钥,公钥用于加密和验证,私钥用于解密和签名。

代码2.2是Python语言的SM2加密程序。

代码清单2.2 SM2加密程序Python实现

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
from gmssl import sm2, func  

  
if __name__ == '__main__':  
    print('--------------SM2加密--------------')  
    # 16进制的公钥和私钥  
private_key = '00B9AB0B828FF68872F21A837FC3036684
28DEA11DCD1B24429D0C99E24EED83D5'  
public_key = 'B9C9A6E04E9C91F7BA880429273747
D7EF5DDEB0BB2FF6317EB00BEF331A83081A6994B8993F3F5D
6EADDDB81872266C87C018FB4162F5AF347B483E24620207'  
    sm2_crypt = sm2.CryptSM2(public_key=public_key, private_key=private_key)  
  
    # 数据和加密后数据为bytes类型  
    data = b"xxxxx xxxxx"  
    enc_data = sm2_crypt.encrypt(data)  
    print('加密后的数据:', enc_data)  
    dec_data = sm2_crypt.decrypt(enc_data)  
    print('解密后的数据:', dec_data)  
  
    # 数字签名和验证  
    data = b"111"  # bytes类型  
    random_hex_str = func.random_hex(sm2_crypt.para_len)  
    sign = sm2_crypt.sign(data, random_hex_str)  # 16进制  
    assert sm2_crypt.verify(sign, data)  # 16进制  

SM2加密算法程序运行结果如图2.2所示。

图2.2 SM2加密算法执行结果

2.3 PostBook中越权删除帖子

在PostBook中新建两个用户,注册两个用户,分别为userone和usertwo,之后在userone账户下创建两个帖子。如图2.3所示。

图2.3 用户一创建两个帖子

之后登录usertwo进行查看,如图2.4所示,可以看到在用户二中虽然能看到相关帖子,但是已经没有了“编辑”和“删除”权限。

图2.4 用户二查看两个帖子

如图2.5,点开其中的一个帖子,并查看此时的url,可以看到在最后有一个“id=4”,我们知道id一般是用来标志一个唯一的资源,所以可以猜测,帖子“userone’s post1”的id是4。

图2.5 查看帖子1的url

之后,在用户二下创建一个帖子“usertow’s post”,如图2.6所示。

图2.6 用户二创建帖子

如图2.7所示,可以看到刚刚创建的帖子的id字段值为7,之后将“删除”按钮的链接复制出来,即https://xxx.ctf.hacker101.com/index.php?page=delete.php&id= 8f14e45fceea167a5a36dedd4bea2543,可以看到在这里id并不是明文7,而是一串毫无规律的数字,所以推测应当是密文,这样我们就得到了一对明密文对。

图2.7 帖子“usertow’s post”的id

之后对上述明密文对所采用的加密方式进行猜测,在图2.8的MD5加密网站中输入明文“7”,对其进行加密得到的32位密文为“8f14e45fceea167a5a36dedd4bea2543”,可以发现就是当我们执行删除操作时对应的id的值,所以使用的加密方式是MD5。

图2.8 MD5在线加密网站

在图2.4中,我们已经得到了用户一的一个帖子对应的明文id为4,使用MD5加密方式对4进行加密,得到密文“a87ff679a2f3e71d9181a67b7542122c”,现在把上面的删除链接中的id的值换成这个明文,并在浏览器中访问这个链接,结果如图2.9所示。

图2.9 进行越权删除帖子

系统返回了一个提示信息,标志删除成功,并且可以看到此时用户一的帖子1已经没有了,所以说越权删除成功。

2.4 替换MD5算法

MD5(Message Digest Algorithm 5)是一种哈希函数,用于产生128位(16字节)的散列值,通常用于对消息进行摘要或验证。然而,由于其设计上的一些弱点,MD5已经不再被推荐用于安全目的,正如内容2.3所示,MD5容易受到碰撞攻击和预图攻击的影响,从而导致安全性受到威胁。

因此想要提高系统的安全性,需要使用更安全的加密算法,例如使用SHA-256(Secure Hash Algorithm 256),SHA-256是SHA-2家族中的一种,产生256位(32字节)的哈希值。与MD5相比,SHA-256更安全,具有更高的抗碰撞性和预图攻击抵抗力。


3 实验总结

在实验1中,我运行了RSA加密程序,并对其进行了改进以提升其安全性。RSA算法的优点是其安全性较高,基于大数因子分解的数学难题,使得其在当前情况下仍被广泛应用于加密通信中。但同时,RSA算法的缺点是其加解密速度较慢,在处理大量数据时性能表现不佳。

其次,在实验2中,我了解了国密算法(SM2)并将其应用于替换RSA加密。相比于RSA算法,SM2算法在性能上有一定的优势,尤其是在移动设备等资源受限的环境下表现更好。此外,SM2算法也具有较高的安全性,可以满足中国政府相关安全标准的要求。

在实验3中,我意识到了加密算法选择的重要性。由于使用了不安全的加密算法,可以对系统中的帖子进行越权删除,这暴露了系统安全性的严重问题。因此,在实践中,我们需要认真选择合适的加密算法,并严格控制系统的安全性,以防止类似漏洞的发生。

通过这些实验,我不仅学到了加密算法的原理和应用,还提高了对系统安全性的认识,为今后的安全工作打下了坚实的基础。