iOS中的三重DES解密

use*_*610 7 encryption ios

我目前在iOS上使用以下三重DES解密:

    NSString* plainText = @"My Text";
    NSString* keyText = @"cf6f1ed3bf0a156e";

    NSData *plainData = [plainText dataUsingEncoding:NSUTF8StringEncoding];
    NSData *keyData = [keyText dataUsingEncoding:NSUTF8StringEncoding];

    size_t bufferSize = plainData.length + kCCBlockSize3DES;
    NSMutableData *cypherData = [NSMutableData dataWithLength:bufferSize];
    size_t movedBytes = 0;

    CCCryptorStatus ccStatus;
    ccStatus = CCCrypt(kCCDecrypt,
            kCCAlgorithm3DES,
            kCCOptionECBMode,
            keyData.bytes,
            kCCBlockSize3DES,
            NULL,
            plainData.bytes,
            plainData.length,
            cypherData.mutableBytes,
            cypherData.length,
            &movedBytes);

    cypherData.length = movedBytes;

    if( ccStatus == kCCSuccess ) {
        NSLog(@"Data: %@",cypherData);
        NSLog(@"Data encoded string: %@",[NSString stringWithUTF8String:[cypherData bytes]]);
        NSLog(@"Data encoded: %@",[[NSString alloc] initWithData:cypherData encoding:NSUTF8StringEncoding]);
    } else {
        NSLog(@"Failed DES decrypt ...");
        return nil;
    }
Run Code Online (Sandbox Code Playgroud)

但是,我一直在控制台中获得以下内容:

数据:数据编码字符串:(null)数据编码:(null)

关于为什么会发生这种情况的任何想法?任何人都可以看到此代码的任何可能的问题?

zap*_*aph 2

将失败消息更改为:

\n\n
NSLog(@"Failed DES decrypt, status: %d", ccStatus);\n
Run Code Online (Sandbox Code Playgroud)\n\n

您将看到一个-4300状态并查找该状态CommonCryptoError.h以查找:
\n kCCParamError = -4300
\n@constant kCCParamError Illegal parameter value.

\n\n

如果您不忽略状态错误,它们可能会成为您的朋友。

\n\n
    \n
  1. 您指定的 3DES 密钥长度应为 24 字节,而您提供的是 16 字节。您最好更改为kCCAlgorithmDESkCCBlockSizeDES(参见下一点)。但密钥可能是十六进制编码的,需要解码为 8 字节。

  2. \n
  3. 在调用中,第 5 个参数是size_t keyLength但您提供的kCCBlockSize3DES是 8 字节。密钥和块大小不一定相同。

  4. \n
  5. 默认情况下不填充,这意味着要加密的数据必须是块大小(8 字节)的精确倍数。向输入数据添加另一个字节或指定kCCOptionPKCS7Padding为选项。

  6. \n
  7. 一般来说,不可能直接用字符串表达加密的结果,特别是UTF-8表示\xe2\x80\x94,有一些字节值是不可显示的。因此,如果您需要字符串编码,通常使用 Base64 或十六进制。

  8. \n
\n\n

注意:密钥有可能是 16 字节,并且需要两个密钥 3DES,在这种情况下,复制前 8 字节并将其附加到密钥,以生成 24 字节 3DES 密钥。您需要掌握算法、密钥和选项。

\n\n

此示例代码可以工作,但既不是最优的,也不是安全的,而是一个让您继续前进的起点:

\n\n

您可以通过提供 24 字节密钥并将其更改kCCAlgorithmDESkCCAlgorithm3DESkCCKeySizeDES来将其更改为 3DESkCCKeySize3DES

\n\n
NSString* plainText = @"My Text-";\nNSString* keyText = @"cf6f1ed3";\n\nNSData *plainData = [plainText dataUsingEncoding:NSUTF8StringEncoding];\nNSData *keyData = [keyText dataUsingEncoding:NSUTF8StringEncoding];\n\nsize_t bufferSize = plainData.length + kCCBlockSizeDES;\nNSMutableData *cypherData = [NSMutableData dataWithLength:bufferSize];\nsize_t movedBytes = 0;\n\nCCCryptorStatus ccStatus;\nccStatus = CCCrypt(kCCDecrypt,\n                   kCCAlgorithmDES,\n                   kCCOptionECBMode,\n                   keyData.bytes,\n                   kCCKeySizeDES,\n                   NULL,\n                   plainData.bytes,\n                   plainData.length,\n                   cypherData.mutableBytes,\n                   cypherData.length,\n                   &movedBytes);\n\ncypherData.length = movedBytes;\n\nif( ccStatus == kCCSuccess ) {\n    NSLog(@"Data: %@"encoded,cypherData);\n} else {\n    NSLog(@"Failed DES decrypt, status: %d", ccStatus);\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

但出于安全原因,请使用 AES 和随机 IV,如果可能的话使用RNCryptor,它会为您处理所有令人讨厌但重要的细节。

\n