基于.net框架下的长数据流的对称加密解密通信

1.引言

1.1实验目的:

本实验的研究目的是基于.net框架下使用CBC加密算法使用C#实现对于TCP的保密通信服务,通过对于《网络安全与密码编码学》第6章和第5章提到的算法进行实现,将对TCP或UDP的通信进行加密处理,以提供保密性。

1.2问题陈述

在实现对TCP通信的保密服务时,目标解决以下的问题

  1. 选择加密算法, 从CBC、CFB和OFB中选择一种合适的算法,用于对通信数据进行加密。这个选择应该基于算法的安全性和适用性。
  2. 实现加密算法:将选定的加密算法以代码形式实现,以便能够对TCP或UDP通信数据进行加密处理。
  3. 保密服务封装:封装TCP或UDP的网络/0函数(如socket对象的read/write或recvfrom/sendto),以提供具有保密处理的新函数(如sec read/sec write或sec recvfrom/sec sendto)。这些新函数应该在数据传输之前对数据进行加密,在数据接收后对数据进行解密。
  4. 效率和延迟:研究需要考虑加密和解密过程对数据传输的影响。确保实现的加密服务在保证通信安全的同时,保持合理的性能,避免对通信速度和延迟产生过大的负面影响。
  5. 安全性评估:对实现的保密服务进行安全性评估,包括对可能的攻击进行分析和测试。确保所提供的保密服务能够有效防护敏感数据免受未经授权的访问和窃取。

2.研究方法

2.1选择加密算法和工具

在实验的过程中选择了CBC链式加密模式,AES块密码算法,CBC模式可以与各种块密码算法结合使用,如AES(Advanced Encryption Standard)、DES(Data Encryption Standard)等。这些块密码算法已经经过广泛研究和分析,被广泛应用于安全通信和数据保护领域。
CBC加密算法是为了提供对TCP或UDP通信的保密服务,以确保数据的保密性和完整性。通过CBC模式的特性和与块密码算法的适配,我们可以实现对数据流的加密,使其在传输过程中对未经授权的访问者具有高度的安全性。

2.2实现加密服务的算法细节

.net框架下提供了对于高级加密(AES)的抽象类
在对于System.Security.Cryptography的命名空间下提供了对于加密服务(包括数据安全编码和解码)以及其他许多操作(如哈希、随机数生成和消息验证)
6. AES算法细节:

系统安全理论上机报告AESjpg

  1. 加密函数
  • 创建AesManaged对象:使用了AesManaged类创建一个AES算法的实例。
  • 设置 设置密钥和初始向量:设置aes.Key和aes.IV为提供的密钥(key)和初始向量(iv)
  • 创建加密器(encryptor):使用CreateEncryptor方法创建一个用于加密的ICryptoTransform对象。
  • 创建内存流(MemoryStream):创建一个内存流(memoryStream)用于存储加密后的数据。
  • 创建加密流(CryptoStream):使用CryptoStream类创建一个加密流(cryptoStream),将其与内存流和加密器关联。
  • 将明文进行加密:将明文(plainText)转换为字节数组(plainBytes),然后通过加密流将加密后的数据写入内存流。
  • 返回加密后的结果:将内存流转换为字节数组并返回。

系统安全理论上机报告AESDecryptionpng

  1. 解密函数
  • 创建AesManaged对象:同样使用AesManaged类创建一个AES算法的实例。
  • 设置密钥和初始向量:设置aes.Key和aes.IV为提供的密钥(key)和初始向量(iv)。
  • 创建解密器(decryptor):使用CreateDecryptor方法创建一个用于解密的ICryptoTransform对象。
  • 创建内存流(MemoryStream):使用密文(cipherText)创建一个内存流(memoryStream)。
  • 创建解密流(CryptoStream):使用CryptoStream类创建一个解密流(cryptoStream),将其与内存流和解密器关联。
  • 创建StreamReader:使用StreamReader类读取解密流中的数据。
  1. 算法改进:

  2. 随机数生成:在加密过程中,随机数的生成是至关重要的。使用安全的随机数生成器来生成初始向量(IV)和其他随机数,以确保加密的随机性。
    private static byte[] GenerateRandomBytes(int length):添加了一个辅助方法,用于生成指定长度的随机字节数组。这个方法使用RNGCryptoServiceProvider类生成高质量的随机字节。

