椭圆Swift
安装
将以下行添加到您的 Podfile 中
pod 'EllipticSwift', '~> 2.0'
示例
let curve = secp256k1Curve
let generatorX = BigUInt("79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798", radix: 16)!
let generatorY = BigUInt("483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8", radix: 16)!
let success = curve.testGenerator(AffineCoordinates(generatorX, generatorY))
XCTAssert(success, "Failed to init secp256k1 curve!")
// this is basically a private key - large random scalar
let randomScalar = BigUInt.randomInteger(lessThan: 256)
guard let privateKey = U256(randomScalar.serialize()) else { return XCTFail()}
// make point. Point is made from affine coordinates in normal (not Montgomery) representation
guard let G = curve.toPoint(generatorX, generatorY) else {return XCTFail()}
// calculate a public key
let publicKey = privateKey * G
XCTAssert(!publicKey.isInfinity)
// also try to multiply by group order
let groupOrder = curve.order
let expectInfinity = groupOrder * G
XCTAssert(expectInfinity.isInfinity)
限制
- 点乘法还不是常量类型
- 协议相当低效,全局清理将会发生
- 尚未支持配对
- U512 类型没有使用 polyfill
- 在 iOS 上不支持 Montgomery(应该支持,但未测试)
- 目前只支持 Weierstrass 曲线