Objective-Cでsha1

On 2010年9月14日, in Objective-C, by タカ

http://d.hatena.ne.jp/WaterFlea/20091011/1255242225
を参考にさせてもらい、NSStringを拡張して、実装。


Crypto.h

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

@interface NSData(exDigest)
+ (NSData *)utf8Data: (NSString *)string;
- (NSData *)sha1Digest;
- (NSData *)md5Digest;
- (NSString *)hexString;
- (NSString *)sha1String;
@end

@interface NSString(exDigest)
- (NSString *)sha1String;
@end

Crypto.m

#import "Crypto.h"

@implementation NSData(exDigest)

+ (NSData *)utf8Data:(NSString *) string
{
    const char* utf8str = [string UTF8String];
    NSData* data = [NSData dataWithBytes: utf8str length: strlen(utf8str)];
    return data;
}

- (NSData *)sha1Digest
{
    unsigned char result[CC_SHA1_DIGEST_LENGTH];
    CC_SHA1([self bytes], [self length], result);
    return [NSData dataWithBytes:result length:CC_SHA1_DIGEST_LENGTH];
}

- (NSData *)md5Digest
{
    unsigned char result[CC_MD5_DIGEST_LENGTH];
    CC_MD5([self bytes], [self length], result);
    return [NSData dataWithBytes:result length:CC_MD5_DIGEST_LENGTH];
}

- (NSString *)sha1String
{
    return [[self sha1Digest] hexString];
}

- (NSString *)hexString
{
    unsigned int i;
    static const char *hexstr[16] = { "0", "1", "2", "3",
        "4", "5", "6", "7",
        "8", "9", "a", "b",
        "c", "d", "e", "f" };
    const char *dataBuffer = (char *)[self bytes];
    NSMutableString *stringBuffer = [NSMutableString stringWithCapacity:([self length] * 2)];
    for (i=0; i<[self length]; i++) {
        uint8_t t1, t2;
        t1 = (0x00f0 & (dataBuffer[i])) >> 4;
        t2 =  0x000f & (dataBuffer[i]);
        [stringBuffer appendFormat:@"%s", hexstr[t1]];
        [stringBuffer appendFormat:@"%s", hexstr[t2]];
    }

    return [[stringBuffer copy] autorelease];
}
@end

@implementation NSString(exDigest)
- (NSString *)sha1String
{
    return [[NSData utf8Data: self] sha1String];
}
@end

main.m

#import <Foundation/Foundation.h>
#import "Crypto.h"

int main (int argc, const char * argv[]) {
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
    NSLog(@"%@", [[NSData utf8Data: @"test"] sha1String]);
    NSLog(@"%@", [@"test" sha1String]);
    [pool drain];
    return 0;
}
Tagged with:  

Objective-Cでsha1

On 2010年4月10日, in Objective-C, by タカ

ヘッダファイルは、Encrypt.hというファイル名で

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

@interface NSData(exDigest)
+ (NSData *) utf8Data: (NSString *) string;
- (NSData *) sha1Digest;
- (NSData *) md5Digest;
- (NSString *) hexString;
- (NSString *) sha1String;
@end

mファイルは、Encrypt.mというファイル名で

#import "Encrypt.h"
@implementation NSData(exDigest)
+ (NSData *) utf8Data: (NSString *) string
{
    const char* utf8str = [string UTF8String];
    NSData* data = [NSData dataWithBytes: utf8str length: strlen(utf8str)];
    return data;
}

- (NSData *) sha1Digest
{
    unsigned char result[CC_SHA1_DIGEST_LENGTH];
    CC_SHA1([self bytes], [self length], result);
    return [NSData dataWithBytes:result length:CC_SHA1_DIGEST_LENGTH];
}

- (NSData *) md5Digest
{
    unsigned char result[CC_MD5_DIGEST_LENGTH];
    CC_MD5([self bytes], [self length], result);
    return [NSData dataWithBytes:result length:CC_MD5_DIGEST_LENGTH];
}

- (NSString *) sha1String
{
    return [[self sha1Digest] hexString];
}

- (NSString *)hexString
{
    unsigned int i;
    static const char *hexstr[16] = { "0", "1", "2", "3",
        "4", "5", "6", "7",
        "8", "9", "a", "b",
        "c", "d", "e", "f" };
    const char *dataBuffer = (char *)[self bytes];
    NSMutableString *stringBuffer = [NSMutableString stringWithCapacity:([self length] * 2)];
    for (i=0; i<[self length]; i++) {
        uint8_t t1, t2;
        t1 = (0x00f0 & (dataBuffer[i])) >> 4;
        t2 =  0x000f & (dataBuffer[i]);
        [stringBuffer appendFormat:@"%s", hexstr[t1]];
        [stringBuffer appendFormat:@"%s", hexstr[t2]];
    }

    return [[stringBuffer copy] autorelease];
}
@end

実行用ファイルはmain.mとかってしてあげて

#import "Encrypt.h"

int main(void)
{
    NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
    NSString* str = @"test";
    NSLog(@"%@", [[NSData utf8Data: str] sha1String]);
    [pool release];
    return 0;
}

コンパイル

$ gcc -c main.m -o main.o
$ gcc -c Encrypt.m -o Encrypt.o
$ gcc -o main main.o Encrypt.o -framework Foundation

そして、実行してみる。

$ ./main
2010-04-10 15:18:51.372 main[1712:903] a94a8fe5ccb19ba61c4c0873d391e987982fbbd3

といった感じで、sha1成功。

Tagged with: