椭圆曲线

Build Status Language Platform Carthage Compatible

一个用 Swift 4 编写的椭圆曲线库

警告:该库最初是为了学习目的而创建的。它不适合在生产环境中使用。请使用 libsecp256k1 代替。

特性

创建您自己的椭圆曲线!😃

该库为您轻松创建椭圆曲线提供了必要的框架。

该库包含几个 SEC-2 曲线,其中最受欢迎的是 secp256k1。 在曲线的基础上,还包含一个通用的 ECDSA 结构体,用于签名和验证。

面向协议的架构

所有协议都是通用的,这意味着它们都不与特定的曲线或特定的 UInt 族成员绑定。 可以非常直接地创建一个具有特定素数的有限域,或者创建一个具有双精度或 Float80 精度的特定椭圆曲线。 请参阅 Playground 获取演示。

用于创建椭圆曲线密码学的顶层协议是 EllipticCurveOverFiniteField。 它由两个基本协议构成:FiniteFieldIntegerEllipticCurve,前者基于 FiniteField。 协议继承关系图如下:

                                                                    
 +--------------------------+                                       
 |                          |                                       
 |        FiniteField       |-----+                                 
 |                          |     |                                 
 +-------------|------------+     |Conformance                      
               |                  |                                 
               |Conformance       |                                 
               |                  |                                 
 +-------------v------------+     |    +---------------------------+
 |                          |     |    |                           |
 |    FiniteFieldInteger    |     |    |        EllipticCurve      |
 |                          |     |    |                           |
 +-------------|------------+     |    +-------------|-------------+
               |                  |                  |              
               |                  |                  |              
 As Coordinates|  +------------------------------+   |Conformance   
               |  |                              |   |              
               +--- EllipticCurveOverFiniteField <---+              
                  |                              |                  
                  +---------------|--------------+                  
                                  |                                 
                                  |As T                             
                                  |                                 
                  +---------------|--------------+                  
                  |                              |                  
                  |           ECDSA<T>           |                  
                  |                              |                  
                  +------------------------------+                                              

FiniteField

FiniteField 是基础协议。 它定义了几个基本属性,例如 ZeroOneCharacteristic 等。 它不打算直接使用,但您可以使用它来创建有限域。

FiniteFieldInteger

FiniteFieldInteger 定义了基本框架,并为任何有限域整数提供了大多数默认实现。 示例

let p: UInt8 = 223

struct MyFFInt: FiniteFieldInteger {
    static var Characteristic = p

    var value: UInt8

    init() {
        value = 0
    }
}

let a: MyFFInt = 1
let b: MyFFInt = 500
print(a + b)

这将创建一个 F_223 的有限域整数,然后您可以在其上使用基本的 +, -, *, / 运算。

椭圆曲线

EllipticCurve 也是通用的。 您可以在实数域上创建一个椭圆曲线,如下所示

struct MyECPoint: EllipticCurve {
    static var a: Double = -1
    static var b: Double = 1

    var x: Double
    var y: Double?

    init() {
        x = 0
    }
}

let p: MyECPoint = MyECPoint(x: 1, y: 1)
print(p.description)

EllipticCurveOverFiniteField

如果您想创建自己的 ECC,这是要使用的顶层协议

let P: UInt8 = 223

struct FFInt223: FiniteFieldInteger {
    static var Characteristic: UInt8 = P
    var value: UInt8

    init() {
        value = 0
    }
}

struct MyECFF: EllipticCurveOverFiniteField {

    static var Order: UInt8 = 212

    static var a: FFInt223 = 2
    static var b: FFInt223 = 7

    var x: FFInt223
    var y: FFInt223?

    static var Generator: MyECFF = MyECFF(x: 16, y: 11)

    init() {
        x = 0
    }
}

要求

安装

Carthage

目前,仅测试了 Carthage 包安装。

Swift Package Manager

dependencies: [
    .package(url: "https://github.com/hyugit/EllipticCurve.git", from: "0.3.0")
]

沟通

如果您有错误报告或功能请求,请在此处在 GitHub 上提出问题。 欢迎任何贡献。 😃

许可证

EllipticCurve 在 MIT 许可证下发布。 有关详细信息,请参见 LICENSE