利用Python的PIL库给照片批量加水印

出于无聊,用了半小时写(Copy)了一个给照片自动加水印的脚本。大概功能就是将特定照片在右下角添加时间、尺寸、GPS信息(无人机或者手机有)和版权信息。当然,还不够完善,有空了加上读取目录中所有JPG的功能,以及自适应字体大小的功能。

import os
from PIL import Image
from PIL.ExifTags import TAGS
from PIL import ImageFont
from PIL import ImageDraw

def get_exif_data(fname):
    """Get embedded EXIF data from image file."""
    ret = {}
    try:
        img = Image.open(fname)
        if hasattr( img, '_getexif' ):
            exifinfo = img._getexif()
            if exifinfo != None:
                for tag, value in exifinfo.items():
                    decoded = TAGS.get(tag, tag)
                    ret[decoded] = value
                    size = img.size
    except IOError:
        print('IOERROR ' + fname)
    return ret,size
def addText(fname,text):
    img = Image.open(fname)
    draw = ImageDraw.Draw(img)
    # font = ImageFont.truetype(<font-file>, <font-size>)
    font = ImageFont.truetype("Andale.ttf", 64)
    # draw.text((x, y),"Sample Text",(r,g,b))
    draw.text((img.size[0]-img.size[0]/6,img.size[1]-img.size[1]/10),text,(255,255,255),font=font)
    img.save('sample-out.jpg')
    print('Added text')

if __name__ == '__main__':
    fileName = r'/Users/li-yang/Desktop/DSC04467_1.jpg'
    copyright = 'Photo by YangLi'
    exif,size = get_exif_data(fileName)
    print(exif)
    size = str(size[0]) +'*'+ str(size[1])
    if 'DateTimeOriginal' in exif:
        time = exif['DateTimeOriginal']
    else:
        time= 'No Time Info'
    if 'Model' in exif:
        model = exif['Model']
    else:
        model = 'No Model Info'
    if 'GPSInfo' in exif:
        GPS = exif['GPSInfo']
    else:
        GPS = 'No GPS Info'
    text = time +'\n' + size +'\n' +GPS+'\n' +copyright
    addText(fileName,text)

CTF中二维码题目及答题技巧总结(二)

前言:我在CTF中二维码题目及答题技巧总结(一)中简单描述了QR Code的种类、版本、编码方式等基础知识,本文主要讲解我在CTF的QR Code类题目时用到的小技巧,纯属个人经验总结。阅读本文前需掌握Photoshop软件的基本操作、Python基础以及总结(一)中提到的QR Code基础知识。

1. Photoshop在二维码题目中的常用功能

新建参考线版面(New Guide Layout):在视图菜单中可以找到该功能,使用该功能可以快速新建制定行数列数与间距的参考线,为特定版本的QR Code生成矩阵模板。

阈值(Threshold):在图像-调整中可以找到,不过建议通过调整图层进行阈值调整操作。该功能可以快速将二维码图片进行二值化处理,即得到只有黑白两个颜色的图片,可以快速除去二维码图片中的杂色。

反相(Invert):与阈值功能使用方法相似,可以将图像中的所有颜色进行反相处理。有些题目需要对二维码部分图案进行反相处理得到可以扫描的二维码。

其他功能:各种选择工具、移动、变形、蒙版等基础功能,在此不再赘述。

2. 二维码题目总结

2.1 裁剪拼接

        裁剪拼接类题目有明显的特征,即二维码被撕碎或通过图像处理软件裁剪、部分旋转等造成无法通过二维码识别软件直接进行识别。此类题目主要考察二维码结构等基础知识和使用图像处理软件对图片进行拼接的能力。解题步骤大致为:二维码类型识别、碎片的选取及拼接。

        上图为一张二维码碎片,根据该图片基本特征可以判断其编码方式为QR Code。根据QR Code的定位图案(Finder Pattern)和对其图案(Alignment Pattern)可以初步判断这几张碎片的位置和顺序没有被打乱。因此,仅需要对其进行拼接处理。通过计数这些碎片的码元数为29*29,即版本(Version)为3。在Photoshop中新建一个正方形文件,并建立29*29的参考线面板。通过套索或其他工具将题目中的二维码碎片选取并逐一复制到新的文件。对各个图层进行变形后得到可以解码的二维码图形。操作过程如下:

