Swift 没有 HMAC 的 SHA1 函数
Swift SHA1 function without HMAC
我尝试让 SHA1 在 swift 中工作。
不使用 CommonCrypto 因为它在 swift.
中不是默认的
请看https://gist.github.com/wdg/f7c8c4088030c59f0f45(因为post有点大)
如果我运行一个测试用例在Xcode:
func test_sha1() {
XCTAssertEqual(sha1("test"), "a94a8fe5ccb19ba61c4c0873d391e987982fbbd3")
}
会失败,return 2d891cc96e32c32e8d26704d101208b954f435a5
我得到了哈希:
$ php -r "echo sha1('test');echo(PHP_EOL);"
a94a8fe5ccb19ba61c4c0873d391e987982fbbd3
我认为问题是在 javascript 文件中他们使用 >>>
而我不知道这个运算符是什么。
所以我用了 >>
.
希望有人能帮上忙
提前致谢
出于以下几个原因使用 Common Crypto:1. 它是正确的。 2. 通过 FIPS 140-2 认证。 3. 它比基于代码的 Swift 实现快 1000 多倍。
注意:Common Crypto使用硬件加密引擎。
只需添加一个带有包含的桥接头:
#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
}
我有解决办法,旋转功能有问题。
我已经将旋转功能更改为
func rotate(n: Int, _ s: Int) -> Int {
return ((n << s) & 0xFFFFFFFF) | (n >> (32 - s))
}
现在可以使用了。
我尝试让 SHA1 在 swift 中工作。 不使用 CommonCrypto 因为它在 swift.
中不是默认的请看https://gist.github.com/wdg/f7c8c4088030c59f0f45(因为post有点大)
如果我运行一个测试用例在Xcode:
func test_sha1() {
XCTAssertEqual(sha1("test"), "a94a8fe5ccb19ba61c4c0873d391e987982fbbd3")
}
会失败,return 2d891cc96e32c32e8d26704d101208b954f435a5
我得到了哈希:
$ php -r "echo sha1('test');echo(PHP_EOL);"
a94a8fe5ccb19ba61c4c0873d391e987982fbbd3
我认为问题是在 javascript 文件中他们使用 >>>
而我不知道这个运算符是什么。
所以我用了 >>
.
希望有人能帮上忙
提前致谢
出于以下几个原因使用 Common Crypto:1. 它是正确的。 2. 通过 FIPS 140-2 认证。 3. 它比基于代码的 Swift 实现快 1000 多倍。
注意:Common Crypto使用硬件加密引擎。
只需添加一个带有包含的桥接头:
#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
}
我有解决办法,旋转功能有问题。
我已经将旋转功能更改为
func rotate(n: Int, _ s: Int) -> Int {
return ((n << s) & 0xFFFFFFFF) | (n >> (32 - s))
}
现在可以使用了。