如果用户可以使用AES加密访问多个加密数据,他们是否能够猜出加密密钥?

时间:2016-03-11 11:20:54

标签: ios encryption aes rncryptor

我已经开始使用RNCryptor,它将自己描述为"适用于iOS和Mac的CCCryptor(AES加密)包装"。

我的问题并非针对iOS,而是更为一般。

这里有一些我可能用来加密字符串的代码:

func encryptText(text: String, encryptionKey: String) -> NSData? {
    let textData = text.dataUsingEncoding(NSUTF8StringEncoding)

    if textData == nil { 
        return nil 
    } 

    let encryptedTextData = RNCryptor.encryptData(textData!, password: encryptionKey)

    return encryptedTextData
}

我有一些顾虑:

  1. 如果用户无法访问加密密钥,但是有多个字符串使用他们可以访问的相同加密密钥加密,他们是否能够找出加密密钥是什么? / LI>
  2. 如果用户知道其中一个字符串的内容,例如" Test String",他们是否能够使用该知识找出加密密钥,从而访问其他字符串?
  3. 如果是2,那么在每个字符串的末尾添加一系列随机字符(比方说20个字符)可以保护我免受那种攻击吗?如果有人掌握了这些知识,他们是否很容易删除最后20个字符并解密剩余的字符串?

1 个答案:

答案 0 :(得分:4)

所有攻击者都可以做的是暴力破解密钥,这不是一个现实的主张,并且对于多条消息的知识不会变得更容易(除非AES中存在一些我们不知道的弱点会产生"模式")。

如果攻击者能够访问许多拦截(甚至解密)的邮件,您可能想知道攻击者是否还有其他优势。例如,如果明文与早期消息相似甚至相同,则能够猜测它。

AES包括设置"初始化向量"。

通常,您为每条消息设置一个随机IV,并将其与加密消息一起发送。你的图书馆也在这样做。结果是没有两个消息以完全相同的方式加密。即使您发送三次相同的明文,它也会以三种不同的密文结尾(与三种不同的消息无法区分)。与"盐渍"相同的想法。

  

会在每个字符串的末尾添加一系列随机字符(比方说20个字符)可以保护我免受这种攻击吗?

随机IV机制使这不必要。

至于它是否有效,AES是分组密码。早期块的输出可以影响后续块的输出,但不会影响相反的输出。因此,最后的随机填充只会改变最后一个块。如果有的话,你想要在开头填充你的字符串。但同样,算法本身(如果使用得当)有处理这些问题的机制(以IV,块链接和块填充的形式)。