网络安全导论 实验14A 百万富翁协议与区块链仿真_第1页
网络安全导论 实验14A 百万富翁协议与区块链仿真_第2页
网络安全导论 实验14A 百万富翁协议与区块链仿真_第3页
网络安全导论 实验14A 百万富翁协议与区块链仿真_第4页
网络安全导论 实验14A 百万富翁协议与区块链仿真_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

实验14A百万富翁协议与区块链仿真一、实验目的编程实现百万富翁协议,深化对安全多方计算的理解。编程实现Merkle树,并计算出Merkle树的TreeRoot。深化对区块链和智能合约的理解。二、实验准备1、通过抓包,可以进行网络故障分析、流量监控、隐私盗取等操作,相关的抓包工具有很多,主要有Fiddler、Wireshark、Charles等。2、区块链中的交易是以Merkle树的形式组织在一个个区块中的,Merkle树是通过递归哈希节点对来构造的,直到只有一个哈希。这个最终地hash称为Merkle根,Merkle树可以仅用log2(N)的时间复杂度检查任何一个交易是否包含在树中。三、实验内容1、参考本章百万富翁协议,把下述python代码改成java代码importmathimportrandom#获取小于等于指定数的素数数组defget_prime_arr(max):prime_array=[]foriinrange(2,max):ifis_prime(i):prime_array.append(i)returnprime_array#判断是否为素数defis_prime(num):ifnum==1:raiseException('1既不是素数也不是合数')foriinrange(2,math.floor(math.sqrt(num))+1):ifnum%i==0:#print("当前数%s为非素数,其有因子%s"%(str(num),str(i)))returnFalsereturnTrue#找出一个指定范围内与n互质的整数edeffind_pub_key(n,max_num):whileTrue:#这里是随机获取保证随机性e=random.randint(1,max_num)ifgcd(e,n)==1:breakreturne#求两个数的最大公约数defgcd(a,b):ifb==0:returnaelse:returngcd(b,a%b)#根据e*dmods=1,找出ddeffind_pri_key(e,s):fordinrange(100000000):#随机太难找,就按顺序找到d,range里的数字随意x=(e*d)%sifx==1:returnd#生成公钥和私钥defbuild_key():prime_arr=get_prime_arr(100)p=random.choice(prime_arr)#保证p和q不为同一个数whileTrue:q=random.choice(prime_arr)ifp!=q:breakprint("随机生成两个素数p和q.p=",p,"q=",q)n=p*qs=(p-1)*(q-1)e=find_pub_key(s,100)print("根据e和(p-1)*(q-1)互质得到:e=",e)d=find_pri_key(e,s)print("根据e*d模(p-1)*(q-1)等于1得到d=",d)print("公钥:n=",n,"e=",e)print("私钥:n=",n,"d=",d)returnn,e,d#加密defrsa_encrypt(content,ned):#密文B=明文A的e次方模n,ned为公钥#content就是明文A,ned【1】是e,ned【0】是nB=pow(content,ned[1])%ned[0]returnB#解密defrsa_decrypt(encrypt_result,ned):#明文C=密文B的d次方模n,ned为私钥匙#encrypt_result就是密文,ned【1】是d,ned【0】是nC=pow(encrypt_result,ned[1])%ned[0]returnCif__name__=='__main__':pbvk=build_key()pbk=(pbvk[0],pbvk[1])#公钥(n,e)pvk=(pbvk[0],pbvk[2])#私钥(n,d)#生成两个亿万富翁i=random.randint(1,10)j=random.randint(1,10)print("==============================================")print("Alice有i=%s亿,Bob有j=%s亿"%(i,j))x=random.randint(50,pbk[0]-1)#assert(x<N)|N=p*qprint("随机选取的大整数x:%s"%x)K=rsa_encrypt(x,pbk)print("大整数加密后得密文K:%s"%K)c=K-jprint("Alice收到数字c:%s"%c)c_list=[]forkinrange(1,11):t=rsa_decrypt(c+k,pvk)c_list.append(t)print("对c+1到c+10进行解密:%s"%c_list)#选取合适大小的p,这里根据感觉写了100以内的随机数,生成的序列的值也要求小于100#这个p是该算法的精华,在实际中选取p的策略要考虑到安全性和性能的因素d_list=[]p=random.randint(30,x)#assert(p<x)forkinrange(0,10):d_list.append(c_list[k]%p)print("p的值为:%s"%p)print("除以p后的余数为:%s"%d_list)d_list[i-1]+=1forkinrange(i,10):d_list[k]+=2print("前i-1位数字不动,第i位数字+1,后面数字+2后:%s"%d_list)print("第j个数字为:%s"%d_list[j-1])print("xmodp为:%s"%(x%p))ifd_list[j-1]==x%p:print("i>j,即Alice比Bob有钱。")ifi-j>=0:print("验证成功")else:print("代码存在错误")elifd_list[j-1]==(x%p)+1:print("i=j,即Alice和Bob一样有钱。")else:print("i<j,即Bob比Alice有钱")ifi-j<0:print("验证成功")else:print("代码存在错误")2.分析、调试下面的代码,体会区块链中每一个区块的构造方法(1)Merkle树的代码实现packagetest;importjava.security.MessageDigest;importjava.util.ArrayList;importjava.util.List;publicclassMerkle树s{//transactionListList<String>txList;//MerkleRootStringroot;/***constructor*@paramtxListtransactionList交易List*/publicMerkle树s(List<String>txList){this.txList=txList;root="";}/***executemerkle_树andsetroot.*/publicvoidmerkle_树(){List<String>tempTxList=newArrayList<String>();for(inti=0;i<this.txList.size();i++){tempTxList.add(this.txList.get(i));}List<String>newTxList=getNewTxList(tempTxList);while(newTxList.size()!=1){newTxList=getNewTxList(newTxList);}this.root=newTxList.get(0);}/***returnNodeHashList.*@paramtempTxList*@return*/privateList<String>getNewTxList(List<String>tempTxList){List<String>newTxList=newArrayList<String>();intindex=0;while(index<tempTxList.size()){//leftStringleft=tempTxList.get(index);index++;//rightStringright="";if(index!=tempTxList.size()){right=tempTxList.get(index);}//sha2hexvalueStringsha2HexValue=getSHA2HexValue(left+right);newTxList.add(sha2HexValue);index++;}returnnewTxList;}/***Returnhexstring*@paramstr*@return*/publicStringgetSHA2HexValue(Stringstr){byte[]cipher_byte;try{MessageDigestmd=MessageDigest.getInstance("SHA-256");md.update(str.getBytes());cipher_byte=md.digest();StringBuildersb=newStringBuilder(2*cipher_byte.length);for(byteb:cipher_byte){sb.append(String.format("%02x",b&0xff));}returnsb.toString();}catch(Exceptione){e.printStackTrace();}return"";}/***GetRoot*@return*/publicStringgetRoot(){returnthis.root;}}(2)将交易的数据abcde放入到List中,进行测试:packagetest;importjava.util.ArrayList;importjava.util.List;publicclassApp{publicstaticvoidmain(String[]args){List<String>tempTxList=newArrayList<String>();tempTxList.add("a");tempTxList.add("b");tempTxList.add("c");tempTxList.add("d");tempTxList.add("e");Merkle树smerkle树s=newMerkle树s(tempTxList);merkle树s.merkle_树();System.out.println("root:"+merkle树s.getRoot());}}四、实验报告1、通过实验回答下列问题(1)给出实验1的完成代码。packageyzj;importjava.util.*;publicclasszhenjieyu3{publicstaticList<Integer>get_prime_arr(intmax){List<Integer>primes=newLinkedList<Integer>();List<Integer>numbers=newLinkedList<Integer>();for(inti=2;i<=max;i++){numbers.add(i);}while(!numbers.isEmpty()){intfront=numbers.remove(0);primes.add(front);Iterator<Integer>itr=numbers.iterator();while(itr.hasNext()){intcurrent=itr.next();if(current%front==0){itr.remove();}}}returnprimes;}privatestaticinte;publicstaticintfind_pub_key(intn,intmax_num){while(true){Randomrand=newRandom();inte=rand.nextInt(max_num)+1;if(gcd(e,n)==1){break;}}returne;}publicstaticintgcd(inta,intb){if(b==0){returna;}else{returngcd(b,a%b);}}publicstaticintfind_pri_key(inte,ints){intd=0;for(inti=1;i<=100000000;i++){intx=(e%i)%s;if(x==1)d=i;}returnd;}publicstaticint[]build_key(){List<Integer>prime_arr=get_prime_arr(100);Randomrand=newRandom();intq=0;intp=prime_arr.get(rand.nextInt(prime_arr.size()));while(true){q=prime_arr.get(rand.nextInt(prime_arr.size()));if(p!=q)break;}System.out.println("随机生成两个素数p和q.p="+p+"q="+q);intn=p*q;ints=(p-1)*(q-1);inte=find_pub_key(s,100);System.out.println("根据e和(p-1)*(q-1)互质得到:e="+e);intd=find_pub_key(e,s);System.out.println("根据e*d模(p-1)*(q-1)等于1得到d="+d);System.out.println("公钥:n="+n+"e="+e);System.out.println("私钥:n="+n+"d="+d);int[]ned=newint[3];ned[0]=n;ned[1]=e;ned[2]=d;returnned;}publicstaticdoublersa_encrypt(intcontent,int[]ned){doubleB=Math.pow(content,ned[1])%ned[0];returnB;}publicstaticdoublersa_decrypt(doubled,int[]ned){doubleC=Math.pow(d,ned[1])%ned[0];returnC;}privatestaticvoidprintln(Stringstring){//TODOAuto-generatedmethodstub}publicstaticvoidmain(String[]args){//TODOAuto-generatedmethodstubint[]pbvk=build_key();int[]pbk={pbvk[0],pbvk[1]};int[]pvk={pbvk[0],pbvk[2]};Randomr=newRandom();inti=r.nextInt(10)+1;intj=r.nextInt(10)+1;System.out.println("==============================================");System.out.println("Alice有i="+i+"亿,Bob有j="+j+"亿");intx=r.nextInt(pbk[0]-1)+50;System.out.println("随机选取的大整数x:"+x);doubleK=rsa_encrypt(x,pbk);System.out.println("大整数加密后得密文K:"+K);doublec=K-j;System.out.println("Alice收到数字c:"+c);double[]c_list=newdouble[10];for(inti1=1;i1<=10;i1++){doublet=rsa_decrypt(c+i1,pvk);c_list[i1-1]=t;}double[]d_list=newdouble[10];intp=r.nextInt(x)+30;for(inti2=0;i2<10;i2++){d_list[i]=(c_list[i]%p);}System.out.println("p的值为:"+p);System.out.println("除以p后的余数为:"+d_list);d_list[i-1]+=1;for(inti3=0;i3<10;i3++){d_list[i3]+=2;}System.out.println("前i-1位数字不动,第i位数字+1,后面数字+2后:"+d_list);System.out.println("第j个数字为:"+d_list[j-1]);System.out.println("xmodp为:"+(x%p));if(d_list[j-1]==x%p){System.out.println("i>j,即Alice比Bob有钱。");if((i-j)>=0){System.out.println("验证成功");}else{System.out.println("代码存在错误");}}elseif(d_list[j-1]==(x%p)+1){System.out.println("i=j,即Alice和Bob一样有钱。");}else{System.out.println("i<j,即Bob比Alice有钱");if((i-j)<0){System.out.println("验证成功");}else{System.out.println("代码存在错误");}}}}(2)贴图给出实验2的测试结果。2、问答题(1)对实验2,如果再增加一个链表,把每个区块链起来,应该怎么做?在Golang中,可以通过一个array和map来实现这个结构:array存储有序的哈希(Golang中array是有序的),map存储

hask->block

对(Golang中,map是无序的)。但是在基本的原型阶段,我们只用到了array,因为现在还不需要通过哈希来获取块。为了加入一个新的块,我们必须要有一个已有的块,但是,初始状态下,我们的链是空的,一个块都没有!所以,在任何一个区块链中,都必须至少有一个块。这个块,也就是链中的第一个块,通常叫做创世块(genesisblock).让我们实现一个方法来创建创世块packagemainimport( "awesomeProject/src/core" "fmt")funcmain(){ bc:=core.NewBlockchain() bc.AddBlock("Send1BTCtoIvan") bc.AddBlock("Send2moreBTCtoIvan") for_,block:=rangebc.Blocks{ fmt.Printf("Prev.hash:%x\n",block.PrevBlockHash) fmt.Printf("Data:%s\n",block.Data) fmt.Printf("Hash:%x\n",block.Hash) fmt.

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论