web-dev-qa-db-ja.com

目標C:SHA1

Objective cで文字列または数値のセットをsha1するにはどうすればよいですか?

30
Daniel

CommonCrypto(Appleフレームワーク)には、ワンステップハッシュを含むSHA-1ハッシュを計算するための関数があります。

#include <CommonCrypto/CommonDigest.h>

unsigned char digest[CC_SHA1_DIGEST_LENGTH];
NSData *stringBytes = [someString dataUsingEncoding: NSUTF8StringEncoding]; /* or some other encoding */
if (CC_SHA1([stringBytes bytes], [stringBytes length], digest)) {
    /* SHA-1 hash has been calculated and stored in 'digest'. */
    ...
}

一連の数値について、既知の長さの整数の配列を意味すると仮定します。このようなデータの場合、ワンショット機能を使用するよりも、ダイジェストを繰り返し作成する方が簡単です。

unsigned char digest[CC_SHA1_DIGEST_LENGTH];
uint32_t *someIntegers = ...;
size_t numIntegers = ...;

CC_SHA1_CTX ctx;
CC_SHA1_Init(&ctx);
{
    for (size_t i = 0; i < numIntegers; i++)
        CC_SHA1_Update(&ctx, someIntegers + i, sizeof(uint32_t));
}
CC_SHA1_Final(digest, &ctx);

/* SHA-1 hash has been calculated and stored in 'digest'. */
...

これはエンディアンを考慮していないことに注意してください。 PowerPCシステムでこのコードを使用して計算されたSHA-1は、i386またはARMシステムで計算されたものとは異なります。解決策は単純です。整数のバイトを既知のエンディアンにスワップします。計算を行う前に:

    for (size_t i = 0; i < numIntegers; i++) {
        uint32_t swapped = CFSwapInt32HostToLittle(someIntegers[i]); /* or HostToBig */
        CC_SHA1_Update(&ctx, &swapped, sizeof(swapped));
    }
64

メッセージダイジェストライブラリ(nv-ios-digest)を使用した別のソリューション:

(1)文字列

// Create an SHA1 instance, update it with a string and do final.
SHA1 sha1 = [SHA1 sha1WithString:@"Hello"];

// Get the pointer of the internal buffer that holds the message digest value.
// The life of the internal buffer ends when the SHA1 instance is discarded.
// Copy the buffer as necessary. The size of the buffer can be obtained by
// 'bufferSize' method.
unsigned char *digestAsBytes = [sha1 buffer];

// Get the string expression of the message digest value.
NSString *digestAsString = [sha1 description];

(2)数字

// Create an SHA1 instance.
SHA1 sha1 = [[SHA1 alloc] init];

// Update the SHA1 instance with numbers.
// (Sorry, the current implementation is endianness-dependent.)
[sha1 updateWithShort:(short)1];
[sha1 updateWithInt:(int)2];
[sha1 updateWithLong:(long)3];
[sha1 updateWithLongLong:(long long)4];
[sha1 updateWithFloat:(float)5];
[sha1 updateWithDouble:(double)6];

// Do final. 'final' method returns the pointer of the internal buffer
// that holds the message digest value. 'buffer' method returns the same.
// The life of the internal buffer ends when the SHA1 instance is discarded.
// Copy the buffer as necessary. The size of the buffer can be obtained by
// 'bufferSize' method.
unsigned char *digestAsBytes = [sha1 final];

// Get the string expression of the message digest value.
NSString *digestAsString = [sha1 description];

メッセージダイジェストライブラリは、MD5、SHA-1、SHA-224、SHA-256、SHA-384、SHA-512をサポートしています。

[Blog]メッセージダイジェスト(MD5、SHA1など)とiOS専用クラス
http://darutk-oboegaki.blogspot.jp/2013/04/message-digests-md5-sha1-etc-on-ios.html

[ライブラリ]nv-ios-digest
https://github.com/TakahikoKawasaki/nv-ios-digest

4

SHA1には実際にはObjective-Cが付属していません。パブリックドメインでライセンスされているhashdeepおよび友人のためのCソースコードを使用できます(これは米国政府の従業員によって作成されたため): http://md5deep.sourceforge .net /

2
Billy ONeal