一种保护通过网络发送的数据的方法

A way to protect data being sent over a network?

本文关键字:网络 数据 方法 一种 保护      更新时间:2023-10-16

我刚刚完成了一个应用程序,一个简单的信使客户端和我希望加密所有的数据,无论是3个还是200个字母的短语

对于这种类型的应用程序,最好的算法是什么?此时此刻,我正试图使用3DES与crypto++(在VC10上),但填充和其他事情似乎有点困难。

我不熟悉密码学,所以欢迎任何有用的建议。

使用TLS,例如OpenSSL,这是一种久经考验的技术,用于保护传输中的数据(尽管您需要一个可信的根节点,并且存在问题,因此您可能想要自签名)。

之后,您应该询问是否需要在本地存储这些消息,如果需要,那么是否对它们进行加密。安全性要求是不同的——有密码保护的对称密码可能更合适。

如果您关心安全的聊天服务,那么您可能会关心安全的匿名聊天服务,在这种情况下,您可能需要查看密钥交换协议。

一个重要的因素是网络连接的可靠性。如果您不希望有很多丢失的数据包,或者数据包很晚才到达,那么您可以使用流密码,或者链模式下的对称块密码。如果您期望更多的网络不可靠性,那么ECB模式下的对称分组密码将更合适,因为丢失的数据只是丢失的数据,并且不会使整个事情失去同步。你可能想用一些随机数据填充每个明文块;例如,如果每个块是64位,则最多使用32位的数据,其余的是随机的。这样,如果多次发送相同的数据就不会很明显了。

一般来说,PKC不用于加密消息。它用于加密随机会话密钥,然后与快速对称算法(如3DES, AES或Blowfish)一起使用。

首先,使用3DES几乎唯一的原因是与已经使用3DES的其他东西兼容,并且不支持任何更新的东西。3DES主要是一种快速的hack,允许预先存在的DES实现(特别是在硬件中)继续使用,直到它们可以被替换——但它通常是一个非常糟糕的选择。DES实际上是被设计成在硬件上实现的——在软件中,它需要大量的CPU时间来实现安全性。

第二,你没有真正告诉我们足够的情况来给出一个真正的答案。你说的是一个基本上封闭的系统,在那里你可以预先共享密钥给用户,或者通过一些带外的方式获得密钥给他们(例如,打电话给他们,同意一个密钥,然后他们可以使用它,而不需要进一步的呼叫?)或者你需要能够接受任意用户,而不需要任何手动设置(更复杂)?用户是否需要某种方式来验证服务器的身份,或者您希望他们只是相信响应正确URL 的任何将是正确的服务器(再次强调,添加这种验证会增加许多的复杂性)?

为了方便讨论,让我们假设您需要加密但不需要身份验证(即,不需要验证到正确服务器的连接)。在这种情况下,我将首先选择AES——众所周知,易于获得,经过深入研究,并且就公众所知,非常安全。

从这里,您需要选择一个键。一种典型的方法是使用某种公开密钥协议(例如RSA)来交换密钥。一种可能的方法是客户机将其公钥发送给服务器。服务器生成一个会话密钥(只是一个大小合适的随机数,可以用作加密密钥),用客户端的公钥对其加密,然后将结果发送回客户端。在该会话的剩余时间内,两者之间交换的所有数据都使用该会话密钥使用对称协议(例如AES)进行加密。

至于如何生成随机数:使用rand()或该顺序的任何东西。通常的方法是在所谓的计数器模式中使用相同的加密算法(AES)——你只需要保存一个计数器,并且要创建一个密钥,你需要增加一个内部保存的计数器,用一些秘密密钥加密它,并将结果用作会话密钥。

既然其他人已经提到了加密使用的操作模式,我也会在这方面提出我的两美分价值:你可能不想要使用ECB,除非你真的期望一个可怕的嘈杂的连接,对于接收方来说获得所有可能的数据是至关重要的,即使冒着将数据暴露给攻击者的风险。

CBC(只有一种明显的可能性)赋予几乎从丢失的数据包中恢复的能力(它是自同步的,因此传输中的噪声爆发可以破坏两个数据包,而不是像ECB那样破坏一个数据包),但是更大的处理更多的数据来隐藏攻击者。

我认为RSA可以完成这项工作,您可以使用哈希来检查数据是否被更改