【问题标题】:How to decrypt a DES encrypted string in iOS?如何在 iOS 中解密 DES 加密字符串?
【发布时间】:2023-09-02 19:25:01
【问题描述】:

我使用 PHP 在 DES 算法中使用 PKCS #7 填充来加密字符串。

我想知道如何在 iOS 中使用 CCCrypt 来解密 DES 加密的字符串。如果您能提供一些示例代码来帮助我,不胜感激。

谢谢。

【问题讨论】:

  • 你有没有尝试过?
  • 我尝试了一些 CCCrypt 教程,但没有一个是在谈论 DES。
  • 谢谢,但没有示例代码。
  • 不要在新工作中使用 DES,它不再被认为是安全的,已被 AES(高级加密标准)取代 DES 只有密钥大小只有 56 位不被认为是安全的,AES 支持 128,192 和 256 位的密钥大小。见Security comparison of DES and AES

标签: iphone ios ipad


【解决方案1】:
- (NSData *)encryptDESByKey:(NSData *)key data:(NSData *)data
{
size_t numBytesEncrypted = 0;
size_t bufferSize = data.length + kCCBlockSizeDES;
void *buffer = malloc(bufferSize);

CCCryptorStatus result = CCCrypt( kCCEncrypt, kCCAlgorithmDES, kCCOptionPKCS7Padding,
                                 key.bytes, kCCKeySizeDES,
                                 NULL,
                                 data.bytes, data.length,
                                 buffer, bufferSize,
                                 &numBytesEncrypted);
NSData *output = [NSData dataWithBytes:buffer length:numBytesEncrypted];
free(buffer);
if( result == kCCSuccess )
{
    NSLog(@"encoded str %@",[output base64EncodedStringWithOptions:0]);
    return output;
} else {
    NSLog(@"Failed DES encrypt...");
    return nil;
}
}
- (NSData *) decryptDESByKey:(NSData *)key data:(NSData *)data
{
size_t numBytesEncrypted = 0;

size_t bufferSize = data.length + kCCBlockSizeDES;
void *buffer_decrypt = malloc(bufferSize);
CCCryptorStatus result = CCCrypt( kCCDecrypt , kCCAlgorithmDES, kCCOptionPKCS7Padding,
                                 key.bytes, kCCKeySizeDES,
                                 NULL,
                                 data.bytes, data.length,
                                 buffer_decrypt, bufferSize,
                                 &numBytesEncrypted );

NSData *output = [NSData dataWithBytes:buffer_decrypt length:numBytesEncrypted];
free(buffer_decrypt);
if( result == kCCSuccess )
{
    NSString *decodedString = [[NSString alloc] initWithData:output encoding:NSUTF8StringEncoding];
    NSLog(@"decoded str %@",decodedString);
    return output;
} else {
    NSLog(@"Failed DES decrypt ...");
    return nil;
}
}

-- 然后你可以调用类似的方法

  [self decryptDESByKey:[@"qwertykey" dataUsingEncoding:NSUTF8StringEncoding] data:[self encryptDESByKey:[@"qwertykey" dataUsingEncoding:NSUTF8StringEncoding] data:["YOUR--INPUT__STRING" dataUsingEncoding:NSUTF8StringEncoding]]];

-- "qwertykey" 是提供的密钥

【讨论】:

  • 此示例不安全CCCrypt 默认使用 CBC 模式,但未提供 IV。使用静态 IV 并不安全,IV 需要是一个由 CSPRNG 生成的随机字节数组,每次加密都是唯一的,IV 可以为加密数据添加前缀进行解密,它不需要保密。如果使用密码字符串,则需要使用诸如 PBKDF2 * Common Crypto 支持的函数从中派生解密密钥。
最近更新 更多