因为使用同一个密码多次加密报文会降低加密数据的安全性,所以每个加密块都会使用唯一的密码加密。通常做法是用一个随机数或序列号或时间戳与密钥进行混合生成子密钥来加密数据。
如初始化向量是按特定规则生成的也可以称为nonce。
实际上复杂一点的情况初始化向量是由随机数和序列号,时间戳等共同组成的,可以是从左到右串起来,也可以是经过一定的运算。初始化向量中的随机数称为salt,比如AES-GCM中通常是4字节的Salt再加8字节的序列号。
根据TLS和IPsec中的定义初始化向量一般是12个字节组成,前4个是固定的salt,后8个是序列号。
在IPsec中Salt是在SA协商时生成的,在一个SA中不会改变,在TLS中Salt是在会话协商时生成的,在一个会话中不会改变。
因为解密的时候也需要IV,所以在不可靠连接(IPSec,DTLS,Wireguard,Wifi的WEP和WPA)加密时,IV都要附在密文前面一起发给对方。因为salt通常是固定的也可以也可以不在报文中发送,虽然序列号是可预测的,但是为了防止丢包(丢包后序列号就对不上了),在不可靠连接报文中发送IV仍然是必须的。
为了避免IV回绕可以执行密钥更新协议定时更新密钥。
以上只是一般做法,不同的算法和应用中IV的长度,生成方法,发送方式都会不同。