经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C++ » 查看文章
如何利用Opencv实现图像的加密解密
来源:jb51  时间:2021/10/8 13:08:37  对本文有异议

1、基础:基于异或操作实现图像加密解密

一般情况下,图像的加密和解密过程是通过按位异或运算实现的。将原始图像与密钥图像进行按位异或,可以实现加密,将加密后的图像与密钥图像再进行按位异或可以实现解密过程。

Opencv-python代码实现

  1. import cv2
  2. import numpy as np
  3.  
  4. demo = cv2.imread("E:\matlab_file\picture\picture.jpg", 0)
  5. r, c = demo.shape
  6. key = np.random.randint(0, 256, size=(r, c), dtype=np.uint8) # 生成随机的密钥图像
  7. cv2.imwrite("E:\matlab_file\picture\key.jpg", key) # 保存密匙图像
  8.  
  9. cv2.imshow("demo", demo) # 显示原始图像
  10. cv2.imshow("key", key) # 显示密钥图像
  11.  
  12. encryption = cv2.bitwise_xor(demo, key) # 加密
  13. cv2.imwrite("E:\matlab_file\picture\encryption.jpg", encryption) # 保存加密后的图像
  14. decryption = cv2.bitwise_xor(encryption, key) # 解密
  15. cv2.imwrite("E:\matlab_file\picture\decryption.jpg", decryption) # 保存解密后的图像
  16.  
  17. cv2.imshow("encryption", encryption) # 显示密文图像
  18. cv2.imshow("decryption", decryption) # 显示解密后的图像
  19.  
  20. cv2.waitKey(-1)
  21. cv2.destroyAllWindows()

效果展示:

原图:

密匙:

密匙

加密后:

加密后

解密后:

解密

2、进阶:基于混沌序列构成异或模板实现图像加密解密

混沌系统是非线性的系统,表现出非常复杂的伪随机性,符合混淆规则。它对初始条件和控制参数非常敏感,任何微小的初始偏差都会被指数式放大,符合扩散规则。同时,它又是确定性的,可由非线性系统的方程、参数和初始条件完全确定。因此,初始状态和少量参数的变化就可以产生满足密码学基本特征的混沌密码序列,将混沌理论与加密技术相结合,可以形成良好的图像加密系统。目前常用于图像加密的混沌系统有:Logistic混沌映射、Chebychev映射、分段线形混沌映射、Cubic映射、标准映射、Henon映射、Lorenz混沌映射、蔡氏混沌、Rossler混沌系统、二维Sinai映射、Chen's混沌系统等。在基于混沌的图像加密方法中,有的利用混沌系统产生伪随机序列,进行序列密码形式的加密。有些利用混沌的遍历性,对产生的伪随机序列作处理,得到像素置乱后的位置,然后对像素位置进行置乱。有些利用一些混沌计算表达式可逆的特点,将像素值代入混沌计算式以进行像素的代换和扩散。与传统加密算法相比,混沌图像加密算法密钥空间大,实现简单,加密速度快。但是,基于混沌的图像加密存在以下不足:①计算机的有限精度可能导致混沌序列的周期比较短,随机性不好。 ②现有的混沌加密技术大都基于一维或二维混沌系统,容易受到相空间重构方法攻击。 ③一些混沌加密算法采用了形式比较复杂的混沌系统,速度较慢,无法实现实时的加密。

