加密算法调研

什么是加密

  • 加密,是以某种特殊的算法改变原有的信息数据,使得未授权的用户即使获得了已加密的信息,但因不知解密的方法,仍然无法了解信息的内容。

为什么需要加密

  • 区块链网络中,不存在监督机制,当交易和区块在网络中传播时,如何才能保证才能保证数据不被篡改?

加密类型分类

  • 对称加密

    • 定义:称作私钥加密,加密和解密使用相同的密钥,密钥:在加密的算法中,将明文转化成暗文。或者密文转化成明文的时候,需要用到的私钥。
    • 特点:算法公开、计算量小、加密速度快、加密效率高、适合加密比较大的文件;
    • 缺点:通信双方都使用密钥,安全性得不到保证,用户每次都是用该密钥,需要保证密钥的唯一性,使得双方所拥有的密钥数量很大,密钥管理麻烦,同样是只有一把密钥,暴露的可能性很大;
    • 举例:AES(wifi密码)、DES(wifi密码)、RC5(电视遥控器)
  • 非对称加密

    • 定义:非对称密钥需要的是两个不同的密钥,公有密钥和私有密钥,每个人都有这两个密钥,公开密钥是对外公开,任何人都可以获得,私有密钥是不公开,单独给指定的用户,如果用公开的密钥对文件进行加密,只有私有密钥才能够解开,如果用私有密钥对文件进行加密,那么只有相对应的公有密钥才能够解开。私有密钥可以通过一定推导公式推导出公有密钥,但是公有密钥不能推导出私有密钥
    • 特点:保密性好,消除了用户换密钥的需要。
    • 缺点:加密和解密的耗时长,不适合对文件加密,只适合对少数的数据加密;
    • 举例:使用最广泛的是RSA算法、ECC(椭圆曲线加密算法)。
  • 单项加密

    • 定义:加密的过程中不需要密钥,输入明文后系统自动经过加密算法进行加密,处理成密文,密文是无法解密的,只有重新输入明文才能解密,经过同样的加密算法进行处理,得到相同的密文并被系统重新识别后才能够真正的解密;
    • 举例:MD5加密(RSA公司发明)、SHA(美国国家安全局设计)

hash算法

  • 是一个广义的算法,也可以认为是一种思想,使用Hash算法可以提高存储空间的利用率,可以提高数据的查询效率,也可以做数字签名来保障数据传递的安全性。所以Hash算法被广泛地应用在互联网应用中。

MD5加密

  • MD5(RFC 1321)是 Rivest 于1991年对MD4的改进版本。它对输入仍以512位分组,其输出是4个32位字的级联,与 MD4 相同。MD5比MD4来得复杂,并且速度较之要慢一点,但更安全,在抗分析和抗差分方面表现更好。

  • MD5加密的特点:

    • 不可逆运算
    • 对不同的数据加密的结果是定长的32位字符(不管数据多大都一样)
    • 抗修改性:对原数据进行任何改动,哪怕只修改一个字节,所得到的 MD5 值都有很大区别
    • 强抗碰撞:想找到两个不同数据,使他们具有相同的 MD5 值,是非常困难的

SHA加密

  • 安全哈希算法(Secure Hash Algorithm),是一个密码散列函数家族,是FIPS所认证的安全散列算法。能计算出一个数字消息所对应到的,长度固定的字符串(又称消息摘要)的算法。且若输入的消息不同,它们对应到不同字符串的机率很高。SHA家族的五个算法,分别是SHA-1、SHA-224、SHA-256、SHA-384,和SHA-512,由美国国家安全局(NSA)所设计,并由美国国家标准与技术研究院(NIST)发布;是美国的政府标准。后四者有时并称为SHA-2。
  • SHA-3 第三代安全散列算法(Secure Hash Algorithm 3),之前名为Keccak算法,设计者宣称在 Intel Core 2 的CPU上面,此算法的性能是12.5cpb(每字节周期数,cycles per byte)。不过,在硬件实做上面,这个算法比起其他算法明显的快上很多。
  • SHA-3同样有SHA3-224、SHA3-256、SHA3-384,和SHA3-512,这四种格式。
  • 2005年二月,王小云、殷益群及于红波发表了对完整版SHA-1的攻击,只需少于2的69次方的计算复杂度,就能找到一组碰撞。(利用生日攻击法找到碰撞需要2的80次方的计算复杂度。)
  • 现在普遍接受的是,打破SHA-2不会像五年前那样容易.因此,在可预见的未来,SHA-2的所有变体仍然被认为是安全的.然而,由于NIST已经承诺在2012年将选择SHA-3,并且由于很多人花了相当多的时间和精力来为比赛提交和评估新的哈希函数,并且由于有一些非常好的设计在决赛入围者中,毕竟不要选择他们中的任何一个,这似乎是一个耻辱.所以NIST决定选择Keccak作为SHA-3,并推荐它作为SHA-2散列函数的替代(而不是后继).

