iOS使用MD5和DES进行基于密码的加密:返回无效的ASCII字符串

时间:2014-01-14 09:30:34

标签: ios encryption md5 nsdata

我正在使用基于密码的加密使用MD5和DES,下面是我正在使用的功能。

+(NSData*) cryptPBEWithMD5AndDES:(CCOperation)op usingData:(NSData*)data withPassword:(NSString*)password andSalt:(NSData*)salt andIterating:(int)numIterations {

unsigned char md5[CC_MD5_DIGEST_LENGTH];
memset(md5, 0, CC_MD5_DIGEST_LENGTH);

NSData* passwordData = [password dataUsingEncoding:NSUTF8StringEncoding];

CC_MD5_CTX ctx;
CC_MD5_Init(&ctx);
CC_MD5_Update(&ctx, [passwordData bytes], [passwordData length]);
CC_MD5_Update(&ctx, [salt bytes], [salt length]);
CC_MD5_Final(md5, &ctx);

for (int i=1; i<numIterations; i++) {
    CC_MD5(md5, CC_MD5_DIGEST_LENGTH, md5);
}

size_t cryptoResultDataBufferSize = [data length] + kCCBlockSizeDES;
unsigned char cryptoResultDataBuffer[cryptoResultDataBufferSize];
size_t dataMoved = 0;

unsigned char iv[kCCBlockSizeDES];
memcpy(iv, md5 + (CC_MD5_DIGEST_LENGTH/2), sizeof(iv)); //iv is the second half of the MD5 from building the key

CCCryptorStatus status =
CCCrypt(op, kCCAlgorithmDES, kCCOptionPKCS7Padding, md5, (CC_MD5_DIGEST_LENGTH/2), iv, [data bytes], [data length],
        cryptoResultDataBuffer, cryptoResultDataBufferSize, &dataMoved);

if(0 == status) {
    return [NSData dataWithBytes:cryptoResultDataBuffer length:dataMoved];
} else {
    return NULL;
}
}

返回的字符串是“¯Â<˜˚mOm¢$—Ì7lÁ'9’G@.P

我有两个问题: - 1)上述字符串是否为上述函数的有效输出。如果没有,那么该功能有什么问题?
2)如果是,那么为什么我无法解密上述字符串?

2 个答案:

答案 0 :(得分:1)

回答你的问题:

  1. 以上字符串是否为有效输出 - 是的,它是有效的。但不是你试图打印它的方式。
  2. 为什么我无法解密 - 因为当您使用NSString表示加密数据时会出现符号丢失
  3. 如果您需要加密数据的字符串表示,那么您将使用Base64表示数据。

    在iOS 7中,NSData类中引入了新方法:-[NSData base64EncodedStringWithOptions],这对于此目的非常有用。要将base64字符串解码为NSData,您需要使用-[NSData initWithBase64EncodedString:] init方法。

    P.S。使用第三方工具将加密结果与另一个输出进行比较总是有帮助的。最好的方法是使用基于终端的加密。但在大多数情况下,在线加密工具可以提供足够好的服务。

    编辑:

    起初我没有意识到你确实试图恢复MD5哈希。大多数哈希函数不向后兼容,因此无法还原。请参阅hash functionMD5

    的参考资料

答案 1 :(得分:0)

它是一个有效的输出。尝试将字符串转换为base64,然后将其打印出来。