encryption - 当加密不是 block 大小的偶数倍的数据时,我必须发送完整的最后一个 block 吗?

标签 encryption aes

如果我使用的是 AES 等 block 大小为 128 位的 block 密码,如果我的数据不是 128 位的偶数倍,我该怎么办?我正在处理数据包,并且不想在加密时更改数据包的大小,但我的数据不是 128 的偶数倍?

AES 分组密码是否允许在加密后不更改消息大小的情况下处理最后一个较短的分组?

最佳答案

这种细节取决于您使用的链接模式。链接模式定义了调用 AES 原语的次数。以及关于什么,对于给定的输入消息。最简单的链接模式是将输入数据简单地拆分为连续的 16 字节 block ,并独立加密每个 block ;这被称为ECB(作为“电子密码本”)并且已知有弱点(即,如果两个输入 block 相同,在“现实生活”数据中很常见,那么这两个相应的输出 block 也将彼此相等,任何人都可以看到)。

某些链接模式会放大数据,即加密的消息会比输入的消息略大。其他链接模式(例如 CTR)没有。几乎所有的安全链接模式都需要处理一个“初始值”,它是一段不需要保密的数据(通常与 block 大小相同),但必须为发送方和接收方所知,并且必须是不同的对于每条消息。某些模式(例如 CBC)需要一个均匀随机 IV,而其他一些模式会使用简单的计数器。通常将 IV 与加密消息一起发送。您还可以使用散列函数从 key 本身导出 IV。

这些事情很棘手,而且很难知道你是否做对了:安全性无法测试;弱密码系统可以像任何其他应用程序一样编译和运行。不建议设计自己的加密协议(protocol)。完全没有。使用健壮的原语并不能保证结果是安全的。

关于encryption - 当加密不是 block 大小的偶数倍的数据时,我必须发送完整的最后一个 block 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2845706/

相关文章:

java - AES-CTR双重加密将密文反转为明文

java - 需要使用 bouncycaSTLe 在 Java 中将 "expand"AES 256 key 转换为 10 个圆形 key

python - 扩展欧几里德算法的不同实现会产生不同的结果?

golang 加密 cipher.Block/AES key 本身

java - 此 Java 和 C 代码之间的区别?

java - 定义一个key来生成key

ssl - TCP/IP 套接字无法与 TLSv1_2_client_method() 建立安全连接

c# - 在 php 中传输用户密码的安全方法

c# - 使用 Windows AES 加密提供程序在 C++ 中解密 C# 加密的数据

java - AES 密码安全性在客户端上使用 CryptoJS,在服务器上使用 Java 的 Cipher