内容简介:ECC椭圆曲线详解前言ECC英文全称"Ellipse Curve Cryptography",与传统的基于大质数因子分解困难性的加密方法不同,ECC通过椭圆曲线方程式的性质产生密钥

ECC椭圆曲线详解

前言

ECC英文全称"Ellipse Curve Cryptography",与传统的基于大质数因子分解困难性的加密方法不同,ECC通过椭圆曲线方程式的性质产生密钥

ECC164位的密钥产生一个安全级,相当于RSA 1024位密钥提供的保密强度,而且计算量较小,处理速度更快,存储空间和传输带宽占用较少。目前我国居民二代身份证正在使用 256 位的椭圆曲线密码,虚拟货币比特币也选择ECC作为加密算法。

加密

基于这个秘密值,用来对Alice和Bob之间的报文进行加密的实际方法是适应以前的,最初是在其他组中描述使用的离散对数密码系统。这些系统包括:

Diffie-Hellman—ECDH

MQV—ECMQV

ElGamal discrete log cryptosystem—ECElGamal

数字签名算法—ECDSA

对于ECC系统来说,完成运行系统所必须的群操作比同样大小的因数分解系统或模整数离散对数系统要慢。不过,ECC系统的拥护者相信ECDLP问题比DLP或因数分解问题要难的多,并且因此使用ECC能用小的多的密钥长度来提供同等的安全,在这方面来说它确实比例如RSA之类的更快。到目前为止已经公布的结果趋于支持这个结论,不过一些专家表示怀疑。

ECC被广泛认为是在给定密钥长度的情况下,最强大的非对称算法,因此在对带宽要求十分紧的连接中会十分有用。

优点

安全性高

有研究表示160位的椭圆密钥与1024位的RSA密钥安全性相同。

处理速度快

  • 在私钥的加密解密速度上,ecc算法比RSA、DSA速度更快。

  • 存储空间占用小。

  • 带宽要求低。

以上为ECC椭圆曲线算法需要了解的基本知识,摘自强大的百科度娘。

iOS-ECC

关于ECC,苹果支持以下算法:

PKG:
curves P-224, P-256, P-384, P-521
PKV:
curves P-224, P-256, P-384, P-521
Signature Generation:
curves P-224, P-256, P-384, P-521
using (SHA-224, SHA-256, SHA384, SHA512)
Signature Verification:
curves P-224, P-256, P-384, P-521
using (SHA-1, SHA-224, SHA-256, SHA384, SHA512)

采用的都是NIST标准和规范。但是苹果官方API仅为开发者提供了椭圆曲线P-256的256位EC密钥。由于苹果SEP硬件提供的保护机制,私钥会直接以keychain的形式截留在SEP中,不能提取,也不能从外部导入,只能通过引用使用。

ECDSA

椭圆曲线数字签名算法(ECDSA)是使用椭圆曲线密码(ECC)对数字签名算法(DSA)的模拟,下面是关于ECDSA的API调用。

1、创建ECC椭圆曲线的keychain属性,属性设置具体可以根据自己需要,获取ECC私钥。

