当前位置:   article > 正文

简单了解加密算法_简单随机数加密算法

简单随机数加密算法

目录

对称加密算法

非对称加密算法

加密算法简单符号了解

尝试应用

代码

详解

自带库常用加密操作


数据加密的基本过程就是对原来为明文的文件或数据按某种算法进行处理,使其成为不可读的一段代码为“密文”,使其只能在输入相应的密钥之后才能显示出原容,通过这样的途径来达到保护数据不被非法人窃取、阅读的目的。 该过程的逆过程为解密,即将该编码信息转化为其原来数据的过程。我们所说的加密方式,都是对二进制编码的格式进行加密的,对应到Python中,则是我们的Bytes

对称加密算法

对称式加密就是加密和解密使用同一个密钥,通常称之为“Session Key ”这种加密技术在当今被广泛采用,
如美国政府所采用的DES加密标准就是一种典型的“对称式”加密法,它的Session Key长度为56bits。

对称式加密技术:主要有DES算法3DES算法Blowfish算法RC5算法AESIDEA算法
优点:速度快,对称性加密通常在消息发送方需要加密大量数据时使用,算法公开、计算量小、加密速度快、加密效率高。
缺点:在数据传送前,发送方和接收方必须商定好秘钥,然后使双方都能保存好秘钥。其次如果一方的秘钥被泄露,那么加密信息也就不安全了。另外,每对用户每次使用对称加密算法时,都需要使用其他人不知道的唯一秘钥,这会使得收、发双方所拥有的钥匙数量巨大,密钥管理成为双方的负担。

非对称加密算法

非对称式加密就是加密和解密所使用的不是同一个密钥,通常有两个密钥,称为“公钥”和“私钥”,它们两个必需配对使用,否则不能打开加密文件。这里的“公钥”是指可以对外公布的,“私钥”则不能,只能由持有人一个人知道。它的优越性就在这里,因为对称式的加密方法如果是在网络上传输加密文件就很难不把密钥告诉对方,不管用什么方法都有可能被别窃听到。而非对称式的加密方法有两个密钥,且其中的“公钥”是可以公开的,也就不怕别人知道,收件人解密时只要用自己的私钥即可以,这样就很好地避免了密钥的传输安全性问题。

非对称式加密技术:RSAElgamalRabinECC(椭圆曲线加密算法)
缺点:速度较慢
优点:安全

加密算法简单符号了解

一个加密系统S可以用数学符号描述如下:
S={P, C, K, E, D}
其中
P——明文空间,表示全体可能出现的明文集合,
C——密文空间,表示全体可能出现的密文集合,
K——密钥空间,密钥是加密算法中的可变参数,
E——加密算法,由一些公式、法则或程序构成,
D——解密算法,它是E的逆。
当给定密钥kÎK时,各符号之间有如下关系:
C = Ek(P), 对明文P加密后得到密文C
P = Dk(C) = Dk(Ek(P)), 对密文C解密后得明文P
如用E-1 表示E的逆,D-1表示D的逆,则有:
Ek = Dk-1且Dk = Ek-1
因此,加密设计主要是确定E,D,K。

                                                                                 以上内容来源于网络


尝试应用

总的来说对称与不对称就是密钥的差别,这里是根据我了解到的内容进行对称算法的简单应用,尝试自己写了个加密字符算法,依据上一篇博客的内容进行再创造,把图片字符进行加密,简单明了不堪一击的加密,与真正的加密算法连皮毛都算不上。

