由于协议限制,我只能为tx (不包括报头)输入24字节的数据,如果我使用AES_GCM加密数据,我知道我不需要担心填充。
例如,如果我的数据是22个字节,我将得到一个22字节的加密输出。所以,我在AES-GCM或AES-CTR上都没有发现。然而,我发现AES-CTR流密码在Microsoft密码库中是不可用的,因此决定使用AES-GCM。但是,我再次观察到,AES-GCM的输出是密码文本和标记.建议此标记字段的值至少为32个字节。我最初考虑使用两个字节的CRC,所以我的数据如下:
ciphertex + CRC16 = 24 bytes。
但是当我读到关于AES-GCM的文章时,我发现标记字段和CRC做的工作是一样的。如果我指定了用于加密的标记长度为2个字节,可以吗?另一个选项是使用CRC16,因为它只需要2个字节。
另一个信息是我的钥匙/IV对每隔1小时不断更换一次。请建议什么是最好的出路-哪种加密方法是最好的
发布于 2023-04-12 11:44:06
如果我使用AES_GCM加密我的数据,我知道我不需要担心填充。
正确的。
如果我的数据是22个字节,我将得到一个22字节加密的输出。
这不算初始化向量。通常的大小是12个字节,通常作为密文的头。您可以缩小它的大小(并且有带有零的接收器垫),但它必须保持足够宽,使IV不会被重复使用。可以是个柜台。如果有效载荷的字段不需要加密,每次使用时都会改变(例如,时间保证单调,因为它能幸免于重置),那么它们可以安全地作为IV使用(并从加密的内容中删除)。
建议此标记字段的值至少为32个字节。
不是的。标记字段最多为16个字节(128位)。在某些应用程序中,将其减少到4字节(32位)是可以的。如果标记是b-bit,那么如果n试图获得验证设备接受的虚假消息,则会导致一个消息被接受的概率不超过n/2^b。例如,使用一个4字节的标记,如果对手在一天内每毫秒提交一条消息,那么他们成功的概率是2%。
最小标记大小没有硬限制(除非由某个API强制执行)。如果将其减少到2个字节,每秒提交一条消息一小时的对手成功的概率为5.5%。如果您的接受设备在少量错误之后锁定,这可能是可以接受的(但这是以牺牲可用性/抵抗拒绝服务为代价的)。
其他选择是使用CRC16
不是的!不要在受CRC16保护的数据上使用AES-CTR (或等效的AES-GCM无标记):获取一条消息的对手可以将其更改为将被接受的另一条消息,这是利用CRC和CTR加密的线性性进行的基本攻击。
我的钥匙/IV对每隔1小时更换一次。
如果你每小时加密一次以上,就不要这么做!不能重复使用密钥/IV对。AES-GCM (和AES-CTR)对此极为脆弱.即使在理论上,如果AES密钥为128位,则重用IV也是不可取的,因为它允许多目标攻击。
同样,您必须想出一种在每次加密时更改IV的方法,至少在重复使用相同的密钥时是这样的。两种最标准的方法是:
您还可以在加密之前使用更好的数据编码来节省一些空间。例如,12位小数可以容纳5个字节。
发布于 2023-03-13 07:47:29
CRC16是线性的,如果我们将它的真实性委托给它,那么将标记截断到两个八进制将是一种选择(只要它对您的目的足够安全)。
每次调用加密时,IV都必须更改--否则它将重用“密码流”,而且它可能会被破坏。
https://crypto.stackexchange.com/questions/105636
复制相似问题