SM2算法和RSA算法简介

  SM2算法和RSA算法都是公钥密码算法,SM2算法是一种更先进安全的算法,在安全性能、速度性能等方面都优于RSA算法,在我国商用密码体系中被用来替换RSA算法。国家密码管理局于2010年12月17日发布了SM2算法,并要求现有的基于RSA算法的电子认证系统、密钥管理系统、应用系统进升级改造,使用SM2算法。
  
  SM2算法和RSA算法简介
  
  RSA公钥加密算法是美国计算机学家Ron Rivest、Adi Shamir和Leonard Adleman于1977年提出,是最早的公钥加密算法之一,在全球范围被广泛使用。随着密码技术和计算机技术的发展,目前1024位RSA算法已经被证实存在被攻击的风险,美国NIST(国家标准技术研究院)在2010年要求全面禁用1024位RSA算法,升级到2048位RSA算法。此外,斯诺登事件爆发后,其泄露出的机密文档显示,RSA算法中可能存在NSA的预置后门,对RSA算法的安全性产生巨大影响。
  
  SM2算法由国家密码管理局于2010年12月17日发布,是我国自主设计的公钥密码算法,基于更加安全先进的椭圆曲线密码机制,在国际标准的ECC椭圆曲线密码理论基础上进行自主研发设计,具备ECC算法的性能特点并实现优化改进。
  
  SM2算法和RSA算法性能对比
  
  SM2算法和RSA算法都属于公钥加密算法,但两者分别基于不同的数学理论基础。与RSA算法相比,SM2算法具有抗攻击性强、CPU 占用少、内容使用少、网络消耗低、加密速度快等特点。
  
  (1)SM2算法与RSA算法安全性能对比
  
  RSA算法是基于大整数因子分解数学难题(IFP)设计的,其数学原理相对简单,在工程应用中比较易于实现,但它的单位安全强度相对较低。对大整数做因子分解的难度决定了RSA算法的可靠性,随着计算机运算速度的提高和分布式计算的发展,加上因子分解方法的改进,对低位数的密钥攻击已成为可能。
  
  ECC(EllipticCurves Cryptography,椭圆曲线密码编码学)是由Koblitz和Miller两人于1985年提出,其数学基础是基于椭圆曲线上离散对数计算难题(ECDLP)。ECC算法的数学理论非常深奥和复杂,在工程应用中比较难以实现,但它的单位安全强度相对较高。用国际上公认的针对ECC算法最有效的攻击方法——Pollard rho方法去破译和攻击ECC算法,它的破译或求解难度基本上是指数级的。
  
  因此,ECC算法的单位安全强度远高于RSA算法,可以用较少的计算能力提供比RSA算法更高的安全强度,而所需的密钥长度却远比RSA算法低。目前,基于ECC的SM2证书普遍采用256位密钥长度,加密强度等同于3072位RSA证书,远高于业界普遍采用的2048位RSA证书。
  
  此外,为了提高安全强度必须不断增加密钥长度,ECC算法密钥长度增长速度较慢(例如:224-256-384),而RSA算法密钥长度则需呈倍数增长(例如:1024-2048-4096)。
  
  (2)SM2算法与RSA算法速度性能对比
  
  在TLS握手过程中,更长的密钥意味着必须来回发送更多的数据以验证连接,产生更大的性能损耗和时间延迟。因此,ECC算法能够以较小的密钥和较少的数据传递建立HTTPS连接,在确保相同安全强度的前提下提升连接速度。经国外有关权威机构测试,在Apache和IIS服务器采用ECC算法,Web服务器响应时间比RSA算法快十几倍。
  
  SM2算法的优化和先进性
  
  SM2算法是我国基于ECC椭圆曲线密码理论自主研发设计,由国家密码管理局于2010年12月17日发布,在密码行业标准GMT 0003.1-2012 SM2 总则中推荐了一条256位曲线作为标准曲线,数字签名算法、密钥交换协议以及公钥加密算法都根据SM2总则选取的有限域和椭圆曲线生成密钥对;在数字签名、密钥交换方面区别于ECDSA、ECDH等国际算法,而是采取了更为安全的机制,提高了计算量和复杂性;在数字签名和验证、消息认证码的生成与验证以及随机数的生成等方面,使用国家密管理局批准的SM3密码杂凑算法和随机数生成器。SM3杂凑算法是我国自主设计的密码杂凑算法,安全性要高于MD5算法(128位)和SHA-1算法(160位),SM3算法的压缩函数与SHA-256具有相似结构,但设计更加复杂;SM4分组密码算法是我国自主设计的分组对称密码算法,与AES算法具有相同的密钥长度128位,在安全性上高于3DES算法,在实际应用中能够抵抗针对分组密码算法的各种攻击方法。
  
  SM2算法的应用推广
  
  密码算法的安全性是信息安全保障的核心,通过自主可控的国产密码技术保护重要数据的安全,是有效提升我国信息安全保障水平的重要举措。我国大力推动SM2国产密码算法替换目前所采用的RSA算法,一方面规避RSA算法存在的脆弱性和“预置后门”等安全风险,另一方面确保密码算法这一关键环节的自主可控,保障我国信息安全基础设施的安全可信。中办2018年36号文件《金融和重要领域密码应用与创新发展工作规划(2018-2022年)》以及相关法规文件均要求我国金融和重要领域密码应用采用SM2国产密码算法体系。
  
  然而,由于国密算法尚未实现广泛兼容,在主流浏览器、操作系统等终端环境中不受信任,面向互联网的产品应用中采用国产密码算法将无法满足可用性、易用性和全球通用性的需求,在实际应用中很难真正落地实施。
  
  const response = {
  
  settings: {
  
  nullValue: null,
  
  height: 400,
  
  animationDuration: 0,
  
  headerText: ‘‘,
  
  showSplashScreen: false
  
  }
  
  };
  
  const undefinedValue = response.settings?.undefinedValue ?? ‘some other default‘; // result: ‘some other default‘
  
  const nullValue = response.settings?.nullValue ?? ‘some other default‘; // result: ‘some other default‘
  
  const headerText = response.settings?.headerText ?? ‘Hello, world!‘; // result: ‘‘
  
  const animationDuration = response.settings?.animationDuration ?? 300; // result: 0
  
  const showSplashScreen = response.settings?.showSplashScreen ?? true; // result: false
  
  0 || 1 的结果是 1,因为 0 判定为 false,而 || 在前面的变量为 false 型才继续执行,而我们想要的是 “前面的对象不存在时才使用后面的值”。?? 则代表了 “前面的对象不存在” 这个含义,即便值为 0 也会认为这个值是存在的。
  
  Optional chaining 也可以用在方法上:
  
  iterator.return?.()
  
  或者试图调用某些未被实现的方法:
  
  if (myForm.checkValidity?.() === false) { // skip the test in older web browsers
  
  // form validation fails
  
  return;
  
  }
  
  比如某个旧版本浏览器不支持 myForm.checkValidity 方法,则不会报错,而是返回 false。
  
  已有实现调研
  
  Optional chaining 在 C#、Swift、CoffeeScript、Kotlin、Dart、Ruby、Groovy 已经实现了,且实现方式均有差异,可以看到每个语言在实现语法时都是有取舍的,但是大方向基本是相同的。
  
  想了解其他语言是如何实现 Optional chaining 的读者可以 点击阅读原文。
  
  这些语言实现 Optional chaining 的差异基本在 语法、支持范围、边界情况处理 等不同,所以如果你每天要在不同语言之间切换工作,看似相同的语法,但不同的细节可能把你绕晕(所以会的语言多,只会让你变成一个速记字典,满脑子都是哪些语言在哪些语法讨论倾向哪一边,选择了哪些特性这些毫无意义的结论,如果不想记这些,基础语法都没有掌握怎么好意思说会这门语言呢?所以学 JS 就够了)。
  
  语法
  
  Optional Chaining 的语法有三种使用场景:
  
  obj?.prop // optional static property access
  
  obj?.[expr] // optional dynamic property access
  
  func?.(...args) // optional function or method call
  
  也就是将 . 替换为 .?,但要注意第二行与第三行稍稍有点反直觉,比如在函数调用时,需要将 func(...args) 写为 func?.(...args)。至于为什么语法不是 func?(...args) 这种简洁一点的表达方式,在 FAQ 中有提到这个例子:
  
  obj?[expr].filter(fun):0 引擎难以判断 obj?[expr] 是 Optional Chaning,亦或这是一个普通的三元运算语句。
  
  可见,要支持 .? 这个看似简单的语法,在整个 JS 语法体系中要考虑的边界情况很多。
  
  即便是 .? 这样完整的用法,也需要注意 foo?.3:0 这种情况,不能将 foo?. 解析为 Optional chanining,而要将其解析为 foo? .3 : 0,这需要解析引擎支持 lookahead 特性。
  
  语义
  
  当 .? 前面的变量值为 null 或 undefined 时,.? 返回的结果为 undefined。
  
  a?.b // undefined if `a` is null/undefined, `a.b` otherwise.
  
  a == null ? undefined : a.b
  
  a?.[x] // undefined if `a` is null/undefined, `a[x]` otherwise.
  
  a == null ? undefined : a[x]
  
  a?.b() // undefined if `a` is null/undefined
  
  a == null ? undefined : a.b(www.chenhaopt.cn) // throws a TypeError if `a.b` is not a function
  
  // otherwise, evaluates to `a.b()`
  
  a?.() // undefined if `a` is null/undefined
  
  a == null ? undefined : a(www.yifayuLed.cn) // throws a TypeError if `a` is neither null/undefined, nor a function
  
  // invokes the function `a` otherwise
  
  短路
  
  所谓短路,就是指引入了 Optional chaining 后,某些看似一定会执行的语句在特定情况下会短路(终止执行),比如:
  
  a?.[++x] // `x` is incremented if and only if `www.sengshiyuLe.cn` is not null/undefined
  
  a == null ? undefined : a[++x]
  
  第一个例子,如果 a 时 null/undefined,就不会执行 ++x。
  
  原因是这段代码部分等价于 a == null ? undefined : a[++x],如果 a == null 为真,自然不会执行 a[++x] 这个语句。但由于 Optional chaining 使这个语句变得 “简洁了”,虽然带来了便利,但也可能导致看不清完整的执行逻辑,引发误判。
  
  所以看到 ?. 语句时,一定要反射性的思考一下,这个语句会触发 “短路”。
  
  长“短路”
  
  Optional chaining 在 JS 的规范中,作用域仅限于调用处。看下面的例子:
  
  a?.b.c(++x).d // if `a` is null/undefined, evaluates to undefined. Variable `x` is not incremented.
  
  // otherwise, evaluates to `a.b.c(++x).d`.
  
  a == null ? undefined : a.b.c(++x).d
  
  可以看到 ?. 仅在 a?. 这一层生效,而不是对后续的 b.c、c(++x).d 继续生效。而对于 C+ 与 CoffeeScript,这个语法是对后续所有 get 生效的(这里再次提醒,不要用 CoffeeScript 了,因为对于相同语法,语义都发生了变化,对你与你的同事都是巨大的理解负担,或者说没有人愿意注意,为什么代码在 CoffeeScript 里不报错,而转移到 JS 就报错了,是因为 Optional chaining 语义不一致造成的。)。
  
  正因为 Optional chaining 在 JS 语法中仅对当前位置起保护作用,因此一个调用语句中允许出现多个 .? 调用:
  
  a?.b[3].c?.(x).d
  
  a == null ? undefined : a.b[www.csyLdL.com].c == null ? undefined : a.b[3].c(x).d
  
  // (as always, except that `a` and `a.b[3].c` are evaluated only once)
  
  上面这段代码,对 a.?b、c?.(www.chaoyuL.com) 的访问与调用是安全的,而对于 b[3]、 b[3].c、c?.(x).d 的调用是不安全的。
  
  在 FAQ 环节也提到了,为什么不学习 C# 与 CoffeeScript 的语义,将安全保护从 a?. 之后就一路 “贯穿” 下去?
  
  原因是 JS 对 Optional chaining 的理解不同导致的。Optional chaining 仅仅是安全访问保护,不代表 try catch,也就是它不会捕获异常,举一个例子:
  
  a?.b()
  
  这个调用,在 a.b 不是一个函数时依然会报错,原因就是 Optional chaining 仅提供了对属性访问的安全保护,不代表对整个执行过程进行安全保护,该抛出异常还是会抛出异常,因此 Optional chaining 没有必要对后面的属性访问安全性负责。
  
  笔者认为 TC39 对这个属性的理解是合理的,否则用 try catch 就能代替 Optional chaining 了。让一个特性仅实现分内的功能,是每个前端从业者都要具备的思维能力。
  
  PS:笔者再多提一句,在任何技术设计领域,这个概念都适用。想想你设计的功能,写过的函数,如果为了图方便,扩大了其功能,终究会带来整体设计的混乱,适得其反。
  
  边界情况 - 分组
  
  我们知道,JS 代码可以通过括号的方式进行分组,分组内的代码拥有更高的执行优先级。那么在 Optional chaining 场景下考虑这个情况:
  
  (a?.b).c
  
  (a == null ? undefined : a.b).c
  
  与不带括号的进行对比:
  
  a?.b.c
  
  a == null ? undefined : a.b.c
  
  我们会发现,由于括号提高了优先级,导致在 a 为 null/undefined 时,解析出了 undefined.c 这个必定报错的荒谬语法。因此我们不要试图为 Optional chaining 进行括号分组,这样会打破逻辑顺序,使安全保护不但不生效,反而导致报错。
  
  Optional delete

原文地址:https://www.cnblogs.com/qwangxiao/p/11038238.html

时间: 2024-08-07 13:19:59

SM2算法和RSA算法简介的相关文章

使用Apriori算法和FP-growth算法进行关联分析(Python版)

===================================================================== <机器学习实战>系列博客是博主阅读<机器学习实战>这本书的笔记也包含一些其他python实现的机器学习算法 算法实现均采用python github 源码同步:https://github.com/Thinkgamer/Machine-Learning-With-Python ==================================

最短路径Dijkstra算法和Floyd算法整理、

转载自:http://www.cnblogs.com/biyeymyhjob/archive/2012/07/31/2615833.html 最短路径—Dijkstra算法和Floyd算法 Dijkstra算法 1.定义概览 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.Dijkstra算法是很有代表性的最短路径算法,在很多专业课程中都作为基本内容有详细的介绍,如数据结构,图论,运筹

Dijkstra算法和Floyed算法

写的比较好的三篇文章 Floyed算法 最短路径-Dijkstra算法和Floyed算法 最短路径之Dijkstra算法和Floyed算法 哈哈,他山之石,可以攻玉 自己有心得,慢慢补充

链接挖掘算法之PageRank算法和HITS算法

参考资料:http://blog.csdn.net/hguisu/article/details/7996185 更多数据挖掘算法:https://github.com/linyiqun/DataMiningAlgorithm 链接分析 在链接分析中有2个经典的算法,1个是PageRank算法,还有1个是HITS算法,说白了,都是做链接分析的.具体是怎么做呢,继续往下看. PageRank算法 要说到PageRank算法的作用,得先从搜索引擎开始讲起,PageRank算法的由来正式与此相关. 搜

最小生成树之 prim算法和kruskal算法(以 hdu 1863为例)

最小生成树的性质 MST性质:设G = (V,E)是连通带权图,U是V的真子集.如果(u,v)∈E,且u∈U,v∈V-U,且在所有这样的边中, (u,v)的权c[u][v]最小,那么一定存在G的一棵最小生成树,(u,v)为其中一条边. 构造最小生成树,要解决以下两个问题: (1).尽可能选取权值小的边,但不能构成回路(也就是环). (2).选取n-1条恰当的边以连接网的n个顶点. Prim算法的思想: 设G = (V,E)是连通带权图,V = {1,2,-,n}.先任选一点(一般选第一个点),首

Prim算法和Kruskal算法的正确性证明

今天学习了Prim算法和Kruskal算法,因为书中只给出了算法的实现,而没有给出关于算法正确性的证明,所以尝试着给出了自己的证明.刚才看了一下<算法>一书中的相关章节,使用了切分定理来证明这两个算法的正确性,更加简洁.优雅并且根本.相比之下,我的证明带着许多草莽气息,于此写成博客,只当是记录自己的思考 ------------------------------------------- 说明: 本文仅提供关于两个算法的正确性的证明,不涉及对算法的过程描述和实现细节 本人算法菜鸟一枚,提供的