2.2 污损补全

        无损补全类题目可以有多种形式,比如印有二维码的破碎的饼干、烧掉一部分的印有二维码的纸、被遮挡部分图案的二维码等。此类题目通常只无损数据区或容错区其中一部分的数据内容,正常的解题步骤为根据编码区格式信息手动去除掩码(Mask),读取二维码中每个码元的数据并根据QR Code的编码规则进行手动解码操作,得到二维码内容(推荐阅读:http://ppwwyyxx.com/2014/QR-Puzzles/)。此处仅对Photoshop在解答此类题目的技巧进行描述。由于QR Code强大的容错性,解码软件可以在部分码元破损或错误的情况下进行二维码解码,因此可以通过Photoshop的阈值,使无损部分处于黑白颜色的过渡位置,扫码软件可以在部分正确的情况下得到二维码内容。

        以上面的来自南安普顿大学主办的英国高校网络安全挑战赛的题目为例。这是一道高分题目,其考察内容为QR Code的基础结构,需要手动去除掩码并手动解码数据得到答案。但是此处利用Photoshop的技巧,补全定位图案、对齐图案等固定结构后,通过阈值功能,使图像中的红色遮挡处于黑-白的临界值,由于QR Code强大的容错性,可以在部分码元正确的情况下得到答案。过程如下:

2.3 批量解码

        此类题目会提供大量的二维码,需要通过程序批量读取信息并处理得到答案。推荐使用Python进行批量解码处理。Python环境中对QR Code解码依赖zbar、PIL(Pillow)模块。使用PIL的Image加载图片文件并使用pyzbar的decode进行解码。使用示例如下:

from pyzbar.pyzbar import decode
from PIL import Image
def QRdecode(filepath):
result = decode(Image.open(filepath))
return result[0].data
if name == “main“:
print(QRdecode(“Desktop\qr.png”))

3.总结

        二维码题目种类较多,不仅限于QR Code,也可能使用了其他编码形式。但无论哪种形式,都需要对二维码编码原理有初步了解。通常可以使用图像处理软件进行图像的修复,若掌握一些小技巧,使用出题人想不到的方式得到答案,可以实现事半功倍的效果。

        最后,给大家推荐一个手机扫码的APP:CortexScan(前同事康师傅推荐给我的),支持数十种编码方式,可以很快地识别出扭曲或低反差的各种条码。

CTF中二维码题目及答题技巧总结(一)

前言:从三四年前刚刚接触CTF(Capture The Flag,网络安全比赛的一种)第一次参加比赛,到最近的HECC(英国高校网络安全挑战赛),我在杂项类题目中遇到过很多关于二维码的题目。此类题目需要参赛人员对二维码的生成原理有深入了解,同时需要使用图像后期软件对二维码进行处理,最终得到答案。作为摄影爱好者,我对图像处理非常熟练,经常可以通过一些出题者想不到的Photoshop小技巧,很容易地得到二维码题目的答案。由于二维码中QR Code最为常见,因此本文针对二维码仅讨论QR Code。由于基础知识和题目整理两部分内容均有较大篇幅,因此本文分一、二两部分进行更新。第一部分为QR Code基础知识,第二部分为QR Code题目及答题技巧。

1. 什么是QR Code

        解决CTF中的QR Code问题,首先需要对QR Code的种类、基本结构以及生成算法有一定了解。

       QR Code(Quick Response Code)是二维码的一种编码方式,通过与背景颜色存在对比的色块表示二进制数据0和1,通过色块组成的二维矩阵表示数字、英文、汉字、日文等内容[1]。计算机或智能终端可以通过图像识别设备对其进行解码的操作。

        1994年,日本丰田汽车的零部件供应商DENSO WAVE公司的原昌弘设计发明QR Code[2]。DENSO WAVE拥有QR Code的专利权,但为了让更多人使用QR Code,该公司表示放弃行使专利权[3]。QR Code在2000年被制订为ISO/IEC18004标准,并在2006年和2015年两次被优化[4]。由于QR Code具有比条形码存储信息量大,抗干扰能力强等优点,被人们广泛用于手机扫码等操作。

2. QR Code的种类

        目前共有5种类型的QR Code,他们有着不同的特点和用途。分别是[5]:日常使用最广泛的QR Code Model 1/2(本文中提到的QRCode为Model 2)、只有一个定位图案适合小面积印刷的Micro QR Code、信息容量更大的iQR Code,可以存储隐私信息的SQRC(外观和Model 2没有区别)和可以灵活嵌入图案的Frame QR。

图1. QR Code的种类[5]

3. QR Code的生成过程概述

       首先介绍QR Code的结构。构成QR Code的基本结构是码元(Module),即图案中最小的方块[6]。QR Code由功能性图案(定位图案、对齐图案、时间图案、隔离符)和编码区(格式信息、版本信息、数据及容错区)组成。其中定位图案为固定的7*7码元,中间为3*3码元实心正方形,外围为7*7码元空心正方形。对齐图案为5*5码元图案。除版本1不需要定位图案外,其余版本定位图案数量 numbers = pow( (version / 7 -1) , 2 ) – 3。时间图案固定为黑白相间的图案。编码区按照图下图所示的固定顺序进行填充[7]。

       QR Code的生成大致分为5个步骤:选择纠错级别和可以容纳对应数据量的版本、对数据进行分组和编码、计算容错信息、计算并添加合适的掩码(Mask)和计算版本及格式信息。通过以上步骤可以得到一个完整的QR Code图案[7]。

图2. QR Code图案的结构[7]

3.1 选择纠错级别、可以容纳对应数据量的版本

       首先根据需要存储的信息量以及二维码用途决定QR Code纠错级别(Data Correction Level)和版本(Version)。QR Code共有L、M、Q、H四个纠错级别,分别对应约7%、15%、25%和30%的恢复率。例如,将网址“http://li-yang.cn”使用QR Code编码,其包含17位字符,若用于屏幕显示(不易产生遮挡或破损的情况下),纠错级别L即可,查询版本及纠错级别对照表[8],可以得到该网址可以使用版本1存储该网址。QR Code的版本决定了码元数(modules),版本和纠错级别共同决定了可以存储的信息容量(Information Capacity)[8],版本1对应的码元数为21*21。码元数计算公式为:module = 17 + 4 * version。

图3. 版本与码元数的关系[8]

3.2 对数据进行分组和填充

       对需要编码的数据以2为单位进行分组,例如(ht)(tp)(:/)(/l)(i-)(ya)(ng)(.c)(n0)。对照以下字母数字编码表进行编码,并通过公式[7]计算得到二进制值最终得到数据区域的信息。通过对版本信息、格式信息的编码得到格式信息和版本信息的数据。

图4. 字母数字编码表[7]

3.3 计算容错信息

       通过容错计算公式对上一步骤中得到的数据区域的信息进行编码。按照ISO/IEC 18004标准化文档中的描述,该步骤计算过程可以通过逻辑电路图表示。[7]

图5. 容错码计算逻辑电路[7]

3.4 计算并添加合适的掩码(Mask)

       通过以上计算过程,已经得到数据及容错区的内容。为了防止大面积或连续出现黑色或白色图案并防止出现功能性图案出现在数据区域,需要对数据区域的图案添加掩码。一共有8中掩码图案,需要通过计算评估得到哪种掩码图案更适合此处的数据,并对数据和掩码进行异或的操作,得到最终数据去图案。[7]

图6. 掩码图案[7]

3.5 写入版本及格式信息

       对二维码的版本信息、模式信息、掩码信息等参照标准化文档得到对应编码写入对应区域。此处不需要进行二次编码和添加掩码操作。[7]

       通过以上步骤的运算,得到最终的完整图案。

参考链接:

1. https://www.qrcode.com/

2. https://www.denso-wave.com/zh/technology/vol1.html

3. https://www.qrcode.com/en/history/

4. https://www.iso.org/standard/62021.html

5. https://www.qrcode.com/en/codes/

6. https://www.qrcode.com/en/howto/cell.html

6. https://www.qrcode.com/en/about/error_correction.html

7. ISO/IEC 18004-2015 Information technology — Automatic identification and data capture techniques — QR Code bar code symbology specification

8. https://www.qrcode.com/en/about/version.html

爱丁堡之行

去年刚到达英国的时候,跟着语言课的大巴去了趟爱丁堡。那次去比较匆忙,而且独自一人,只在市中心和爱丁堡城堡走了走,爱丁堡给我的印象想典型的旅游城市一样,人多。

第二次去爱丁堡是天空岛自驾游路过,午餐时间去了皇家游艇不列颠尼亚号(Royal Yacht Britannia),没有去市区。

这次去是第三次,和同学一起。一天时间,在爱丁堡大学同学的带领下,去了很多地方。卡尔顿山(Calton Hill)、海边、爱丁堡大学、苏格兰博物馆(National Museum of Scotland)等。这次爱丁堡之行改变了我原来对爱丁堡的看法。爱丁堡是一个既有风光有有文化底蕴的城市。

继续阅读

使用ACR122U读写NFC电子标签

1. 背景知识

        Near-Field Communication(NFC)是一种近距离无线通信技术,又称近场通信。该技术使用13.56MHz的高频无线电在20厘米(实际工作距离10厘米)以内通信。由于其传输距离短无法被远距离读取,且通信过程不用产生物理接触,同时具有便捷性和安全性(注:此处安全指通信需要在较短距离内进行。不代表应用中存储的数据安全。如315晚会提到的QuickPass盗刷问题,QuickPass信息泄露问题等),因此被广泛应用于非接触式支付[1]。Visa的payWave、银联的QuickPass、苹果的Apple Pay、安卓手机的无线支付等均使用NFC技术[2]。一个完整的NFC设备有3种工作模式:卡模拟模式(Card emulation mode)、读卡器模式(Reader/Writer mode)、点对点模式(P2P mode)[3]。

继续阅读

Blockchain For The Mortgage Industry

CSC8207 – Security Analysis of Complex Systems – Report

Yang Li
Newcastle University, Newcastle upon Tyne, UK

Abstract—This report discusses the analysis and application of the blockchain in the mortgage industry, as well as its strengths and weaknesses.

Keywords—Blockchain, Mortgage Industry, Trust, Security

More