我正在使用基于密码的加密使用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)如果是,那么为什么我无法解密上述字符串?
答案 0 :(得分:1)
回答你的问题:
NSString
表示加密数据时会出现符号丢失如果您需要加密数据的字符串表示,那么您将使用Base64表示数据。
在iOS 7中,NSData
类中引入了新方法:-[NSData base64EncodedStringWithOptions]
,这对于此目的非常有用。要将base64字符串解码为NSData
,您需要使用-[NSData initWithBase64EncodedString:]
init方法。
P.S。使用第三方工具将加密结果与另一个输出进行比较总是有帮助的。最好的方法是使用基于终端的加密。但在大多数情况下,在线加密工具可以提供足够好的服务。
编辑:
起初我没有意识到你确实试图恢复MD5哈希。大多数哈希函数不向后兼容,因此无法还原。请参阅hash function和MD5
的参考资料答案 1 :(得分:0)
它是一个有效的输出。尝试将字符串转换为base64,然后将其打印出来。