适用于椭圆曲线数字签名算法(ECDSA)和椭圆曲线迪菲-赫尔曼(ECDH)的 Objective-C 库。
ECDSA 允许使用私钥生成签名,使用公钥进行验证。
ECDH 允许两个身份使用各自的私钥和对方的公钥生成一个共享密钥,该密钥随后可以用于加密。
此库主要基于 easy-ecc 库(https://github.com/kmackay/easy-ecc)。
要运行示例项目,请先克隆仓库,然后在 Example 目录中运行 pod install
。
GMEllipticCurveCrypto 通过 CocoaPods 提供。要安装它,只需将以下行添加到您的 Podfile 即可
pod "GMEllipticCurveCrypto"
Ankit Thakur,[email protected]
GMEllipticCurveCrypto 在 BSD 2-条款许可证下提供。有关更多信息,请参阅 LICENSE 文件。
GMEllipticCurveCrypto *crypto = [GMEllipticCurveCrypto generateKeyPairForCurve:
GMEllipticCurveSecp192r1];
NSLog(@"Public Key: %@", crypto.publicKeyBase64);
NSLog(@"Private Key: %@", crypto.privateKeyBase64);
密钥可以用原始字节数据或作为 base64 编码字符串的形式访问和设置。
crypto.publicKeyBase64 = @"AtF8hCxh9h1zlExuOZutuw+tRzmk3zVdfA==";
NSLog(@"Public Key: base64=%@, rawBinary=%@", crypto.publicKeyBase64, crypto.publicKey);
char bytes[] = { 2, 209, 124, 132, 44, 97, 246, 29, 115, 148, 76, 110, 57, 155, 173,
187, 15, 173, 71, 57, 164, 223, 53, 93, 124 };
crypto.publicKey = [NSData dataWithBytes:bytes length:25];
NSLog(@"Public Key: base64=%@, rawBinary=%@", crypto.publicKeyBase64, crypto.publicKey);
签名操作需要与曲线长度相同的消息;因此,通常使用哈希算法来调整原始消息的长度。
使用ECDSA的签名将是曲线大小的两倍。因此,192位曲线将生成一个长度为48字节(384位)的签名。
请注意,签名每次都有意不同,因为ECDSA使用随机k值。
// The first 24 bytes of the SHA-256 hash for "Hack the Planet!"
char bytes[] = { 56, 164, 34, 250, 121, 21, 2, 18, 65, 4, 161, 90, 126, 145, 111, 204,
151, 65, 181, 4, 231, 177, 117, 154 };
NSData *messageHash = [NSData dataWithBytes:bytes length:24];
GMEllipticCurveCrypto *crypto = [GMEllipticCurveCrypto cryptoForCurve:
GMEllipticCurveSecp192r1];
crypto.privateKeyBase64 = @"ENxb+5pCLAGT88vGmE6XLQRH1e8i/0rz";
NSData *signature = [crypto signatureForHash:messageHash];
NSLog(@"Signature: %@", signature);
// messageHash and signature from above
crypto = [GMEllipticCurveCrypto cryptoForCurve:GMEllipticCurveSecp192r1];
crypto.publicKeyBase64 = @"AtF8hCxh9h1zlExuOZutuw+tRzmk3zVdfA==";;
BOOL valid = [crypto verifySignature:signature forHash:messageHash];
NSLog(@"Valid Signature: %@", (valid ? @"YES": @"NO"));
使用ECDH的共享密钥与曲线长度相同。因此,192位曲线将生成一个长度为24字节(192位)的共享密钥。
NSString *alicePublicKey = @"A9N+XWIjLCYAwa8Hb7T6Rohttqo91CF8HQ==";
NSString *alicePrivateKey = @"frs4puAKipcbevvwJb7l77xACgB/FyBv";
NSString *bobPublicKey = @"A35aoteno4wnAdJgV8AXKKl1AfPVRrSZQA==";
NSString *bobPrivateKey = @"LP83qv81MsXVyPOFV7V5jKVOoU4DKPUS";
// Alice performs...
GMEllipticCurveCrypto *alice = [GMEllipticCurveCrypto cryptoForCurve:
GMEllipticCurveSecp192r1];
alice.privateKeyBase64 = alicePrivateKey;
NSData *aliceSharedSecret = [alice sharedSecretForPublicKeyBase64:bobPublicKey];
NSLog(@"Shared Secret Alice: %@", aliceSharedSecret);
// Bob performs...
GMEllipticCurveCrypto *bob = [GMEllipticCurveCrypto cryptoForCurve:
GMEllipticCurveSecp192r1];
bob.privateKeyBase64 = bobPrivateKey;
NSData *bobSharedSecret = [bob sharedSecretForPublicKeyBase64:alicePublicKey];
NSLog(@"Shared Secret Bob: %@", bobSharedSecret);
// And now both parties have the same secret!
NSLog(@"Shared secrets equal? %d", [aliceSharedSecret isEqualToData:bobSharedSecret]);
+ (GMEllipticCurveCrypto*)cryptoForKey: (NSData*)privateOrPublicKey;
+ (GMEllipticCurveCrypto*)cryptoForKeyBase64: (NSString*)privateOrPublicKey;
将GMEllipticCurveCrypto+hash.h
类别包含在内,以便在签名和验证之前自动对数据进行哈希。使用的哈希算法的长度必须至少与曲线长度一样长。如果需要,将截断最右侧的字节。
- (NSData*)hashSHA256AndSignData: (NSData*)data;
- (BOOL)hashSHA256AndVerifySignature: (NSData*)signature forData: (NSData*)data;
- (NSData*)hashSHA384AndSignData: (NSData*)data;
- (BOOL)hashSHA384AndVerifySignature: (NSData*)signature forData: (NSData*)data;
Kenneth MacKay的easy-ecc是一个了不起的、易于使用的椭圆曲线密码学基本函数的实现,然而,使用的曲线被指定为编译时常量,因此在运行时不能更改。
此库允许同时使用任何数量不同的曲线。
当然!:-)
比特币 - 1LNdGsYtZXWeiKjGba7T997qvzrWqLXLma