最小生成树-Prim算法和Kruskal算法

原文链接:http://www.cnblogs.com/biyeymyhjob/archive/2012/07/30/2615542.html Prim算法 1.概览 普里姆算法(Prim算法),图论中的一种算法,可在加权连通图里搜索最小生成树.意即由此算法搜索到的边子集所构成的树中,不但包括了连通图里的所有顶点(英语:Vertex (graph theory)),且其所有边的权值之和亦为最小.该算法于1930年由捷克数学家沃伊捷赫·亚尔尼克(英语:Vojtěch Jarník)发现:并在195

时空权衡之输入增强 ----字符串匹配算法Horspool算法和Boyer-Moore算法

在算法设计的时空权衡设计技术中,对问题的部分或者全部输入做预处理,对获得的额外信息进行存储,以加速后面问题的求解的思想,我们称作输入增强. 其中字符串匹配算法Horspool算法和Boyer-Moore算法就是输入增强的例子. 首先了解一下字符串匹配的概念.我们把在一个较长的n个字符的串中,寻找一个给定的m个字符的串的问题,称为字符串匹配问题.较长的串称为text,而需要寻找的串称为pattern. 字符串匹配问题的蛮力算法很好理解:我们把pattern与text第一个字符对齐,从左往右比较pa

使用Apriori算法和FP-growth算法进行关联分析

系列文章:<机器学习>学习笔记 最近看了<机器学习实战>中的第11章(使用Apriori算法进行关联分析)和第12章(使用FP-growth算法来高效发现频繁项集).正如章节标题所示,这两章讲了无监督机器学习方法中的关联分析问题.关联分析可以用于回答"哪些商品经常被同时购买?"之类的问题.书中举了一些关联分析的例子: 通过查看哪些商品经常在一起购买,可以帮助商店了解用户的购买行为.这种从数据海洋中抽取的知识可以用于商品定价.市场促销.存活管理等环节. 在美国国会