我目前在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)
关于为什么会发生这种情况的任何想法?任何人都可以看到此代码的任何可能的问题?
将失败消息更改为:
\n\nNSLog(@"Failed DES decrypt, status: %d", ccStatus);\nRun Code Online (Sandbox Code Playgroud)\n\n您将看到一个-4300状态并查找该状态CommonCryptoError.h以查找:
\n kCCParamError = -4300
\n@constant kCCParamError Illegal parameter value.
如果您不忽略状态错误,它们可能会成为您的朋友。
\n\n您指定的 3DES 密钥长度应为 24 字节,而您提供的是 16 字节。您最好更改为kCCAlgorithmDES和kCCBlockSizeDES(参见下一点)。但密钥可能是十六进制编码的,需要解码为 8 字节。
在调用中,第 5 个参数是size_t keyLength但您提供的kCCBlockSize3DES是 8 字节。密钥和块大小不一定相同。
默认情况下不填充,这意味着要加密的数据必须是块大小(8 字节)的精确倍数。向输入数据添加另一个字节或指定kCCOptionPKCS7Padding为选项。
一般来说,不可能直接用字符串表达加密的结果,特别是UTF-8表示\xe2\x80\x94,有一些字节值是不可显示的。因此,如果您需要字符串编码,通常使用 Base64 或十六进制。
注意:密钥有可能是 16 字节,并且需要两个密钥 3DES,在这种情况下,复制前 8 字节并将其附加到密钥,以生成 24 字节 3DES 密钥。您需要掌握算法、密钥和选项。
\n\n此示例代码可以工作,但既不是最优的,也不是安全的,而是一个让您继续前进的起点:
\n\n您可以通过提供 24 字节密钥并将其更改kCCAlgorithmDES为kCCAlgorithm3DES和kCCKeySizeDES来将其更改为 3DESkCCKeySize3DES
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}\nRun Code Online (Sandbox Code Playgroud)\n\n但出于安全原因,请使用 AES 和随机 IV,如果可能的话使用RNCryptor,它会为您处理所有令人讨厌但重要的细节。
\n| 归档时间: |
|
| 查看次数: |
1138 次 |
| 最近记录: |