TweetNacl
TweetNaCl 包装器,用 Swift 编写
要求
- iOS 8.0+ / macOS 10.10+ / tvOS 9.0+ / watchOS 2.0+
- Xcode 9.0+
- Swift 4.0+
安装
CocoaPods
CocoaPods 是 Cocoa 项目的依赖管理器。您可以使用以下命令安装它:
$ gem install cocoapods
CocoaPods 1.1+ 是构建 TweetNacl 1.0+ 所必需的。
要使用 CocoaPods 将 TweetNacl 集成到您的 Xcode 项目中,请在您的 Podfile
中指定它:
source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '10.0'
use_frameworks!
target '<Your Target Name>' do
pod 'TweetNacl', '~> 1.0.0'
end
然后,运行以下命令:
$ pod install
Carthage
Carthage 是一个去中心化的依赖管理器,它构建您的依赖关系并为您提供二进制框架。
您可以使用以下命令使用 Homebrew 安装 Carthage
$ brew update
$ brew install carthage
要使用 Carthage 在您的 Xcode 项目中集成 TweetNacl,请在您的 Cartfile
中指定它
github "bitmark-inc/tweetnacl-swiftwrap" ~> 1.0
运行 carthage update
来构建框架并将构建的 TweetNacl.framework
拖动到您的 Xcode 项目中。
Swift Package Manager
Swift Package Manager 是一个用于自动化分发 Swift 代码的工具,它是 swift
编译器的集成部分。它处于早期开发阶段,但 TweetNacl 在支持的平台上支持其使用。
一旦您设置了自己的 Swift 包,添加 TweetNacl 作为依赖关系就像将其添加到 Package.swift
的 dependencies
值一样简单。
dependencies: [
.Package(url: "https://github.com/bitmark-inc/tweetnacl-swiftwrap.git", majorVersion: 1)
]
手动集成
如果您不希望使用上述任何依赖管理器,可以手动将 TweetNacl 集成到项目中。
内嵌框架
-
打开终端,使用
cd
进入您的顶级项目目录,并运行以下命令(如果您的项目未初始化为 git 仓库)$ git init
-
通过运行以下命令将 TweetNacl 添加为 git 子模块
$ git submodule add https://github.com/bitmark-inc/tweetnacl-swiftwrap.git
-
打开新的
TweetNacl
文件夹,并将TweetNacl.xcodeproj
拖动到您应用 Xcode 项目的 Project Navigator。它应该嵌套在您的应用蓝色项目图标下。它是在所有其他 Xcode 组之上还是之下并不重要。
-
在 Project Navigator 中选择
TweetNacl.xcodeproj
并验证部署目标与您的应用目标一致。 -
然后,在 Project Navigator 中选择您的应用项目(蓝色项目图标)并导航到目标配置窗口,在边栏的 "Targets" 标题下选择应用程序目标。
-
在该窗口顶部栏中,打开 "General" 标签页。
-
在 "Embedded Binaries" 部分的
+
按钮上点击。 -
您将看到两个不同的
TweetNacl.xcodeproj
文件夹,每个文件夹内都包含两个不同版本的TweetNacl.framework
,它们都嵌套在Products
文件夹中。您选择哪个
Products
文件夹都无关紧要,但是您必须选择顶部或底部的TweetNacl.framework
。 -
选择顶部的
TweetNacl.framework
用于 iOS,选择底部的用于 OS X。您可以通过查看项目构建日志来验证您选择了哪个版本。对于
TweetNacl
的构建目标是列出的,可能是TweetNacl-iOS
、TweetNacl-macOS
、TweetNacl-tvOS
或TweetNacl-watchOS
。 -
就是这样!
TweetNacl.framework
会自动添加为目标的依赖项、链接的框架和嵌入的框架,这是在模拟器和设备上构建所需的全部。
使用方法
所有 API 函数都接受和返回 Data。
公钥认证加密 (box)
实现 curve25519-xsalsa20-poly1305。
NaclBox.keyPair()
为 box 生成一个新的随机密钥对,并将其作为具有 publicKey
和 secretKey
成员的对象返回
{
publicKey: ..., // Data with 32-byte public key
secretKey: ... // Data with 32-byte secret key
}
NaclBox.keyPair(fromSecretKey:)
返回一个与给定的秘密密钥对应的 box 密钥对。
NaclBox.box(message, nonce, theirPublicKey, mySecretKey)
使用对等的公钥、我们的私钥以及提供的用于每个独立密钥对的消息的唯一随机数,对消息进行加密和认证。
NaclBox.open(box, nonce, theirPublicKey, mySecretKey)
使用对等的公钥、我们的私钥以及提供的用于每个独立密钥对的随机数,对给定的box进行认证和解密。
返回原始消息,或者如果认证失败返回false。
NaclBox.before(theirPublicKey, mySecretKey)
返回一个预先计算的共享密钥,这个密钥可以用在NaclBox.after
和NaclBox.open.after
中。
NaclBox.after(message, nonce, sharedKey)
与NaclBox
相同,但使用通过NaclBox.before
预先计算的共享密钥。
NaclBox.open.after(box, nonce, sharedKey)
与NaclBox.open
相同,但使用通过NaclBox.before
预先计算的共享密钥。
NaclBox.publicKeyLength = 32
公钥的字节长度。
NaclBox.secretKeyLength = 32
私钥的字节长度。
NaclBox.sharedKeyLength = 32
预计算共享密钥的字节数。
NaclBox.nonceLength = 24
nonce的字节数。
NaclBox.overheadLength = 16
添加到box中相对于原始消息的overhead长度。
密钥认证加密(secretbox)
实现了xsalsa20-poly1305。
NaclSecretBox.secretBox(message, nonce, key)
使用密钥和nonce加密并认证消息。对每个使用此密钥的不同消息,nonce必须唯一。
返回加密并认证的消息。
NaclSecretBox.open(box, nonce, key)
使用密钥和nonce认证和解密给定的secret box。
返回原始消息,或者如果认证失败返回false。
NaclSecretBox.keyLength = 32
密钥的字节长度。
NaclSecretBox.nonceLength = 24
nonce的字节数。
NaclSecretBox.overheadLength = 16
与原始消息相比,添加到秘密盒中的额外长度的长度。
标量乘法
实现了e25519。
NaclScalarMult(n, p)
将整数n
与群元素p
相乘并返回结果群元素。
NaclScalarMult.base(n)
将整数n
与标准群元素相乘并返回结果群元素。
NaclScalarMult.scalarLength = 32
标量字节数长度。
NaclScalarMult.groupElementLength = 32
群元素的字节数长度。
签名
实现了ed25519。
NaclSign.keyPair()
生成新的随机密钥对用于签名,并以具有 publicKey
和 secretKey
成员的对象返回。
{
publicKey: ..., // Data with 32-byte public key
secretKey: ... // Data with 64-byte secret key
}
NaclSign.keyPair.fromSecretKey(secretKey)
返回一个签名密钥对,其公钥对应于给定的64字节的秘密关键。该秘密密钥必须由 NaclSign.KeyPair
或 NaclSign.KeyPair.fromSeed
生成。
NaclSign.keyPair.fromSeed(seed)
从32字节的种子中生成新的签名密钥对。该种子必须包含足够的熵度以确保安全。此方法不推荐用于通用用途:而是使用NaclSign.KeyPair
从随机种子生成新密钥对。
NaclSign(message, secretKey)
使用密钥对消息进行签名,并返回已签名的消息。
NaclSign.open(signedMessage, publicKey)
验证已签名的消息并返回不带签名的消息。
验证失败时返回nil
。
NaclSign.detached(message, secretKey)
使用密钥对消息进行签名,并返回签名。
NaclSign.detached.verify(message, signature, publicKey)
验证消息的签名,如果验证成功返回true
,如果失败返回false
。
NaclSign.publicKeyLength = 32
签名公钥的字节长度。
NaclSign.secretKeyLength = 64
签名密钥的字节长度。
NaclSign.seedLength = 32
NaclSign.KeyPair.keyPair(fromSeed: 字节的种子长度。
NaclSign.signatureLength = 64
字节的签名长度。
许可协议
版权所有 (c) 2014-2015 Bitmark Inc ([email protected])。
在此授予任何人免费或付费使用、复制、修改和分发本软件的权利,前提是上述版权声明和本许可声明须包含在所有副本中。
软件按“原样”提供,作者放弃与该软件相关的所有明示或暗示保证,包括所有适销性和适用性的暗示保证。在任何情况下,作者均不对任何特殊、直接、间接或后果性损害或任何损害赔偿责任承担责任,无论是否由于合同、疏忽或其他侵权行为,是否由于使用或性能该软件而产生。