寄念大一电赛

前言

好久没写blog了。这里面虽然也有懒的因素,但诚然,这个大一过的确实挺忙的,无论是学业和社团活动都很忙。算法竞赛这边,实际上没有什么进展(有在新建文件夹了),倒是被电子设计竞赛那边的老师挖去打电赛了。。。

打完的总体感觉就是,电赛跟算法竞赛还是区别很大的,我个人感觉还是算法竞赛难度大一些。

这两天终于闲下来了,于是乎决定写篇东西记录一下这次比赛,顺便也回顾一下大一的别的什么事情。

像这种偏纪实类和个人性质的文章,我就打算写随意些、口语化些,主要还是记录一些有的没的的事情,就当杂记什么的去写了。此外也希望分享这段经历出来给各位参考,找点乐子也好学习借鉴也好锐评也好,都可以。

背景

首先最早的时候误入电子的坑其实是一时兴起参加了校内举办的电设新手赛,本来其实也就是图一乐而已吧。

结果最后没成想拿了个一等奖还给人评委唬得一激灵,我不禁凝视着糟糕的走线和屎山代码缓缓打出一个问号?

后来。。。后来就被某个老师抓去打省赛了。。。于是就有了这篇东西。

对于一开始队内构思的方案,带我们比赛的老师其实是拒绝的,然后就打了个电话过来作出了多项重要指示(

你们这个想法啊,还是too young, too simple, 很 naive 啊。

后来做完了发现老师是对的,毕竟身经百战,见得多了。

然后我们就改了。

最后这个东西的名字听起来好像挺高大上的,但是实际上就是在一张图上改几个数字罢了。

原名太长,这里就干脆就叫它图片加水印吧。

概要和说明

首先说一说水印这个事儿。最简单最普遍的水印,估计就是直接往图上新整一个图层,写点儿七七八八的东西。无论这个图层长什么样,写的啥玩意,至少都能看见,大伙都认得出来。这种水印一般就用于数字资产的防盗用、侵权和著作声明一类的事情,其实很少有更多安全性和隐蔽性的要求。更复杂一些的水印,就是不可见的水印了,这种水印加在图片里面大伙是看不出来的,但是知道里边有水印而且知道怎么弄出来的人就可以把水印和其中的信息读出来。这种水印有一个很大的好处是完全不影响使用,因为可见水印如果想很好地达到防盗用的效果的话,多多少少会用水印暴力掩盖一些关键信息,别人拿到也不太好去水印。这个项目做的就是这种不可见类型的水印,然后还顺便做了一些加密工作提高安全性,同时也满足了其他场景下的信息传递(比如签约、合同什么的)。

至于加密这块儿,可谈的东西就会比较多,就简单说下。首先加密是一个各行各业都有的很普遍的需求,这基本上是与信息传输和保存的需求相伴而生的。从几千年前的凯撒密码到今天数量庞大的各种加密算法,他们无非都是在实现同一个目的——不要让别人知道我们在说什么,简称谜语人。口头交流有口头交流的加密方法,网络通信有网络通信的加密方法,但他们本质上其实都是通过通信双方的某种约定好的协议实现的,而不知道这个协议的人就无法得知真实信息。这个项目采用的这种“协议”主要是一些计算机算法,而且主要是在图片上面搞一些事情(虽然其实本质上都是搞字符串),让这张图在传输信息时难以被破译暗藏其中的玄机。其实,现代加密算法的现实安全性大多数都源于随机性、一些数学困难或者算力不足。但是我们组数学不好,显卡也不太行,于是乎只能在随机性上做文章。

不知道是不是因为我们那老师哪天看了篇奇怪的微信推文,然后就说要拿香蕉来生成真随机数用来做加密,这看起来就有点科幻了。最后做成了下面这个东西(雾)。

就是这个东西

这个东西的作用就是在一个引脚上发出真随机脉冲,然后就没了。

然后还有个东西,是个触摸屏,是用来给别人操作的面板,因为我们是整了个GUI的。

Touch_screen.png

触摸屏背挂一个树莓派4B,用来跑软件。据说国赛是不允许用树莓派的,听到时我很震惊,当时我在想还是回去打算法竞赛比较好。。。

然后这就是所有东西了。。。然后不是这算啥电子设计啊喂?你先别急,让我先急,因为我也不知道有啥电子的(几乎都是开源套件),而且也不切题(顺带说一句题目是AI-未来技术,我寻思着这也不未来吧。。。?)

不过虽然但是,最后做出来的东西看上去还是比较高雅的,毕竟没有各种乱飞的杜邦线和裸露且积灰的电子模块(但是没拿奖)。

开发流程

这部分就简单讲讲我们是怎么把这个项目做出来的,主要是前期的准备工作、实际开发和最终测试的过程。不过软件设计这块儿我就不写了,其实比较弱智,就是写了一堆按钮和框框。

前期需求分析和方案论证

刚开始组里三个人其实都不知道要做的这到底是个什么,只是好像知道是干嘛的。然后首先是各种查文献查资料,然后把最原始的方案构造了出来,顺便分配了下组员各自的任务。我的话,主要还是干老本行写代码咯。。。

本来我们是想整个服务器让数据链路走云端传输,以此来体现“未来科技”(这是否能被称作物联网,我也不知道),结果还没开始搞又是一通电话打过来。

你们啊,天天想着搞个大新闻,其实自己啥也不会,这样搞肯定做不完的。遂放弃之。

最后确定的需求大概是这样:

  • 提供图形界面给用户操作
  • 用户输入待加密图像和手写签名,软件提取手写特征加密后得一水印并嵌入待加密图像
  • 能够对加密后的图像进行解密
  • 模拟对图像进行攻击,并给出一个篡改可能性指标

方案也很直接,就是确定了三个软件模块,加密、解密和模拟攻击来实现整个需求,以及又搞了一个OCR模块来识别手写签名(提取特征),一个真随机数生成模块来提供一些加密参数。此外,整个系统是Stand Alone的,不需要与外界发生除了特定输入输出的信息交换。

硬件选型和软件架构

一开始吧其实是想白嫖学校的华为昇腾开发板的,但是发现这个东西跟正常的嵌入式Linux有亿点不一样,遂放弃之。最后还是选择了资料最多同时也是最熟悉的树莓派。盖革计数器和触摸屏都买的套件(虽然那个壳是自己打印的,有亿点丑),不过触摸屏其实踩过一个不小的坑(主要是驱动),这里就不多说了。。。

然后就是我主要负责的软件,这部分我决定开几篇单独的文章详细说一下里面的道道还有遇到的坑,既是为了防止自己以后再踩坑,也是为了不要让其他人再踩一次。那在这里就先简单说说。

首先整个软件跑在bullseye版本的树莓派系统上,用Qt5.14.2交叉编译环境开发。整个加密算法部分其实没有多么复杂,模拟攻击我更是两个小时就写完了。最多的时间其实花在了前期开发环境准备和配置上,这里面的问题我会再开一篇文档来写,当时几乎是一步一个坑。。。

整个软件结构可以由下面的简图描述:

Software.png

具体各个模块怎么配合运行的,这里就不展开说了,不过之后有可能把当时写的设计报告发出来,代码也会开源。

技术验证

做完上面的这些事情心里才算是有底了,然后组里就去搞自己的模块的部署和实现去了。总而言之,先把各个模块跑起来才知道它们能不能缝起来是吧。

其实一开始我是不懂嵌入式Linux的,我还以为跟桌面Linux差不多呢。当时花了一天时间把python版的水印算法整了出来,第二天拿着pyqt做UI的时候,一激动就把截图给发到微信群上去了。这下好了,直接十几条微信给我发过来。他说,你为什么用python?我就回答说python可以直接移植到树莓派上。然后他就叫我转c++,真好。不过确实嵌入式上c++运行速度比python快的多,虽然交叉编译和动态库配置有够烦的。

算法和软件设计

整个c++开发环境搭建完,就接着在里头去搞软件了。嵌水印倒是比较简单,知网扒了篇论文下来临摹一遍算法。加密呢,反正当时我也不太懂密码学之类的,就胡乱找了几个名字好听的算法塞进项目里去,然后稍微圆了一下逻辑。然后解密就是很简单地把加密逆过来,没什么值得一提的。这部分有几个算法我还是打算单独挑出来再学习一下写几篇东西的,毕竟现在我自己也没太搞懂那些东西,但是把这些个东西塞在一起倒是不难(捂脸)。不过话说回来,当时展示的时候写的稿子还是挺让人不明觉厉的。

获取用户输入的待加密图片后,系统会要求用户进行签名,从而通过OCR获取用户的签名信息,对这一信息进行RSA公钥加密后,对密文进行Base64编码后取前三位制成QR码,然后对QR码使用感知哈希算法获取Arnold变换参数,再经Arnold变换后得到待嵌入水印图片,最后使用基于双随机序列的DCT分块水印算法将水印嵌入待加密图像,同时,取DCT随机序列、Arnold变换参数、RSA私钥和密文的剩余部分制成QR码并对其进行logistic混沌序列加密得到含有密钥的图片,至此,加密过程结束。最终,用户获得一张经过水印加密后的原始待加密图像和一张密钥图片。

这么一大段念完评委都蒙了,赶紧让下一组来(

说实话做完核心模块其实只花了两天,其他时间都去写按钮交互了。。。

系统测试

整个项目缝得差不多的时候,就开始做测试了。我感觉还不错,至少当时看着我写的bug,还是能找到一点代码的。

说是测试,其实就是跑一跑那些模块照着结果那样式差不多地编了一点数据,然后就是在群里吹一吹水,时间就过去了。

我这儿的做的测试,报告写得是丰富多彩,又是静态测试动态测试的又是单元测试交叉测试的,随便写。反正都是对着一坨烂代码调半天或者是对着一堆按钮搁那点点点,最多就是把组里另一个人拉过来对着按钮点点点,没什么意思。


然后到这儿其实整个开发流程就完了,嗯,最后就是拿去比赛了。其实这东西没什么复杂的,主要是自己太菜了,做了半天。有多菜呢,这里说一段小插曲。

因为这种比赛比较强调作品的完成度和独立性,不管你做得多发里服笑,能整个跑下来不出bug就成。所以带队的老师就叫我把树莓派上的程序设成开机自启动,不然开机还得找个键盘插上命令行进去,属实啥必嗷。但是我看挺简单,就说最后一天晚上再整吧。结果最后一天彩排的时候老师一看,“你这怎么不能开机自启动啊”,我就说两分钟就搞定了晚上再搞,然后他就笑,叫我现在就搞。嗯,然后我两分钟没搞出来,其实用了两个小时才搞出来。

所以说,年轻人啊,还是too simple,总是听了风就是雨,知识水平不够。

后记

总之,虽然最后做出来的东西可能不咋地(指没拿奖),但至少按比较规范的流程做出来了一个完整的项目。

虽然组里老师和同学天天可劲儿捧我,不过我左思右想横竖只在我这儿看出来一个菜字,做个项目真就啥都不会,就会写个代码,算法都没有。

不过根据我多年游荡知乎的经验,一般互联网公司做点项目其实也就那样,反正就是写bug调包呗(

要是真就只是止步于此,还确实不符合我一贯的作风吧。

(完)

posted @ 2022-08-23 18:09  DarkValkyrie  阅读(121)  评论(0)    收藏  举报