系统安全理论上机报告generatorRandompng

  1. aes.Padding = PaddingMode.PKCS7;:在加密和解密方法中,设置填充方案为PKCS7确保明文数据的长度与加密算法的块大小对齐。填充方案:在加密过程中,考虑采用适当的填充方案,以确保明文数据长度与加密算法块大小对齐。常见的填充方案包括PKCS7和ISO/IEC 7816-4。

  2. 异常处理和错误检查:加密过程中可能出现各种异常情况,如无效的密钥、无效的密文等。应该对这些异常情况进行适当的处理和错误检查,以确保系统的稳定性和安全性。添加了try-catch块:在Main方法中,添加了异常处理的代码,以捕获可能发生的异常并打印错误消息。

系统安全理论上机报告errorCheckpng

生成打包方案:系统安全理论上机报告AESdllpng

  1. CBC算法实现系统安全理论上机报告CBCImplementpng
  • 密钥和初始向量(IV):密钥(EncryptionKey)以UTF-8编码转换为字节数组,并用于设置AES算法的密钥。
    初始向量(iv)是在加密和解密过程中使用的随机向量,用于增加加密算法的随机性和安全性。
  • 加密方法(Encrypt)将明文字符串转换为UTF-8编码的字节数组,并使用AES算法和CBC模式创建加密器(encryptor)。
  • 加密器将数据写入到CryptoStream流中,实现数据的加密操作。
  • 解密方法(Decrypt)将密文字节数组传入,并使用AES算法和CBC模式创建解密器(decryptor)。
  • 解密器将数据从CryptoStream流中读取,并使用StreamReader将解密后的数据转换为明文字符串。
  • CBC模式(Cipher Block Chaining)将每个分组的密文与前一个分组的密文进行异或运算,增加了加密算法的安全性。
  • PKCS7填充(Padding Mode)被用于确保明文数据与加密算法块大小对齐,以满足分组加密的要求。
  1. TCP server and client代码实现
    将上述的CBC代码已经打包成了dll文件进行tcp的代码实现

  2. TCPserver代码实现
    系统安全理论上机报告TCPserverpng

  • 创建 TCP 客户端实例:使用 TcpClient 类创建 TCP 客户端实例。可以通过指定服务器的 IP 地址和端口号来建立与服务器的连接。
  • 连接服务器:使用 TcpClient 实例的 Connect 方法连接到服务器。提供服务器的 IP 地址和端口号作为参数。
  • 发送数据:通过获取与服务器建立的连接后的网络流,使用流的 Write 方法发送数据到服务器。可以将要发送的数据转换为字节数组后发送。
  • 接收数据:使用网络流的 Read 方法从服务器接收数据。可以指定一个缓冲区来存储接收到的数据,并根据需要进行解码。
  • System.Net.Sockets: 这个命名空间提供了与网络通信相关的类和方法。其中的 TcpClient 类用于创建 TCP 客户端实例,NetworkStream 类用于获取网络流进行数据传输。
    ###2.3 对于secwriter的自定义封装实现
    < src=”assets/系统安全理论上机报告-secWriter封装.png” width=”” height=”” >
    封装 StreamReader 和 StreamWriter 类时,创建了自定义的 SecReader 和 SecWriter 类,用于在网络输入输出过程中提供保密处理。这两个类在构造函数中接受 NetworkStream 和 ICryptoTransform 对象作为参数。
  • SecReader 类的构造函数接收一个 NetworkStream 对象和一个用于解密的 ICryptoTransform 对象。
  • 在 SecReader 类内部,我们创建一个 StreamReader 对象,并将其构造函数参数设置为一个 CryptoStream 对象,该 CryptoStream 对象使用传入的 NetworkStream 和解密器 ICryptoTransform 对象。
  • SecReader 类中的 ReadLine 方法简单地调用内部 StreamReader 对象的 ReadLine 方法来读取解密后的数据,并返回读取的字符串。
    对于

3.安全性评估和攻击模型

