2016-03-20 8 views
0

Ich versuche, SHA1 in Swift arbeiten. ohne CommonCrypto zu verwenden, da es in swift nicht standardmäßig ist.Swift SHA1 Funktion ohne HMAC

siehe https://gist.github.com/wdg/f7c8c4088030c59f0f45 (da es ein wenig zu groß schreiben)

wenn ich einen Testfall in Xcode laufen:

func test_sha1() { 
    XCTAssertEqual(sha1("test"), "a94a8fe5ccb19ba61c4c0873d391e987982fbbd3") 
} 

es wird scheitern, und das Rück 2d891cc96e32c32e8d26704d101208b954f435a5

ich habe der Hash mit:

$ php -r "echo sha1('test');echo(PHP_EOL);" 
a94a8fe5ccb19ba61c4c0873d391e987982fbbd3 

ich denke, die p Problem ist, dass sie in der Javascript-Datei >>> verwenden und ich weiß nicht, was dieser Operator ist. So habe ich >> verwendet.

ich hoffe, dass jemand helfen kann.

Vielen Dank im Voraus

+0

http://stackoverflow.com/questions/7718711/javascript-triple-greater-than – sschale

Antwort

0

Ich habe eine Lösung, mit der Rotationsfunktion ist etwas nicht in Ordnung.

Ich habe die Drehfunktion zu

func rotate(n: Int, _ s: Int) -> Int { 
    return ((n << s) & 0xFFFFFFFF) | (n >> (32 - s)) 
} 

geändert und jetzt funktioniert es.

1

Verwendung Gemeinsame Crypto aus mehreren Gründen: 1. Es ist richtig. 2. Es ist FIPS 140-2 zertifiziert. 3. Es ist mehr als 1000 Mal schneller als eine Code-basierte Swift-Implementierung.

Hinweis: Common Crypto verwendet die Hardware-Verschlüsselungs-Engine.

nur einen Überbrückungs Header hinzufügen, mit der folgenden:

#import <CommonCrypto/CommonCrypto.h> 

Beispielcode für SHA256 (SHA1 nicht mehr verwendet werden sollte):

func sha256(dataIn dataIn:NSData) -> NSData { 
    let digest: NSMutableData! = NSMutableData(length: Int(CC_SHA256_DIGEST_LENGTH)); 
    CC_SHA256(dataIn.bytes, CC_LONG(dataIn.length), UnsafeMutablePointer<UInt8>(digest.mutableBytes)); 
    return digest; 
} 

oder

func sha1(dataIn dataIn:NSData) -> NSData { 
    let digest: NSMutableData! = NSMutableData(length: Int(CC_SHA1_DIGEST_LENGTH)); 
    CC_SHA1(dataIn.bytes, CC_LONG(dataIn.length), UnsafeMutablePointer<UInt8>(digest.mutableBytes)); 
    return digest; 
} 

oder

func sha1(string string: String) -> [UInt8] { 
    var digest = [UInt8](count: Int(CC_SHA1_DIGEST_LENGTH), repeatedValue: 0) 
    if let data = string.dataUsingEncoding(NSUTF8StringEncoding) { 
     CC_SHA1(data.bytes, CC_LONG(data.length), &digest) 
    } 
    return digest 
} 
+0

Das Problem ist, dass ich SHA1 in einem Framework verwenden muss, und da Frameworks einen Bridging-Header nicht unterstützen, ist es nicht verwendbar . –

+0

[bugreport.apple.com] (https://idmsa.apple.com/IDMSWebAuth/login.html?appIdKey=77e2a60d4bdfa6b7311c854a56505800be3c24e3a27a670098ff61b69fc5214b&sslEnabled=true&rv=3). Es gibt Lösungen House Common Crypto in einem Framework, jeder SO. Es gibt auch eine schnelle Implementierung von SHA1 auf GitHub. Es hilft auch, in der Frage spezifischer zu sein. – zaph