本文使用复合混沌加密算法对图像金星加密解密,详细原理见:基于复合混沌系统的数字图像加密方法

  1. #!/usr/bin/env python
  2. # _*_ coding:utf-8 _*_
  3.  
  4. """
  5. @Author : LitraLin
  6. @File : Cryption.py
  7. @CreateTime : 2021/10/07
  8. @Description : Compound chaos Encryption and Decryption of image
  9. """
  10.  
  11. import cv2
  12. import math
  13. import numpy as np
  14.  
  15.  
  16. def int2bin8(x): # 整型转8位二进制
  17. result="";
  18. for i in range(8):
  19. y=x&(1)
  20. result+=str(y)
  21. x=x>>1
  22. return result[::-1]
  23.  
  24. def int2bin16(x): # 整型转8位二进制
  25. result="";
  26. for i in range(16):
  27. y=x&(1)
  28. result+=str(y)
  29. x=x>>1
  30. return result
  31.  
  32. def Encryption(img,j0,g0,x0,EncryptionImg):
  33. x = img.shape[0]
  34. y = img.shape[1]
  35. c = img.shape[2]
  36. g0 = int2bin16(g0)
  37. for s in range(x):
  38. for n in range(y):
  39. for z in range(c):
  40. m = int2bin8(img[s][n][z]) # 像素值转八位二进制
  41. ans=""
  42. # print("ok")
  43. for i in range(8):
  44. ri=int(g0[-1]) # 取手摇密码机最后一位ri
  45. qi=int(m[i])^ri # 与像素值异或得qi
  46. xi = 1 - math.sqrt(abs(2 * x0 - 1)) # f1(x)混沌迭代
  47. if qi==0: # 如果qi=0,则运用x0i+x1i=1;
  48. xi=1-xi;
  49. x0=xi # xi迭代
  50. t=int(g0[0])^int(g0[12])^int(g0[15]) # 本源多项式x^15+x^3+1
  51. g0=str(t)+g0[0:-1] # gi迭代
  52. ci=math.floor(xi*(2**j0))%2 # 非线性转换算子
  53. ans+=str(ci)
  54. re=int(ans,2)
  55. EncryptionImg[s][n][z]=re # 写入新图像
  56.  
  57. def Decryption(EncryptionImg, j0, g0, x0, DecryptionImg):
  58. x = EncryptionImg.shape[0]
  59. y = EncryptionImg.shape[1]
  60. c = EncryptionImg.shape[2]
  61. g0 = int2bin16(g0)
  62. for s in range(x):
  63. for n in range(y):
  64. for z in range(c):
  65. cc = int2bin8(img[s][n][z])
  66. ans = ""
  67. # print("no")
  68. for i in range(8):
  69. xi = 1 - math.sqrt(abs(2 * x0 - 1))
  70. x0 = xi
  71. ssi = math.floor(xi * (2 ** j0)) % 2
  72. qi=1-(ssi^int(cc[i]))
  73. ri = int(g0[-1])
  74. mi=ri^qi
  75. t = int(g0[0]) ^ int(g0[12]) ^ int(g0[15])
  76. g0 = str(t) + g0[0:-1]
  77. ans += str(mi)
  78. re = int(ans, 2)
  79. DecryptionImg[s][n][z] = re
  80.  
  81.  
  82. if __name__ == "__main__":
  83. img = cv2.imread(r"E:\matlab_file\picture\Correlation_matrix.png", 1) # 读取原始图像
  84.  
  85. EncryptionImg = np.zeros(img.shape, np.uint8)
  86. Encryption(img,10,30,0.123345,EncryptionImg) # 加密
  87. cv2.imwrite(r"E:\matlab_file\picture\Correlation_matrix-EncryptionImg.png",EncryptionImg) # 保存加密后的图像
  88.  
  89. img = cv2.imread(r"E:\matlab_file\picture\Correlation_matrix-EncryptionImg.png", 1) # 读取加密图像
  90. DecryptionImg = np.zeros(img.shape, np.uint8)
  91. Decryption(img, 10, 30, 0.123345, DecryptionImg) # 解密
  92. cv2.imwrite(r"E:\matlab_file\picture\Correlation_matrix-DecryptionImg.png", DecryptionImg) # 保存解密后的图像
  93.  
  94. cv2.waitKey(0)

结果展示:

原图:

原图

加密后:

加密后

解密后:

解密

总结

到此这篇关于如何利用Opencv实现图像加密解密的文章就介绍到这了,更多相关Opencv图像加密解密内容请搜索w3xue以前的文章或继续浏览下面的相关文章希望大家以后多多支持w3xue!

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号