3.1对于CBC模式的安全性评估

  • 常见的误差传播:如果在传输或存储过程中发生了一个比特的错误,该错误将会在解密过程中影响整个密文块的解密,进而导致明文块的完全不可预测的改变。这被称为误差传播。由于每个密文块都依赖于前一个密文块,一个误差的传播可能导致整个消息的损坏。

  • 不适合并行处理:由于每个密文块的加密都依赖于前一个密文块的解密结果,因此无法对多个密文块进行并行加密。这限制了 CBC 模式在并行处理环境下的效率。

  • 不支持随机访问:由于每个密文块的解密都依赖于前一个密文块的解密结果,因此无法直接访问和解密消息中的任意块。必须按顺序解密整个消息。

  • 对初始向量(IV)的要求:CBC 模式要求使用随机和唯一的初始向量(IV)作为第一个密文块的输入。如果 IV 的生成不够随机或者在不同消息间重复使用,可能会导致安全性问题。

    3.2可能的攻击方式

  1. 重放攻击(Replay Attack):攻击者截获并记录了加密的消息块,然后在稍后的时间重新发送这些消息块,以试图欺骗接收方。由于CBC模式下每个密文块都依赖于前一个密文块,因此重放攻击可能会导致解密的结果与原始消息不同。
  2. 选择明文攻击(Known Plaintext Attack):攻击者可以通过观察和记录明文和对应的密文块对,来尝试分析加密算法和密钥。在CBC模式下,攻击者可能通过修改明文块并观察密文块的变化,以获取有关密钥或明文的信息。
  3. 填充攻击(Padding Oracle Attack):填充攻击是一种侧信道攻击,利用对密文的填充错误的响应来推断明文的信息。攻击者可能通过发送特定的恶意数据并观察服务器的响应来获取关于密钥或明文的信息。
  4. 位翻转攻击(Bit Flipping Attack):攻击者可能通过修改密文块中的某些位来影响解密过程,并试图更改解密后的明文内容。由于CBC模式下密文块的解密依赖于前一个密文块,对密文块中的位进行修改可能会导致解密结果的不可预测性。

3.3预期的解决方式

这些攻击方式都是针对CBC模式的特定漏洞和弱点而设计的。为了防范这些攻击,可以采取一系列的安全措施,包括使用消息认证码(MAC)来确保数据完整性和身份验证、使用随机和唯一的初始向量(IV)、定期更换密钥、对密文进行完整性检查等。此外,密钥管理和安全协议的正确实施也是确保安全性的重要因素。

4.遇到的问题

解决方法:

  • Change the algorithm class. Replace the class to one. RijndaelManagedAESManaged
  • Do not explicit set the of algorithm class, left them default.
    (This is the very important step. I think there is a bug in KeySize property.)KeySize系统安全理论上机报告-trouble1.png 端口号占用的问题
  • netstat -aon|findstr “1234”
  • tasklist|findstr “1234”

5.心得体会

当学习CBC(Cipher Block Chaining)在TCP中的传输时,我获得了以下心得体会:

首先,CBC模式是一种常用的块密码模式,通过使用前一个密文块作为当前明文块的输入,实现了消息的链接和依赖性。这种链接性使得CBC在TCP传输中能够提供一定的保密性和完整性。

其次,CBC模式的关键在于初始向量(IV)的选择和使用。IV是用于引入随机性和唯一性的重要参数,它在每个数据块的加密过程中都是不同的。因此,在TCP传输中,需要确保IV的安全性和唯一性,以防止攻击者利用重放攻击等方式来破解加密。

另外,填充(Padding)的处理也是CBC模式中需要注意的一点。填充是为了确保明文块的长度满足加密算法的要求,通常使用标准的填充方案(如PKCS7)。在TCP传输中,我们需要确保填充的正确性和完整性,以防止填充攻击等安全漏洞的出现。

在实际应用中,我意识到CBC模式在TCP传输中还需要考虑性能和安全性之间的权衡。加密和解密过程会增加数据传输的延迟,特别是对于大数据流的传输,可能会对性能产生一定的影响。因此,我们需要根据实际需求和场景来评估和权衡安全性和性能之间的取舍。

在学习CBC模式的过程中,我还深刻认识到数据完整性和可靠性的重要性。CBC模式能够提供一定程度的数据完整性保护,但仍然需要结合消息认证码(MAC)等机制来确保数据的完整性和身份验证。

总而言之,学习CBC在TCP传输中的应用是一项挑战和有趣的任务。通过理解CBC模式的原理和特点,结合实际应用中的安全需求和性能考虑,我们可以更好地应用CBC模式来实现安全的数据传输,并在保护数据的同时提供高效可靠的通信。