没有HMAC的Swift SHA1功能

时间:2016-03-20 00:06:35

标签: javascript swift sha1 commoncrypto

我试图让SHA1在swift中工作。 不使用CommonCrypto,因为它在swift中不是默认值。

请参阅https://gist.github.com/wdg/f7c8c4088030c59f0f45(因为发布的内容有点大)

如果我在Xcode中运行测试用例:

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

它将失败,并返回2d891cc96e32c32e8d26704d101208b954f435a5

我得到哈希:

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

我认为问题是在javascript文件中他们使用>>>而我不知道这个运算符是什么。 所以我使用了>>

我希望有人可以提供帮助。

提前致谢

2 个答案:

答案 0 :(得分:1)

使用Common Crypto有以下几个原因:1。它是正确的。 2.通过FIPS 140-2认证。 3.它比基于代码的Swift实现快1000多倍。

注意:Common Crypto使用硬件加密引擎。

只需使用include:

添加桥接标头
#import <CommonCrypto/CommonCrypto.h>

SHA256的示例代码(不再使用SHA1):

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;
}

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;
}

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
}

答案 1 :(得分:0)

我有一个解决方案,旋转功能有问题。

我已将旋转功能更改为

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

现在可行。