[objc] view plain copy
[objc] view plain copy
sacObject = SecAccessControlCreateWithFlags(kCFAllocatorDefault,  kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly,  // kSecAccessControlTouchIDAny |  kSecAccessControlPrivateKeyUsage, &error);  // Create parameters dictionary for key generation.  NSDictionary *parameters = @{  (id)kSecAttrTokenID: (id)kSecAttrTokenIDSecureEnclave,  (id)kSecAttrKeyType: (id)kSecAttrKeyTypeECSECPrimeRandom,  (id)kSecAttrKeySizeInBits: @256,  (id)kSecAttrLabel: @"my-se-key",  (id)kSecPrivateKeyAttrs: @{  (id)kSecAttrAccessControl: (__bridge_transfer id)sacObject,  (id)kSecAttrIsPermanent: @YES,  }  };
[objc] view plain copy
NSError *gen_error = nil;
[objc] view plain copy
//根据参数生成私钥
[objc] view plain copy
id privateKey = CFBridgingRelease(SecKeyCreateRandomKey((__bridge CFDictionaryRef)parameters, (voidvoid *)&gen_error));

2.使用私钥提取公钥,并用于签名。

[objc] view plain copy//根据keychain的属性查找ECC私钥,并获取私钥引用。NSDictionary *params = @{(id)kSecClass: (id)kSecClassKey, (id)kSecAttrKeyType: (id)kSecAttrKeyTypeECSECPrimeRandom, (id)kSecAttrKeySizeInBits: @256, (id)kSecAttrLabel: @"my-se-key", (id)kSecReturnRef: @YES, (id)kSecUseOperationPrompt: @"Authenticate to sign data" };
[objc] view plain copy
SecKeyRef privateKey;  OSStatus status = SecItemCopyMatching((__bridge CFDictionaryRef)params, (CFTypeRef *)&privateKey);

3.签名

[objc] view plain copy
NSError *error;
NSData *dataToSign = [@"我是签名内容" dataUsingEncoding:NSUTF8StringEncoding];
NSData *signature = CFBridgingRelease(SecKeyCreateSignature(privateKey, kSecKeyAlgorithmECDSASignatureMessageX962SHA256, (CFDataRef)dataToSign, (voidvoid *)&error));

对于kSecKeyAlgorithmECDSASignatureMessageX962SHA256签名算法,官方还给了:SHA1、SHA224、SHA384、SHA512用于EC密钥摘要。可以自己需求选择签名对应的摘要算法。API的名字也很明确的给了这里执行的标准规范为X9.62。

4.验签

[objc] view plain copy//提取公钥,进行验签,验签选择的算法必须与签名时的算法一致。id publicKey = CFBridgingRelease(SecKeyCopyPublicKey((SecKeyRef)privateKey));Boolean verified = SecKeyVerifySignature((SecKeyRef)publicKey, kSecKeyAlgorithmECDSASignatureMessageX962SHA256, (CFDataRef)dataToSign, (CFDataRef)signature, (void *)&error); if (verified == 1) { message = [NSString stringWithFormat:@"signature:%@ verified:%@ error:%@", signature, @"验签成功", error]; }else{ message = [NSString stringWithFormat:@"signature:%@ verified:%@ error:%@", signature, @"验签失败", error]; }

ECIES

校验密钥是否和算法是否匹配,只有都符合条件了才能用于加密。

[objc] view plain copy
[objc] view plain copy
SecKeyAlgorithm algorithm = kSecKeyAlgorithmECIESEncryptionCofactorX963SHA256AESGCM;
BOOL canEncrypt = SecKeyIsAlgorithmSupported((SecKeyRef)publicKey, kSecKeyOperationTypeEncrypt, algorithm);加密
[objc] view plain copy
CFErrorRef error = NULL;  cipherText = (NSData*)CFBridgingRelease(      // ARC takes ownership  SecKeyCreateEncryptedData(publicKey,  algorithm,  (__bridge CFDataRef)encryptionData,  &error));

encryptionData为要加密的数据,这里提示一下:

As an additional check before encrypting, because asymmetric encryption restricts the length of the data that you can encrypt, verify that the data is short enough. For this particular algorithm, the plain text data must be 130 bytes smaller than the key’s block size, as reported by SecKeyGetBlockSize. You therefore further condition the proceedings on a length test:

NSData* plainText = ;
canEncrypt &= ([plainText length] < (SecKeyGetBlockSize(publicKey)-130));

官方API描述,明文数据要比密钥块小130个字节。

解密

[objc] view plain copy
CFErrorRef error = NULL;  clearText = (NSData*)CFBridgingRelease(       // ARC takes ownership  SecKeyCreateDecryptedData(private,  algorithm,  (__bridge CFDataRef)cipherText,  &error));

iOS - ECC椭圆曲线、ECDSA签名验签和ECIES加解密本文来源相关推荐

  1. RSACryptoServiceProvider加密解密签名验签和DESCryptoServiceProvider加解密

    RSACryptoServiceProvider加密解密签名验签和DESCryptoServiceProvider加解密 原文:RSACryptoServiceProvider加密解密签名验签和DES ...

  2. 国家医保移动支付国密算法SM2签名验签、SM4加解密DLL

    国家医保移动支付国密算法SM2签名验签.SM4加解密DLL 支持医保移动支付(国家统一版), 已知省份有广西.贵州.安徽.河北.黑龙江.湖南.吉林.江苏.四川.新疆等各地方. DLL,非.net开发, ...

  3. ECDSA数字签名算法(java实现ECDSA签名验签)

    一.ECDSA概述 椭圆曲线数字签名算法(ECDSA)是使用椭圆曲线密码(ECC)对数字签名算法(DSA)的模拟.ECDSA于1999年成为ANSI标准,并于2000年成为IEEE和NIST标准.它在 ...

  4. 图解PKCS#1——第四部分 签名验签方案

    8.1 RSASSA-PSS签名验签方案 采用EMSA-PSS编码方案 + RSASP/RSAVP签名验签 整个签名/验签流程与加解密流程非常相似. RSASSA-PSS-SIGN (K, M) (§ ...

  5. 国密SM4加解密SM2签名验签COM组件DLL

    提供给第三方软件,调用COM组件DLL方式进行实现,如delphi.PB等. 基于C#编写的COM组件DLL,可实现SM2签名验签,SM4加解密,100%适用于黑龙江省国家医保接口中进行应用. 功能包 ...

  6. Openssl ECC椭圆曲线算法 - 密钥/签名/验签/加密/解密/SM2密文 - 序列化反序列化导出导入 - C源码

    . . . . 废话不多说,本代码继承自另外一位讲解Openssl ECC椭圆曲线算法大佬的源代码:https://blog.csdn.net/scuyxi/article/details/59182 ...

  7. 【可食用】KeyTool生成KeyStore,证书、公钥、私钥文档JAVA生成,JAVA实现ECC签名验签

    KeyTool生成KeyStore,证书.公钥.私钥文档JAVA生成,JAVA实现ECC签名验签 一.首先我们可以写个工具类生成密钥对.证书.公钥.私钥文本 jksAndCerGenerator.ja ...

  8. iOS 使用 SM2 SM4 加解密,SM2 签名验签及 SM3 签名

    前言 对于开发人员,开发中加解密是经常用到的,常见的密码算法 MD5.SHA.AES.DES,RSA 等等,这些无一例外都是国外的加密算法.基于安全和宏观战略考虑,我国从 2010 年先后推出了 SM ...

  9. 学习笔记:公钥私钥 签名验签 加密解密 CA 证书

    重点: 1.区分加密解密和签名验签(在非对称加密情景下) 加密解密:#A给B发消息# A用B的公钥进行运算(加密),B收到后用B自己的私钥进行逆向运算(解密) 签名验签:#A给B发消息# A用A自己的 ...

最新文章

  1. 进程间基于消息队列的通信_Linux 进程间的通信方式
  2. python单例_Python单例模式
  3. python和工程造价_终于懂了自学造价的方法
  4. 开源 协作工具_城镇如何使用开源工具进行协作和管理大文件
  5. java实现客服转接_Java微信公众平台开发(9) 关键字回复以及客服接口实现
  6. win10 忘记登录密码后 修改密码
  7. 【教程】Edraw Max使用教程:创建一个基本流程图
  8. 解码H264视频出现花屏或马赛克的问题
  9. 计算机维修的感想,电脑维护心得
  10. python re sub用法_python re模块常见使用方法整理
  11. C语言墓碑上的字符,古代人墓碑上的文字都有什么讲究
  12. 阿里云API网关(9)常见问题
  13. 如果你是我眼中一滴泪,那么我永远不会哭
  14. Xftp 或Xshell 要继续使用此程序,您必须应用最新的更新或使用新版本
  15. strcmp函数实现及分析
  16. 李启威:加密领域最会营销的程序员
  17. 没信号是不是就无服务器,不要没网就说wifi断流,你知道什么是断流吗?
  18. Easy Problem 9 判断质数
  19. win10能够正常访问网站、ip正常ping通,但是ping域名显示”请求找不到主机......“
  20. win2000 java,月光软件站 - 编程文档 - Java - win2000下jsp环境配置

热门文章

  1. Ubuntu20.04安装NVIDIA GTX 1070显卡驱动
  2. 腕部肌电图对肌肉疲劳回归分析的验证
  3. 人生最大的敌人是自己,超越自己才能走出困惑
  4. 【嵌入式原理与应用】南航嵌入式——实验例程
  5. 大学计算机基础知识考试题及答案,《大学计算机基础》试题题库及答案
  6. Flash Pro CS5无法跳过注册Adobe ID的问题
  7. 高低温(-180~1500℃)和真空环境下的隔热材料热物理性能快速测试方法及其测试系统初步设计
  8. 干涉法测微小量实验_干涉法测微小量(已批阅)
  9. 如何仿真晶体管跨导gm的非线性
  10. java基础知识【第22期】-- DAO模式和分层