多次 md5 一个字符串

发布于 2024-11-11 17:29:49 字数 2304 浏览 1 评论 0原文

在 Python 中多次 md5 字符串:

def md5(i):
    return hashlib.md5(i).hexdigest().upper()


def md5x3(src):
    f = hashlib.md5(src).digest()
    s = hashlib.md5(f).digest()
    t = md5(s)
    return t

如何在 MacOS/iOS 上使用 OpenSSL 在 C 中实现上述内容,或者在 MacOS/iOS 上不使用 OpenSSL 在 Objective-C 中实现上述内容?

我尝试遵循,但其结果与 python 的不同。

#import <Foundation/Foundation.h>

#import <CommonCrypto/CommonDigest.h>
#import <CommonCrypto/CommonCryptor.h>

static char* hextostr(const unsigned char* in , int len) 
{
    char* res = (char*)malloc(len * 2 + 1);
    int i = 0;
    memset(res , 0 , len * 2 + 1);
    while(i < len)
    {
        sprintf(res + i * 2 , "%02x" , in[i]);
        i ++;
    };
//  i = 0;
//  int reslength;
//  reslength=(int)strlen(res);
//  while(i < reslength)
//  {
//      res[i] = toupper(res[i]);
//      i ++;
//  };
    return res;
}

int main (int argc, const char * argv[])
{

    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

    NSString * foo = @"abcdefghij";

    NSData * buf1 = [foo dataUsingEncoding:NSUTF8StringEncoding];
    unsigned char result1[CC_MD5_DIGEST_LENGTH];
    CC_MD5([buf1 bytes], (unsigned int)[buf1 length], result1);

    NSData * buf2 = [[[NSString alloc] initWithFormat:@"%s", result1] dataUsingEncoding:NSUTF8StringEncoding];
    unsigned char result2[CC_MD5_DIGEST_LENGTH];
    CC_MD5(result1, (unsigned int)strlen(result1), result2);    


    NSData * buf3 = [[[NSString alloc] initWithFormat:@"%s", result2] dataUsingEncoding:NSUTF8StringEncoding];
    unsigned char result3[CC_MD5_DIGEST_LENGTH];
    CC_MD5(result2, (unsigned int)strlen(result2), result3);    

    NSString * res = [[NSString alloc] initWithFormat:
            @"%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",
            result3[0], result3[1], result3[2], result3[3], result3[4], result3[5], result3[6], result3[7],
            result3[8], result3[9], result3[10], result3[11], result3[12], result3[13], result3[14], result3[15]
            ];

    NSLog(@"%s", hextostr(result1, CC_MD5_DIGEST_LENGTH));
    NSLog(@"%s", hextostr(result2, CC_MD5_DIGEST_LENGTH));  
    NSLog(@"%s", hextostr(result3, CC_MD5_DIGEST_LENGTH));      



    [pool drain];
    return 0;
}

md5 a string multiple times in Python:

def md5(i):
    return hashlib.md5(i).hexdigest().upper()


def md5x3(src):
    f = hashlib.md5(src).digest()
    s = hashlib.md5(f).digest()
    t = md5(s)
    return t

how to implement above in C with OpenSSL on MacOS/iOS or in Objective-C without OpenSSL on MacOS/iOS ?

I'm try following, but its result is different from python's.

#import <Foundation/Foundation.h>

#import <CommonCrypto/CommonDigest.h>
#import <CommonCrypto/CommonCryptor.h>

static char* hextostr(const unsigned char* in , int len) 
{
    char* res = (char*)malloc(len * 2 + 1);
    int i = 0;
    memset(res , 0 , len * 2 + 1);
    while(i < len)
    {
        sprintf(res + i * 2 , "%02x" , in[i]);
        i ++;
    };
//  i = 0;
//  int reslength;
//  reslength=(int)strlen(res);
//  while(i < reslength)
//  {
//      res[i] = toupper(res[i]);
//      i ++;
//  };
    return res;
}

int main (int argc, const char * argv[])
{

    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

    NSString * foo = @"abcdefghij";

    NSData * buf1 = [foo dataUsingEncoding:NSUTF8StringEncoding];
    unsigned char result1[CC_MD5_DIGEST_LENGTH];
    CC_MD5([buf1 bytes], (unsigned int)[buf1 length], result1);

    NSData * buf2 = [[[NSString alloc] initWithFormat:@"%s", result1] dataUsingEncoding:NSUTF8StringEncoding];
    unsigned char result2[CC_MD5_DIGEST_LENGTH];
    CC_MD5(result1, (unsigned int)strlen(result1), result2);    


    NSData * buf3 = [[[NSString alloc] initWithFormat:@"%s", result2] dataUsingEncoding:NSUTF8StringEncoding];
    unsigned char result3[CC_MD5_DIGEST_LENGTH];
    CC_MD5(result2, (unsigned int)strlen(result2), result3);    

    NSString * res = [[NSString alloc] initWithFormat:
            @"%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",
            result3[0], result3[1], result3[2], result3[3], result3[4], result3[5], result3[6], result3[7],
            result3[8], result3[9], result3[10], result3[11], result3[12], result3[13], result3[14], result3[15]
            ];

    NSLog(@"%s", hextostr(result1, CC_MD5_DIGEST_LENGTH));
    NSLog(@"%s", hextostr(result2, CC_MD5_DIGEST_LENGTH));  
    NSLog(@"%s", hextostr(result3, CC_MD5_DIGEST_LENGTH));      



    [pool drain];
    return 0;
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

灯下孤影 2024-11-18 17:29:49

使用摘要库,例如您可能已经安装的 OpenSSL。请参阅http://www.openssl.org/docs/crypto/md5.html。 MD5 的源代码位于 http://userpages.umbc.edu/~ mabzug1/cs/md5/md5.html

Use a digest library, such as OpenSSL, which you probably have installed already. See http://www.openssl.org/docs/crypto/md5.html. Source code for MD5 is available at http://userpages.umbc.edu/~mabzug1/cs/md5/md5.html.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文