python学习实例(7)

举报
兔老大 发表于 2021/04/19 23:09:30 2021/04/19
【摘要】 #=========================================================#第8章 信息安全(Information Security)的python程序#========================================================= #====================#8.3 措施和技术#...

  
  1. #=========================================================
  2. #第8章 信息安全(Information Security)的python程序
  3. #=========================================================
  4. #====================
  5. #8.3 措施和技术
  6. #====================
  7. #++++++++++++++++++++
  8. #8.3.1 密码学
  9. #++++++++++++++++++++
  10. #非对称加密
  11. #<程序:把n分解成p*q>
  12. import math
  13. n = 221
  14. m = int(math.ceil(math.sqrt(n)))
  15. flag = 0
  16. for i in range(2,m+1,1):
  17. if n % i == 0:
  18. print(i,int(n/i))
  19. flag = 1
  20. break
  21. if flag == 0:
  22. print ("Cannot find!")
  23. #<程序:RSA加密解密实现>
  24. # All the functions are written by Edwin Sha
  25. def change_number (x, b): #这个函数把一个十进制数x转换成一串二进制数
  26. if x < b: L=[x]; return(L)
  27. a=x % b; x=x//b
  28. return([a]+change_number(x,b)) #the least one goes first!
  29. def mod (a,x,b): #计算 a^x mod b
  30. L=change_number(x,2)
  31. #print("x in binary = ",L)
  32. r=a % b; final=1
  33. for i in L:
  34. if i ==1: final= (final*r) % b
  35. r = (r*r) % b
  36. return(final)
  37. def GCD(x,y): #计算 x与y的最大公约数
  38. if x>y: a=x;b=y
  39. else: a=y;b=x
  40. if a%b ==0: return(b)
  41. return(GCD(a%b,b))
  42. def Extended_Euclid(x,y,Vx,Vy): #return [a, b] s.t. ax + by = GCD(x,y)
  43. #by Edwin Sha
  44. r=x%y; z=x//y
  45. if r==0: return(y,Vy)
  46. Vx[0]=Vx[0]-z*Vy[0]
  47. Vx[1]=Vx[1]-z*Vy[1]
  48. return(Extended_Euclid(y, r, Vy, Vx))
  49. def Mod_inverse(e, n): # return x : e*x mod n = 1 by Edwin Sha
  50. Vx=[1,0]
  51. Vy=[0,1]
  52. if e>n:
  53. G,X=Extended_Euclid(e,n,Vx,Vy)
  54. d=X[0]%n
  55. else:
  56. G,X=Extended_Euclid(n,e,Vx,Vy)
  57. d=X[1]%n
  58. return(d)
  59. import random
  60. def RSA_key_generation(p,q): #p and q are primes, compute keys e and d
  61. phi=(p-1)*(q-1)
  62. e=random.randint(3,phi)
  63. if e%2==0: e+=1
  64. while(GCD(e,phi) !=1):
  65. e=random.randint(3,phi)
  66. if e%2==0: e+=1
  67. d=Mod_inverse(e,phi)
  68. if e*d % phi !=1: print("ERROR: e and d are not generated correctly")
  69. return (e,d)
  70. def RSA_test(p,q):
  71. e,d=RSA_key_generation(p,q)
  72. n=p*q
  73. print("e, d, n: ", e, d, n)
  74. M=int(input("Please enter M (<n): "));
  75. while M>=n: M=int(input("Please enter M (< n)"))
  76. C=mod(M,e,n)
  77. print("Before transmission, original M=",M," is encrypted to Cipher=",C)
  78. M1=mod(C,d,n)
  79. if M!=M1:print("!!! Error !!!")
  80. print("After transmission, Cipher",C, "is decrypted back to:",M1,"\n\n")
  81. p=19
  82. q=97
  83. RSA_test(p,q)

 

文章来源: fantianzuo.blog.csdn.net,作者:兔老大RabbitMQ,版权归原作者所有,如需转载,请联系作者。

原文链接:fantianzuo.blog.csdn.net/article/details/83025234

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。