SHA2算法的区别

  • 哈希值越大,组合越多,其安全性就越高。加密哈希算法的一个重要功能是产生独特的散列,当两个不同的值或文件可以产生相同的散列,则会创建所谓的碰撞(即两个不同的讯息对应到相同的讯息摘要),只有在不发生碰撞时,才能保证数字签名的安全性。
  • 每个哈希位有两个可能值:0和1。每一个独立的哈希值通过位的可能值的数量。对于SHA-256,有2的256次方种组合。这是一个庞大的数值。哈希值越大,碰撞的机率就越小。在技术上,每个散列算法,都会发生碰撞。因为SHA-1的大小结构都碰撞的机率比较大,所以SHA-1被认为是不安全的。
  • SHA-256和SHA-512是很新的散列函数,前者以定义一个word为32位,后者则定义一个word为64位。它们分别使用了不同的常量,然而,实际上二者结构是相同的,只在循环运行的次数上有所差异。SHA-224以及SHA-384则是前述二种散列函数的截短版,利用不同的初始值做计算。

签名和加密的区别

  • 数据加密使用的是接受方的密钥对,任何知道接受方公钥的都可以向接受方发送消息,但是只有拥有私钥的才能解密出来
  • 数据签名使用的是发送方的密钥对,任何接受方都可以用公钥解密,验证数据的正确性
  • 数据加密保证了数据接受方的数据安全性
  • 数据签名保证了数据发送方的数据安全性

交易签名算法

  • 常用的非对称加密算法为:RSA,ECC(椭圆曲线加密算法)

RSA算法

  • 由 Rivet、Shamir、Adelman 提出了 RSA 算法。RSA 就是他们三人姓氏开头字母拼在一起组成的。是一个支持变长密钥的公共密钥算法,需要加密的文件块的长度也是可变的;
  • RSA利用了单向函数正向求解很简单,反向求解很复杂的特性。也就是说,对极大整数做因数分解的难度决定了RSA算法的可靠性。理论上,只要其钥匙的长度n足够长,用RSA加密的信息实际上是不能被解破的。
  • 随着分解大整数方法的进步及完善、计算机速度的提高以及计算机网络的发展,为了保障数据的安全,RSA 的密钥需要不断增加,但是,密钥长度的增加导致了其加解密的速度大为降低,硬件实现也变得越来越难以忍受,这对使用 RSA 的应用带来了很重的负担。

