1

我正在尝试解密一个字符串,该字符串首先在 ecb 模式下使用 des 加密,然后以 base64 编码。

这是我的代码:

+ (NSString *)decrypt:(NSString *)encryptedText
{
    NSString *key = @"12345678";
    NSData *decodedData = [[NSData alloc] initWithBase64EncodedString:encryptedText options:0];
    size_t numBytesDecrypted = 0;
    size_t bufferSize = [decodedData length] + kCCBlockSizeDES;
    void *buffer = malloc(bufferSize);
    char keyPtr[kCCKeySizeDES+1]; // room for terminator (unused)
    bzero(keyPtr, sizeof(keyPtr));
    [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];


    CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt,
                                      kCCAlgorithmDES,
                                      kCCOptionPKCS7Padding | kCCOptionECBMode,
                                      keyPtr,
                                      kCCKeySizeAES256,
                                      NULL /* initialization vector (optional) */,
                                      [decodedData bytes], [decodedData length], /* input */
                                      buffer,       bufferSize, /* output */
                                      &numBytesDecrypted);

    NSData *val = [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted];
    return [[NSString alloc] initWithData:val encoding:NSUTF8StringEncoding];
}

但是我得到一个零字符串作为回报......有什么想法吗?

4

1 回答 1

1

您正在使用 DES,但在调用中将密钥大小指定为kCCKeySizeAES256CCCrypt

从安全的角度来看,这段代码有很多问题,不要在真正的应用程序中使用它。这不再是最佳实践。除其他事项外,应使用基于密码的密钥派生函数(例如 PBKDF2)将密码转换为密钥。同样使用 DES 和 ECB 模式也是一个弱点。

于 2014-04-04T03:16:47.657 回答