获取文件的MD5/SHA1校验和

4
我已经找到了两个在Objective C中计算md5和sha1的函数。以下是代码:

-(void)md5HexDigest:(NSString*)input {
NSData *data = [input dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];

uint8_t digest[CC_MD5_DIGEST_LENGTH];

CC_MD5(data.bytes, data.length, digest);

NSMutableString* ret = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH * 2];

for(int i = 0; i<CC_MD5_DIGEST_LENGTH; i++) {
    [ret appendFormat:@"%02x",digest[i]];
}
NSLog (@"%@",ret);
}

-(void) SHA1digest:(NSString*)input{
NSData *data = [input dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];
uint8_t digest[CC_SHA1_DIGEST_LENGTH];
CC_SHA1(data.bytes, data.length, digest);
NSMutableString* output = [NSMutableString stringWithCapacity:CC_SHA1_DIGEST_LENGTH *2];

for(int i = 0; i < CC_SHA1_DIGEST_LENGTH; i++)
    [output appendFormat:@"%02x", digest[i]];

NSLog (@"%@", output);
}

我得到了这些校验和:

2010-11-04 20:38:01.962 MD5 Counter[88118:a0f] c8142be71e8ed4625c4f27eb573835f5
2010-11-04 20:38:01.964 MD5 Counter[88118:a0f] ba7ff5f68edef52dd89a92c075b88f247f3ef9aa

然而,正确的校验和应该是: SHA1:1c0d5ea45464e336fcb38c644dc125c3a16b5493 MD5:e8f4d590c8fe62386844d6a2248ae609 哪里出了错?请帮我看看!

Knodel,你完全改变了问题。你应该真正开始一个新的问题,或者至少将新的东西附加到旧的问题上。现在答案在问题的背景下没有意义。 - JeremyP
好的,那我开始一个新问题。抱歉。 - Knodel
2个回答

2
你应该使用CommonCrypto C API。函数在man页的第3CC节中有详细文档。特别是CC_md5CC_sha1函数族将对您感兴趣。

我已经在谷歌上搜索了这个函数族,但它并没有起作用。请看一下我的更新帖子。 - Knodel
@Knodel,说实话,我对Objective-C不是很了解,但像allowLossyConversion:YES这样的东西听起来会引起问题。MD5和SHA-1被精确设计为在输入稍有变化时产生不同的结果,因此任何形式的隐式转换都可能使其产生不同的输出。我建议使用文件中的二进制数据,而不是任何形式的文本字符串转换(甚至不确定您是否仍在处理文件,因为您已更改了问题)。 - Bruno
@Knodel:布鲁诺是正确的。很可能转换实际上正在改变数据。 - JeremyP

0

我不确定Mac AppStore的限制是什么,但您可能可以调用md5命令。它默认安装在OSX上,并计算给定参数文件的MD5校验和。


在 Obj-C 的上下文中如何使用它? - Knodel
抱歉,我不知道,但是我猜测在Obj-C中可能有一个类似于exec的函数可以让你调用外部命令。或者,你可以尝试使用OpenSSL API,其中有用于MD5和SHA-1计算的函数(你可能需要读取文件内容并将其传递给它们)。这个链接可能与此相关:https://dev59.com/BkjSa4cB1Zd3GeqPJOT0 - Bruno
我认为那不是一个好的选择... 应该有一个函数来完成这个任务。 - Knodel
哪一个?调用外部命令还是OpenSSL API?(我同意在这些选择之间,调用外部命令将是我最不喜欢的选择。) - Bruno

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接