高深的密码学+复杂的区块链,其实也可以通俗易懂.pdf

所需积分/C币:48 2018-03-23 09:56:07 434KB PDF

密码学,在很多人看来是极为高深、只有数学家才能玩转的技术科学,不清楚如何才能应用 于实际开发的过程中。本文将结合应用密码学比较深入的区块链,从扫盲、实战,再到实 验、提高,一层层剥开密码学的“神秘面纱”
乙方收到甲方传过来的一串信息,怎么能够确定确实是甲方而不是有人伪造呢? 我们把非对称加密反过来做就可以了,因为只有甲方自己才持有一份秘密的私钥,他拿这个 私钥对数据进行加密得到密文C=EA私(M),乙方持有甲方的公钥,解密明文P=DA公 (C),如果能够解密成功就证明信息确实是甲方所发 不过通常不需要对发送信息的整个内容都加密,那样太慢。只需要计算一个信息的唯一信息 摘要并对信息摘要加密解密即可,下面就会讲到数据摘要算法(俗称HASH算法),这也是数 宇签名的算法名称,很多时侯是一个摘要算法非对称算法,例如 SHAIRSA,SHA256RSA等。 摘要算法 俗称HASH算法,学名杂凑算汯,也就是从明文P生成较短的固定长度的杂凑值,保证不同的 输入产生的输出是唯一的(重复几峯非常非常小)。这样就可以广泛用于完整性检杳、数字签 名等场景。 常见的摘要算法有M5、 RIPEMD、SA和国密的SM3。MD5不建议使用,已经被爆。 【实战班一区块链应用】 区块链提供了通过机器算法解决参与人之间的信任问题的全新方案,其核心的核心就是在不 完全信仼的各方,通过深度使用密码学算法来保证数据的不可篡改特性。 本节结合实际区块链中的应用,让人家在了解区块链的同时,一起惊叹原来加密算法还可以 这么用。 比特币之谁能动我的钱> 比特币是公有链,账本分布在无中心的节点上,任何一个节点都可以发出一个转让比特币的 交易。那我的比特币是如何保证不被别人转走的呢 假设你拥有100比特币(好有钱哟),那么在公开账本上存有一个数据结构,即所谓的 UTXO,其主要内容有: ndex 索引 value:金额 ▲hash:一个SHA256的数据摘要 ▲ script:脚本,这个是重点要讲的 这个 script是一串可执行的二进制代码,比特币定义了一个基于堆栈的脚木执行器,可以执 行加减乘除、移位、HASH、验签等算法,类似于常见的科学计算器。岀你想花费持有的比特 币时,首先需要执行作为输入交易对应UTX0的脚本( script),称之为“解锁脚本”,只有执 行成功才能继续。 最常用的一个解锁脚本就是P2PKH脚本: oF DUP oP HASH/60 Public Kg Has>> OP EOLAL 解锁时传入签名和公钥组成完整脚本 <e Signet ue">< Public Ksv> oP DUP OP HASH260 Public ks 翻译起来就是:“公钥的HASH160等于<脚本里面的值>并且用这个公钥对HASH值验证签名能 够通过”。计算通过,才可以花费这笔资金。 因为私钥保存在你自己手上,其他人无法计算出一个满足条件的签名,从而保证了这笔资金 只有你自己可以使用。 这里除了数字签名外,还有一点体现了中本聪真的很聪明,账本上不会存储你的公钥,而是 其HASH160(双HASH,SHA256+ RIPEMD160),由于HASH是单向的,从HASH无法反向推导公钥,这 样大大减少未来量子机会带来的风险。 区块链-HASH链之如何防止篡改〉 前面讲了数字签名在比特币的用法,这里结合区块链数据结构本身讲一下HASH的用法。 个块只是组织数据的结构,这里暂不详述,关键是块甲面有个重要的参数-前一块的 HASH,这样就形成一个链式结构 我们把数据竖起来看,就像是玩积木游戏,节点你一块我一块向上罗,每一块和前一块都有 个钩子。如果这个时候有人试图篡改之前的一笔交易,势必会导致那个块的HASH变了,那为 ∫使得改过的交易被大家认可,他可以以这个被改过的块为起点,重新计算后面所有的块, 关键是还得比拼得过全世界其他的节点,目前还没人能够做到 这里就突出了HAS算法的特点: ▲数据改变一点点,HASH改变非常大 ▲无法给不同的数据计算出相同的HASH(或者说非常难)。 比特币和以太坊的公私钥一ECC算法 RSA乂慢又不安全,所以比特币和以太坊都不采用,而是使用了更安全的椭圆曲线算法 EC来做非对称加密基础算法。ECC的210位算法难度就相当于RSA2048的难度,性能则是数 量级的区别。那么椭圆算法又是何方神圣呢? 前面讲过非对称算法无非是设计一个数学难题,使得单向计算很方便,而反向计算很难,如 RSA使用因式分解的原理,两个大质数相乘很容易,但大数分解质因子很难。 椭圆算法ECC其实就是利用乘法容易,而除法难的特点,设计一个乘法:K=k*G,其中大 K是公钥,小k是私钥,G是生成点。由私钥推导公钊很容易,只需要k个G相加即可。但是从 公钥推导私钥很难,也就是无法计算公钥K除以G。 当然这个加法不能用我们日常的整数加减法,而是利用函数所定义的一个特殊椭圆曲线上 散列点的特性定义的加法。其中p是一个常数。不同p可以设计成不同的曲线,比特币使用的 p=2256-232-29-28-27-26-24-1,这个业线的名称就叫 secp256kl。这是一个非常大的数,曲线上的点是一个复杂散点,为了方便展示,这里用小 很多的17阶曲线表小加法的定义: P2 P3 加法定义就是出线上任意两个点P1和P2,必有第二个点P3,是P和P2连线的延长线与曲线相 交点的x轴映射的点,定义P1+P2=P3。通过数学算法可以证明这种点满足加法乘法交换律: ▲A+B+C=A+(B+C) ▲A*(B+C)=A*B+A*C 暂且不进行证明赘述,需要说明的是这里为了完善计算还定义了无穷远点0(相当于0),满 足:P1+0=P1。(思考一下:如果P1+P2=0,那么P1=-P2了吗?) EC加密过程 ▲K=k*G,大K是公钥,小k是私钥 ▲把明文编码成曲线上的点M; ▲生成一个随机数r ▲计算密文C=M+r*K,C2=r米G,其中大K是公钥; ▲对方收到密文后,可以计算C1-kC2=M,其中小k是私钥 ▲攻击者得到C1、C2,公钊K以及基点G,没有私钥是无法计算出M的。 l℃Cˆ算法用很短的密钥就能达到RSA2048的全强度,而且计算速度有数量级的提高,所以目 前应用很普遍,国密中的SM就是基于EC算法的。 【实验班-如何使用算法】 这些算法感觉还是挺复杂的,我们小白能用起来么? 不要只说不练,我们就实际操刀体验一下。 其实是别人把框架和算法都写好的啦,比如JAVA,在JD里面就集成了Java密码学框架 ( Java Cryptography Architecture-JCA),直接拿来用就行了,其他如C#,C+甚至 JavaScript都有类似的。 对称加密〉 把大象关进冰箱需要三步,把明文转成密文也只需要四步 ▲生成一个密钥(如果已经有密钥,这步也省了),如 SecretKey key=KeyGenerator getinstance SM4). generateKey(: ▲取一个加密器 Cipher cipher =cipher getinstance( SM4/ECB/PKCS/ ing i ▲初始化成加密模式 cipher init(Cipher ENCRYPT MODE, keyl ▲加密 bytel ciphertext =cipher, do Final(cleartext) 怎样把密文解密昵?初始化成解密模式就可以了 SM4是国密4算法,初始化的时候斜杠后面的ECB、PKCS7…是什么?那是因为SM4是分组算 法,在加密的时候会把明文先分成固定长度段,那就需要定义分组的模式和填充模式,只要 加密解密用同样的模式就行了。当然不同的分组和填充模式各自有特点,那超出本文范围 了,有兴趣的同学白学吧。 非对称加密 复习一下非对称加密和对称加密有什么区别啊?密钥分成公私钥对。 所以和对称加密区别只是: ▲在生成密钥的时候是一对,叫 Keypair。 ▲加密的时候用一个如公钥,解密用另一个 摘要算法〉 和加密提供了 Cipher帮助类一样,HASH算法Java提供了 MessageDigest帮助类,只需要调用 getInstance就可以获取个实例: MessageDigestdigest=MMessage Digest. getinstancefalgorithm 其参数是HASH算法,如SHA-256,SM3,MD5等 调用 update方法设置内容,然后调川 digest就拿到HASH了。 digest update source, getBytesdl bytel hash= digest digest( 数字签名 签名 Signature signer=Signaturegetinstance(SIGN ALGORITHMi signer. initsign(keypair getPrivateo) signerupdate(plain/; signature =signer sign(i 验签 Signature signer= Signature getInstance(SIGN ALGORITHM) signer, initverify keypair get Publico) signer, update(plain) boolean result=signer verifylsignature; 又比大象多一步 内参必读 有几个要点在实际使用过程中必须要注意 ▲JDK自带的JCE实现算法不全 这里有两个原因 (1)国家安全出口保护规定(美国) 根据美国安全出口规定,不能对某些国家出口RSA2048、AES256等以上安全算法。解决办法 是到JDK的下载站上下载 Java cryptography Extension(JCE) Unlimited strength Jurisdiction policy,解压缩到JRE的1ib/ securi ty下即可。 (2)国密和扩展算法缺失 免费提供的不能强求,不过还是有很多开源和商用的加密组件,这里推荐使用 Bouncy Castle,虽然不是最快的,但是完全开源,支持C#,C++,Java多种语言。 把 Bouncy〔 astle集成到JRE冇两种方法,种是修改JRE的java. security增加个 Provider,另一种直接在代码初始化的时侯调用 Security. addProvider加进去即可 Security. add Providen new Bouncy castleProviderd) ▲ Android使用 Bouncy Castle注意 Bouncy Castle(BC)很强大, Google的 android内核也集成了。但是,由于安全要求,这个加 密包是阉割过的,自己再集成BC又导致包冲突 解决办法是换个包名,到https://rtyley.github.io/spongycastle/可以获取。 【提高班-隐私保护】 由于区块链是在非完全信仁的一组参与人之间,通过算法解决信仁问题,之前讲述的算法保 证了数据不可篡改,只有自己才可以操作白己的数据,但是还欠缺一个很重要的课题-隐 私 隐私和不可篡改其实有些相互矛盾,要实现不可篡改,就得让其他人来验证数据,比如公有 链是仝网用户都来验证;但是隐私又想只有授权的人才可以验证,甚至希望其他人能验证但 是不知道数据,比如盲签名、同态算法等。本节讲述在非安全环境下处理安全数据的一些方 数字信封 用非对称算法可以把机密信息安全传给指定的接收人,通常我们会使用对方的公钥进行加 密,同时使用自己的私钥对数据进行签名。数字信封提供了一个更方便强大的方法,使得信 息只有特定的接收人才可以阅读。 数字信封的功能类似于普通信封,内容被包起来,上面写了接收人,只有接收人才能拆信。 制作信封方法: ▲准备一个生成器 CMSEnveloped Data Generator ed Gen =new CMSEnveloped DataGenerator ▲添加接收人: edEn. addRecipientlnfoGenerator(<婆式> 接收人可以是公钥证书、普通公钥或者密码,可以有多个。 ▲制作信封 edGe. generate<容,如感器 拆信封时,只要凭自己的公钥找到自己的收件人信息,然后用持有的私钥抽取内容即可。 组签名和环签名> 通常一个合同是以公司的名义进行签署的,例如公司A有三个合同经办人C1、C2、C3,均可 以代表公司签署合同 这里有儿个要求: ▲所签署的合同使用公司的公钥可以验证确实是公司所签署 ▲能够进一步确定合同经办人的身份; ▲经办人如离职被吊销个人证书,不影响已有业务数据 按照孙子定理,n个整数(公钥)的同余方程组是有唯一解的,那么理论上根据组员公钥集合 K1,K2 Kn}选择一组模M,可以求解x做组因子,实现组员使用自己的私钥ki和x可以 刈密文进行解密D(ki,x,C)=P。 类似的原理可以应川到数字签名,实现 ▲群组签名:机构使用群组公钥做自己的公钥,可以通过验证签名确定签名属于指定的机 构,而机构管理员可以进一步确定是那个成员签署的。 ▲环签名:对于匿名要求,可以确定签名是来臼于一个群组的成员,但是无法确定是具体哪 个成员签署的。 〈同态加密〉 私密数据的处理通常是在组内进行,但是使用区块链技术后,私密数据的处理可能会需要在 无中心的节点上,甚至是第三方的节点进行处理。这时就需要把要处理的数据在保密状态下 进行。 例如股东A有100股,卖出60股剩余10股,这是一个减法操作。如果这个过程在智能合约中, 智能合约又运行在多个非完全信任的节点上,如果需要将真实股份数量加密,则需要实现 个减法同态 C3=C1-C2,其中C1,2,3均是密文,执行减法的节点无法知道实际余额和发生额,但是股 东A可以使用自己的密钥解密D(C3)=P=P1-P2,其中P表示明文,D表小解密算法。 目前已实现的算法主要有: ▲ Paillier方案 概率公钥加密,基于复合剩余类的困难问题。满足加法和数乘同态。 ▲BGV和RLWE方案 BGV和RLⅦ都是基于Lw( Learning With errors)难题的同态算法,支持加法、乘法、减法和 移位运算的同态。源码在 github上开源-Hlib。 ▲基于其他数学难题的方案 如基于决淅问题等。

...展开详情
试读 11P 高深的密码学+复杂的区块链,其实也可以通俗易懂.pdf

评论 下载该资源后可以进行评论 1

keepmovinglife 感谢大神分享!
2018-11-23
回复
img
draak

关注 私信 TA的资源

上传资源赚积分,得勋章
    最新推荐
    高深的密码学+复杂的区块链,其实也可以通俗易懂.pdf 48积分/C币 立即下载
    1/11
    高深的密码学+复杂的区块链,其实也可以通俗易懂.pdf第1页
    高深的密码学+复杂的区块链,其实也可以通俗易懂.pdf第2页
    高深的密码学+复杂的区块链,其实也可以通俗易懂.pdf第3页
    高深的密码学+复杂的区块链,其实也可以通俗易懂.pdf第4页

    试读已结束,剩余7页未读...

    48积分/C币 立即下载 >