ECC(Elliptic curve cryptography,缩写为ECC)算法

  • 最初由Koblitz和Miller两人于1985年提出,其数学基础是利用椭圆曲线上的有理点构成Abel加法群上椭圆离散对数的计算困难性 ECDLP 是比因子分解问题更难的问题,它是指数级的难度。

  • 一条椭圆曲线就是一组被 y2=x3+ax+b 定义的且满足 4a3+27b2!=0 的点集。 4a3+27b2!=0 这个限定条件是为了保证曲线不包含奇点(singularities). y2=x3+ax+b 这个方程称为椭圆曲线的维尔斯特拉斯标准形式(Weierstrass normal form)。

  • ECC 和 RSA 相比,在许多方面都有对绝对的优势,主要体现在以下方面:

    • 抗攻击性强
    • 内容使用少
    • 加密速度快

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-etviAg4m-1631697814015)(https://nac.kucoin.com:1009/download/attachments/63714114/311249-b1d9584b6c107576.jpg?version=1&modificationDate=1612495678620&api=v2)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8c1CwPx9-1631697814018)(https://nac.kucoin.com:1009/download/attachments/63714114/WX20210205-112633.png?version=1&modificationDate=1612495714253&api=v2)]

  • 椭圆曲线算法由于采用的椭圆曲线的不同,具有多种不同的标准:

    • NIST:典型的曲线如P-256/P-384/P-521等;
    • SECG标准,典型的如Secp256k1/Secp256r1/ secp192k1/ secp192r1等;
    • ECC25519,主要指Ed25519数字签名和Curve25519密钥协商标准等;
    • 国产密码算法,中国国家密码局制定的密码学算法标准,典型的如SM2/3/4等。

以太坊中使用的交易签名算法

  • 以太坊使用的是数字签名算法ECDSA-secp256k1。

什么是ECDSA

  • 以太坊数字签名算法使用的是椭圆曲线数字签名算法,英文简称ECDSA。其中EC是“椭圆曲线”的简称,DSA是“数字签名算法”的简称。

什么是secp256k1

  • 以太坊使用了一套叫secp256k1的参数确定了椭圆的形状。所以,以太坊的签名算法全称就是是ECDSA-secp256k1。

xuperchain使用的交易签名算法

  • 百度超级链目前系统中使用了三种不同的曲线

    • 使用Nist P256+ECDSA的默认插件
    • 使用Nist P256 + Schnorr签名的插件,可以提供更高的签名验签性能
    • 使用SM2/3/4的国密插件,符合中国国家密码局制定的密码学标准
  • Nist P256:

    • 又名secp256r1,与secp256k1的区别是椭圆曲线y2=x3+ax+b中,a和b的取值不相同
  • Schnorr签名算法:

    • Schnorr签名算法是由德国数学家、密码学家Claus Schnorr提出。
    • Schnorr与ECDSA使用同一个椭圆曲线:secp256k1 curve,升级起来的改动非常小。
    • Schnorr签名算法几乎在各个层面均优于比特币现有的签名算法ECDSA:性能,安全,体积,扩展性等方面。
    • 算法介绍
  • Schnorr Ring 签名算法

    • 环签名是一种数字签名技术,环签名的一个安全属性是无法通过计算还原出一组用户中具体使用私钥签名的用户。也就是说,使用环签名技术可以使一组用户中的某一个人对消息进行签名,而并不会泄露签名者是这组用户中的哪个人。环签名与组签名类似,但在两个关键方面有所不同:第一,单个签名具有匿名性; 第二,任何一批用户都可以作为一个组使用,无需额外设置。

比特币使用的交易签名算法

  • 比特币采用的secp256k1的椭圆曲线算法
  • 为什么比特币要选择 secp256k1 签名算法而不是其他已流行的算法呢?比特币开发者社区曾讨论过 secp256k1 是否安全。中本聪没有明确解释,只是说道”有根据的推测”。从社区的讨论中,有推测是其它的曲线,比如secp256r1中的参数是美国国安局精心挑选的,相当于安全性受到权威机构的干涉。
  • 2020 年 1 月,由比特币核心开发人员 Pieter Wuille 于去年 5 月提出的 Taproot/Schnorr 软分叉升级提案已正式作为比特币改进提案(BIPs)发布,相关提案序号为 BIP 340-342。Taproot/Schnorr 升级如果获得社区支持,将是比特币自闪电网络上线后最大的技术拓展。详细说明
  • secp256k1代码仓库

cosmosSDK使用的交易签名算法

  • ed25519采用的曲线方程为y2=x3+486662x2+x, modulo p=2255-19。
  • 私钥长度:32字节
  • 公钥长度:32字节
  • 签名长度:64字节
  • 算法

fabric使用的交易签名算法

  • fabric采用的secp256k1的椭圆曲线算法

地址生成算法

以太坊

  • 每个账户都由一对钥匙定义,一个私钥(Private Key)和一个公钥(Public Key)。 账户以地址为索引,地址由公钥衍生而来,取公钥的最后20个字节。每对私钥/地址都编码在一个钥匙文件里(Keystore)。

  • 地址的生成的流程是:私钥 -> 公钥 -> 地址。因此地址的生成需要三步:

    • 生成一个随机的私钥(32字节):随机数产生的256bit私钥示例(256bit 16进制32字节):18e14a7b6a307f426a94f8114701e7c8e774e7f9a47e2c2035db29a206321725
    • 通过私钥生成公钥(64字节):采用椭圆曲线数字签名算法ECDSA-secp256k1将私钥(32字节)映射成公钥(64字节):拿公钥(非压缩公钥)来hash,计算公钥的 Keccak-256 哈希值(32bytes):fc12ad814631ba689f7abe671016f75c54c607f082ae6b0881fac0abeda21781
    • 通过公钥得到地址(20字节):取上一步结果取后20bytes即以太坊地址:0x1016f75c54c607f082ae6b0881fac0abeda21781

比特币

  • 随机选取一个32字节的数、大小介于1 ~ 0xFFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFE BAAE DCE6 AF48 A03B BFD2 5E8C D036 4141之间,作为私钥。18E14A7B6A307F426A94F8114701E7C8E774E7F9A47E2C2035DB29A206321725
  • 使用椭圆曲线加密算法(ECDSA-secp256k1)计算私钥所对应的非压缩公钥。 (共65字节, 1字节 0x04, 32字节为x坐标,32字节为y坐标)0450863AD64A87AE8A2FE83C1AF1A8403CB53F53E486D8511DAD8A04887E5B23522CD470243453A299FA9E77237716103ABC11A1DF38855ED6F2EE187E9C582BA6
  • 计算公钥的SHA-256哈希值 600FFE422B4E00731A59557A5CCA46CC183944191006324A447BDB2D98D4B408
  • 计算上一步哈希值的RIPEMD-160哈希值 010966776006953D5567439E5E39F86A0D273BEE
  • 在上一步结果之间加入地址版本号(如比特币主网版本号"0x00")00010966776006953D5567439E5E39F86A0D273BEE
  • 计算上一步结果的SHA-256哈希值 445C7A8007A93D8733188288BB320A8FE2DEBD2AE1B47F0F50BC10BAE845C094
  • 再次计算上一步结果的SHA-256哈希值 D61967F63C7DD183914A4AE452C9F6AD5D462CE3D277798075B107615C1A8A30
  • 取上一步结果的前4个字节(8位十六进制数)D61967F6,把这4个字节加在第五步结果的后面,作为校验(这就是比特币地址的16进制形态)00010966776006953D5567439E5E39F86A0D273BEED61967F6
  • 用base58表示法变换一下地址(这就是最常见的比特币地址形态)16UwLL9Risc3QfPqBUvKofHmBQ7wMtjvM

xuperchain

  • 初始化一个P-256曲线对象
  • 随机生成一个40字节的byte数组,并用P-256加密算法生成私钥
  • 通过私钥使用ECDSA加密算法生成公钥
  • 计算公钥的SHA-256的哈希值
  • 再用上一步的哈希值计算RIPEMD-160哈希值
  • 然后在上一步计算的哈希值钱加上加密标识
  • 然后再计算两次SHA-256的哈希值
  • 取上一步结果的前4个字节(8位十六进制数),把这4个字节加在第六步结果的后面,作为校验
  • 用base58表示法变换一下地址(这就是最常见的比特币地址形态)

fabric

  • 初始化一个P-256曲线对象
  • 随机生成一个40字节的byte数组,并用P-256加密算法生成私钥
  • 将私钥存储到指定文件夹
  • 用私钥创建一个签名对象
  • 通过私钥使用ECDSA加密算法生成公钥
  • 使用CA 签名公钥生成X509证书
  • 生成tls通信相关私钥和公钥以及证书,具体流程同上

你可能感兴趣的:(区块链,加密算法,算法,区块链)