8.Odds and ends
1.Key Derivation
2.Deterministic Encryption
3.Deterministic Encryption Constructions:SIV and wide PRP
4.Tweakable encryption
5.Format preserving encryption
1.Key Derivation
密钥推导函数KDF,SK=source key
CTX上下文变量,用来分离各个进程
原密钥不是均匀分布怎么办?
密钥交换协议会生成一个高熵的密钥,
高熵意味着字符串的分布接近均匀,但不是均匀分布。
硬件随机数发生器RNG也会生成不均匀输出
先提取再扩展机制
加盐的效果是得到一个看起来与随机分布不可区分的分布
盐值可以公开,但是要保证随机产生。盐永远是固定的
盐是用来防御可能会干扰提取器的恶意的坏分布
在step1中,用这个盐作为HMAC的密钥,把源密钥作为HMAC的数据
密码通常含有很小的熵,约为20位左右的熵
我们需要根据密码推导加密密钥和MAC密钥怎么做?
用HKDF,推导出的密钥对所谓的字典攻击是脆弱的
Slow hash function
我们描述一种从密码推导密钥的标准方法,PKCS#5
慢哈希,就是把哈希迭代c次,最后结果作为这个密钥推导函数的密钥输出
这样做减缓了字典攻击
2.Deterministic Encryption
确定性加密
一致性加密机制,对特定的明文加密总是输出同样的密文
K1加密索引,k2加密数据
确定性加密机制不可能是CPA安全的,因为攻击者每次看到同样的密文两次时,他就知道底层的明文是相等的
确定性选择明文攻击
加密者永远不要使用同一密钥多次加密同样的明文信息
3.Deterministic Encryption Constructions:SIV and wide PRP
可以提供对抗确定性的CPA的安全性
确定性的加密是需要的。例如,加密数据库索引。
第一个安全机制是SIV
使用R作为随机性,r实际上是集合R的一个元素
如果加密机制E是随机计数器模式。随机性R就是随机IV,这个IV会随密文一并输出,这意味着密文比明文略长。
这是CPA安全的,如果我们用F来处理多个信息,那么F生成的随机字符串将看起来像是真随机字符串。
SIV更适合有长度的信息加密。
使用SIV可以获得密文完整性,不必使用特定的MAC。
DAE确定性的认证加密,保证了CPA安全和密文完整性
加密过程:
解密过程:
在解密后检查我们重新推出的IV是否是正确的IV,如果不是就拒绝。足以提供密文完整性。
如果明文长度小于16字节的话,SIV不合适。所以提出第二种机制。
完全可以直接使用PRP,甚至AES。但是这个不提供完整性。
如果明文长于16字节,继续使用机制2 的话,怎么办,能否构建PRP它的明文空间比16字节大?
组建大明文空间的PRP
EME机制,把窄的PRP扩展成宽的PRP,分组并行加密,有点复杂
计算输出的校验和是串行的。
SIV比这种模式快一倍。
所SIV更适合处理长消息,PRP更适合处理短消息。
PRP机制如何获得密文完整性,从而成为DAE确定性的认证加密.
非常简单
在明文信息后面附一堆0,然后应用PRP。
解密时如果最低位不等于0,拒绝这个密文。
在末尾附加n个0,需要满足1/2^n是可以忽略的。
4.Tweakable encryption
微调加密,应用于硬盘加密,也是确定加密
扩建一个不扩展的加密,密文长度严格等于明文长度
因为没有空间添加随机性nonce,所以最多保证CPA安全
使用不同密钥加密不同扇区
也会泄露信息,比如改动明文的一位,整个密文都变了,一旦撤销,攻击者可以看出一个改变做出后又撤销了。
微调分组密码
只需要一个主密钥推导很多PRP,使用PRP数加密密钥K。
这个PRP数就是所谓的微调。
加密解密算法中,取密钥为输入,微调T为输入
如果我们固定密钥和微调,会得到一个可逆的函数,集合X上的一一映射的函数。
这个函数事实上与随机函数不可区分。
我们使用这里的扇区号作为微调,这样每个扇区都有它自己的独立的PRP。
XTS模式,给定普通分组密码定义微调分组密码
T是微调,I 是索引,X是n位字符串
在微调前加密它
好处是,如果想加密n+1个分组,只需要计算n次,然后对索引1234对每个分组。
我们只需要计算PRP E一次。所以我们需要加密n个分组T1T2T3T4。
我们只需要n+1次分组密码E的计算,这比简单机制要快出一倍。
有必要在用微调前加密它吗?
攻击者可以计算挑战者的两个回复的异或,然后比较合适的密码本函数值的异或。
5.Format preserving encryption
保格式加密,应用于加密信用卡卡号
信用卡号前六位是BIN代表了发行方的ID,后九位数字是账号
最后一位数字是一个校验和
保格式加密的目标:加密的信用卡号应该看起来像一个正常的有效信用卡号
第一步压缩PRF的定义域
s是所有信用卡号的总数
s是个很大的数。接近2^41,t=42
需要一个PRF F' 在长度t/2的分组上操作
一种方法是使用AES生成128位输入的PRF,然后截断输出,取低21位。得到21位的值,在后面附0,以获得128位,然后对它应用AES,将结果截断成21位。在这种方法简单,但不是最好的。
有更好的截断n位PRF的方法,以生成t位PRF,但是对于本节,使用上面的方法已经足够好了。
现在我们已经把AES分组密码转换成了一个t/2位的PRF,比如说21位。
但我们真正想要的是一个PRP,所以我们只要把我们的新PRF F'直接带入到luby-rackoff机制中。
是一个feistel机制。(DES)
我们使用21位PRF输入,这个网络会给我们一个安全的42位PRF也是安全的42位PRP
迭代7次,使用7个不同的密钥,
第一篇,HKDF机制
第二篇,确定性加密,SIV模式
第三篇,EME模式
第四篇,微调分组密码,XTS模式
第五篇,保格式加密