第一个为原文(YuanW.txt)也就是明文(MingW.txt),第二个为根据密文解密出来的明文(MingW.txt),第三个为密文(MiW.txt

代码

  1. import base64,os,cv2
  2. def img_str(img_path,K):
  3. """
  4. 返回图片字符密文
  5. """
  6. with open(img_path, 'rb') as f:
  7. base64_data = base64.b64encode(f.read())
  8. s = base64_data.decode()
  9. with open('YuanW.txt', 'w') as f:
  10. #写入图片字符原文
  11. f.write(s)
  12. s=Ek(s,K)
  13. return s
  14. def str_img(imaStr,img_name):
  15. """
  16. 将图片字符转为图片
  17. """
  18. imadata = base64.b64decode(imaStr)#解码
  19. with open(img_name, 'wb') as f:
  20. f.write(imadata)
  21. """
  22. S={P, C, K, E, D}
  23. 其中
  24. P——明文空间,表示全体可能出现的明文集合,
  25. C——密文空间,表示全体可能出现的密文集合,
  26. K——密钥空间,密钥是加密算法中的可变参数,
  27. E——加密算法,由一些公式、法则或程序构成,
  28. D——解密算法,它是E的逆。
  29. """
  30. def Ek(strs,K):
  31. """
  32. 对每个字符加密
  33. 加密算法:f(x)=x-1-k
  34. """
  35. new_strs=''
  36. for i in strs:
  37. i=(ord(i)-1)-K
  38. new_strs+=chr(int(i))
  39. return new_strs
  40. def Dk(strs,k):
  41. """
  42. 对每个字符加密
  43. 加密算法:f(x)=x+1+k
  44. """
  45. new_strs=''
  46. for i in strs:
  47. i=(ord(i)+1)+k
  48. new_strs+=chr(i)
  49. return new_strs
  50. #密钥 K
  51. K=2
  52. img_path='2.jpg'
  53. C=img_str(img_path,K)
  54. #尝试对密文进行转图片,基本上是不可行的,转不出来
  55. try:
  56. str_img(C,'cxk.jpg')
  57. except Exception:
  58. print('转化失败,字符不是图片所转')
  59. #将密文转明文再转图片
  60. P=Dk(C,K)
  61. str_img(P,'cxk2.jpg')
  62. #写入密文
  63. with open('MiW.txt', 'w') as f:
  64. f.write(C)
  65. #写入明文
  66. with open('MingW.txt', 'w') as f:
  67. f.write(P)
  68. print('ok')

详解

这里我简单的设计的一个加密函数 f(x)=x-1-kx则为每个字符的ASCLL码,将该码进行加减操作后转为字符返回密文,后续将密文写入数据库,需要时提取出来根据DK解密函数进行解密操作,K值是一个粗暴可以更改的密钥参数,不过加密解密都是Bytes的,而我这里只是简单的字符类型,太low了,不过用来玩一下还是可行的。

自带库常用加密操作

  • Python3.x开始去掉了md5和sha模块,仅剩下hashlib和hmac模块;
  • Python3.6增加了一个新的可以产生用于密钥管理的安全随机数的模块:secrets。

我们就用hashlib试试。MD5不可逆,所以应该算不上加密算法,不过发现好像MD5加密简单的字符使用网上的解密网站都能解出来,应该是暴力破解吧。

  1. import hashlib
  2. # 该库可以创建的加密算法有:md5, sha1, sha224, sha256, sha384, sha512
  3. # hash.hexdigest() 返回传递给update()函数的所有数据的摘要信息--十六进制格式的字符串
  4. # hexdigest()方法返回的结果是一个16进制格式的字符串,字符串中每个元素是一个16进制数字,
  5. # 我们知道每个16进制数字占4bits,MD5算法获取的数据摘要长度是128bits,因此最后得到的字符串长度是128/4=32。
  6. #MD5信息摘要算法(英语:MD5 Message-Digest Algorithm)
  7. #一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value)
  8. #用于确保信息传输完整一致。
  9. #该加密算法不可逆,只有输入原文再进行加密比对,并且一个字符改变整个散列值大不相同
  10. #具体用法:密码比对,客户端传入客户输入的密码产生的散列值与服务器比对
  11. # 待加密信息
  12. C = '123'
  13. X = '123'
  14. K = '124'
  15. # 创建md5对象
  16. h1 = hashlib.md5()
  17. h2 = hashlib.md5()
  18. h3 = hashlib.md5()
  19. # 此处必须声明encode
  20. # 将对象转为Bytes类型
  21. h1.update(C.encode('utf-8'))
  22. print('MD5加密前为 :' + C)
  23. print('MD5加密后为 :' + h1.hexdigest())
  24. h2.update(X.encode('utf-8'))
  25. print('MD5加密前为 :' + X)
  26. print('MD5加密后为 :' + h2.hexdigest())
  27. h3.update(K.encode('utf-8'))
  28. print('MD5加密前为 :' + K)
  29. print('MD5加密后为 :' + h3.hexdigest())
  30. #输出
  31. MD5加密前为 :123
  32. MD5加密后为 :202cb962ac59075b964b07152d234b70
  33. MD5加密前为 :123
  34. MD5加密后为 :202cb962ac59075b964b07152d234b70
  35. MD5加密前为 :124
  36. MD5加密后为 :c8ffe9a587b126f152ed3d89a146b445

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小桥流水78/article/detail/895834
推荐阅读
相关标签
  

闽ICP备14008679号