2024蓝桥杯CTF writeUP--缺失的数据

压缩包的内容

里面有secret.txt文件,用ARCHPR工具套上字典,爆破压缩包密码。密码为pavilion 

解压得到原图,并且有了加密后的图片,根据代码里的key和参数直接运行脚本解密水印图片:

 import cv2
import numpy as np
import pywt


class WaterMarkDWT:
    def __init__(self, origin: str, watermark: str, key: int, weight: list):
        self.key = key
        self.img = cv2.imread(origin)
        self.mark = cv2.imread(watermark)
        self.coef = weight

    def arnold(self, img):
        r, c = img.shape
        p = np.zeros((r, c), np.uint8)

        a, b = 1, 1
        for k in range(self.key):
            for i in range(r):
                for j in range(c):
                    x = (i + b * j) % r
                    y = (a * i + (a * b + 1) * j) % c
                    p[x, y] = img[i, j]
        return p

    def deArnold(self, img):
        r, c = img.shape
        p = np.zeros((r, c), np.uint8)

        a, b = 1, 1
        for k in range(self.key):
            for i in range(r):
                for j in range(c):
                    x = ((a * b + 1) * i - b * j) % r
                    y = (-a * i + j) % c
                    p[x, y] = img[i, j]
        return p

    def get(self, size: tuple = (1200, 1200), flag: int = None):
        img = cv2.resize(self.img, size)

        img1 = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
        img2 = cv2.cvtColor(self.mark, cv2.COLOR_RGB2GRAY)

        c = pywt.wavedec2(img2, 'db2', level=3)
        [cl, (cH3, cV3, cD3), (cH2, cV2, cD2), (cH1, cV1, cD1)] = c

        d = pywt.wavedec2(img1, 'db2', level=3)
        [dl, (dH3, dV3, dD3), (dH2, dV2, dD2), (dH1, dV1, dD1)] = d

        a1, a2, a3, a4 = self.coef

        ca1 = (cl - dl) * a1
        ch1 = (cH3 - dH3) * a2
        cv1 = (cV3 - dV3) * a3
        cd1 = (cD3 - dD3) * a4

        # Ensure all coefficients have the same shape
        ca1 = cv2.resize(ca1, (cD3.shape[1], cD3.shape[0]))

        waterImg = pywt.waverec2([ca1, (ch1, cv1, cd1)], 'db2')
        waterImg = np.array(waterImg, np.uint8)

        waterImg = self.deArnold(waterImg)

        kernel = np.ones((3, 3), np.uint8)
        if flag == 0:
            waterImg = cv2.erode(waterImg, kernel)
        elif flag == 1:
            waterImg = cv2.dilate(waterImg, kernel)

        return waterImg


if __name__ == '__main__':
    img = 'a.png'
    watermark = 'newImg.png'
    
    k = 20
    xs = [0.2, 0.2, 0.5, 0.4]
    
    W1 = WaterMarkDWT(img, watermark, k, xs)
    extracted_watermark = W1.get()
    cv2.imwrite('提取出的水印.png', extracted_watermark)

 

相关推荐

  1. 2022数位排序

    2024-05-12 12:04:05       41 阅读
  2. 2023年-平方差(数学

    2024-05-12 12:04:05       36 阅读
  3. ---奇怪数列

    2024-05-12 12:04:05       33 阅读
  4. 数论总结

    2024-05-12 12:04:05       17 阅读
  5. 2024每日一题(数学期望)

    2024-05-12 12:04:05       14 阅读
  6. 2023年-阶乘和(数学推理,C++)

    2024-05-12 12:04:05       17 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-05-12 12:04:05       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-05-12 12:04:05       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-05-12 12:04:05       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-05-12 12:04:05       18 阅读

热门阅读

  1. Sass详解

    2024-05-12 12:04:05       8 阅读
  2. React 学习-9-数据,绑定+refs

    2024-05-12 12:04:05       8 阅读
  3. Vue11 Vue3完结撒花

    2024-05-12 12:04:05       8 阅读
  4. AIGC全面介绍:探索人工智能通用计算的未来

    2024-05-12 12:04:05       10 阅读
  5. 顺序表和链表

    2024-05-12 12:04:05       11 阅读
  6. 巩固学习5

    2024-05-12 12:04:05       9 阅读
  7. 写SQL的心得

    2024-05-12 12:04:05       7 阅读
  8. 相机3:曝光三要素之光圈与快门

    2024-05-12 12:04:05       7 阅读
  9. 一次基类类型对象无法被传递问题的分析

    2024-05-12 12:04:05       8 阅读
  10. 函数指针和指针函数的区别

    2024-05-12 12:04:05       12 阅读