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;
}
ヘッダファイルは、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成功。

最新コメント