-1

我正在对存储在我的应用程序中的数据进行加密。我在加密和解密数据方面已经走得很远了,我的问题是,当使用错误的密钥时,我似乎无法强制出现明显的解密错误。我的解密功能:

+ (NSData *)decryptedDataForData:(NSData *)data
                    password:(NSString *)password
                          iv:(NSData *)iv
                        salt:(NSData *)salt
                       error:(NSError **)error {
NSAssert(iv, @"IV must not be NULL");
NSAssert(salt, @"salt must not be NULL");

NSData *key = [self AESKeyForPassword:password salt:salt];

size_t outLength;
NSMutableData *
decryptedData = [NSMutableData dataWithLength:data.length];

CCCryptorStatus
result = CCCrypt(kCCDecrypt,
                 kAlgorithm,
                 kCCOptionPKCS7Padding,
                 key.bytes,
                 key.length,
                 iv.bytes,
                 data.bytes,
                 data.length,
                 decryptedData.mutableBytes,
                 decryptedData.length,
                 &outLength);

if (result == kCCSuccess) {
    decryptedData.length = outLength;
}
else {
    if (error) {
        *error = [NSError errorWithDomain:kRNCryptManagerErrorDomain
                                     code:result
                                 userInfo:nil];
    }
    return nil;
}

return decryptedData;

}

这取自http://robnapier.net/aes-commoncrypto以供参考。

根据 CCCrypt 文档,如果我的数据没有正确解密,我应该会收到一个 kCCDecodeError,所以我假设解密操作是成功的,只是由于错误的密钥而给出了垃圾数据。

那么,确定是否使用正确的密钥来解密数据的最佳实践是什么?

4

1 回答 1

0

kCCDecodeError如果使用了正确的密钥,则不提供信息,仅在存在严重错误时提供信息。

知道密钥是否正确的唯一方法是验证输出。可以对输出进行总体验证,也可以使用哈希或其他验证进行验证,例如知道它应该是在某种方式上有意义的好输出。

回答最佳实践以确定密钥是否正确:

  1. 这不是加密的功能,并且拥有这种方法实际上会通过向攻击者提供婴儿床来降低安全性。请参阅已知明文攻击

  2. 除了发动攻击之外,人们还知道正确的密钥并使用它。

  3. 如果您需要能够确定解密是否正确,请添加可以检查的内容,例如数据的散列或魔术值,并在解密时验证。见上文 1.。

  4. 对于安全身份验证,请参阅几个参考资料之一,例如Bruce Schneier的Applied Cryptography 、Niels Ferguson 的Practical Cryptography、Bruce Schneier、Handbook of Applied Cryptography 等等。

一般来说,如果您想要真正的安全性,请聘请加密领域专家。

于 2014-12-31T01:25:38.223 回答