可验证随机函数
可验证随机函数(Verifiable Random Function)用于生成一个可以进行验证的随机数,生成随机数的生成者通过自己的掌握的私钥来生成一个随机数和一个验证参数(proof),接收到随机数的验证者可以通过该随机数和验证参数来对随机数进行验证。可验证随机函数的三个特性:可验证性、唯一性和随机性。
这样一种存在公私钥对用于进行验证的函数,需要通过非对称加密来实现,下面以RSA和ECC为例。
该函数传入消息,经过生成者处理后输出一个随机数和验证参数
RSA-VRF基于RSA算法的VRF感觉和RSA算法的签名过程一样,只要生成的结果随机且可确认即可
如RSA算法一样,首先选取两个大素数$p$和$q$,$n=p \times q$,$n$作为进行运算的整数群$Z_n^*$的阶,生成元为$g$
将消息通过编码的方式映射到群上,如果消息编码后过大需要考虑其他的编码方式,编码映射后的消息为$m$
在VRF其实并不需要解密得到结果,所以对消息进行编码也可以通过哈希函数缩短输入,保证可以进行验证即可
生成者选取$e \in (1, \phi(n))$以及生成私钥$d = e^{-1} mod\ ...
《Carving Orphaned JPEG File Fragments》阅读笔记
接前面JPEG编码解码的文章:JPEG结构及编码解码
许久之后的现在导师扔了篇论文来让我康康里面的技术有哪些地方比较新颖
在缺失元文件的磁盘中恢复数据存在的两个问题:
无法在存储器中连续地展开文件数据
文件为了便于快速和轻量的存储,会被格式化地存储到二进制中
文章内容Abstract文件雕刻技术可以在缺失元数据的存储器中恢复文件,当数据被编码和压缩后,对文件的雕刻需要编码和压缩的相关信息(元数据)
文章检测了大量的JPEG图片头以识别它们的结构特征,并运用这一信息实现需要两个步骤的新技术。
解压不完整的文件数据,以获得一个空间域的描述
然后依据这个在空间域的数据中,还原得到一个感官上有意义的图像(即得到正常的图片)
Introduction随着越来越多的数据的产生以及被存储到数不尽的设备中,对于在设备错误或遗失情况下的文件数据恢复技术的需求开始增长。所有的设备通过将文件打散为不通过的小块来存储到设备上,对于较为老式的存储设备,这一小块的大小为0.5Kb,而到最新的设备,大小会是64Kb。而在访问这些数据的时候需要根据元数据将这些块连成一个链表,以取得文件的数据。由此,对 ...
WPF窗口置底
软工项目查许久资料才搞定,stackoverflow上的资料一直没说清楚花了不少时间 = =
借此水一篇博文,不过好像还需要实现一个让窗口不贴在桌面上的需求,但是这个把父窗口设置成Zero应该就行了
实现步骤WPF中的应用场景:将窗口钉在桌面上,使用快捷键Win+D显示桌面时不会让窗口隐藏
在窗口类中引入dll,调用系统api用于查找句柄、设置句柄等操作
123456789101112131415161718// 获取指定窗口的样式[DllImport("user32.dll", SetLastError = true)]static extern UInt64 GetWindowLong(IntPtr hWnd, int nIndex);// 设置指定窗口的样式[DllImport("user32.dll")]static extern int SetWindowLong(IntPtr hWnd, int nIndex, UInt64 dwNewLong);// 获取桌面Desktop窗口的Handle[DllImport(&q ...
JPEG结构及编码解码
为什么会想到看这个东西呢,因为选了个数据恢复的课不得不了解一下(早知道就应该选水点的实验课了)
或许后面还会造个轮子玩玩吧。。
JPEG文件格式JPEG文件通常以FFD8头部标识,以FFD9作为结束标识,在文件中以FF表示一个段的开头,后跟标识信息表示段的内容,再之后是两字节的数表示段的长度
编码过程色彩空间大多数JPEG算法的实现使用亮度和色度(YUV编码)而非RGB编码,因为人眼很难观察到高频亮度在很小的区域中的变化。RGB使用3个字节来存储颜色信息,而YUV也使用3个字节来存储,但是每个字节表示的信息和RGB相比是不同的。图片的编码流程如下
离散变换和量化JPEG在处理图像之前将图片划分为8x8的小块来进行处理(这样的小块被称为最小编码单元),在处理的时候需要将像素值的范围进行修改,使得值的范围在$[-127, 128]$之间,未进行处理的范围在$[0, 255]$,使得像素值以0为中心,便于利用离散余弦变换。离散余弦变换把离散的数据变成多个余弦信号的组合。
二维DCT变换二维DCT的变换公式:$$F(u,v) = c(u)c(v)\sum_{i = 0}^{N - 1} ...
来点mysql—索引
本篇博文记录学习mysql的一些笔记(学习数据库+准备面试
较为抽象的地方不会有很细地记录,可能存在理解不是很精确的地方
然后之前虽然用过数据库但是sql语句也不太会,还是必须要学的(
索引索引(是Mysql中也叫做键)是存储引擎中用于快速找到记录的一种数据结构
1SELECT first_name FROM sakila.actor WHERE actor_id = 5;
该语句用于在actor_id列上建立的索引查找值为5的行,然后返回所有包含该值的数据行
索引分为单索引和组合索引,单列索引中一个索引只包含一个列,而组合索引中一个索引可以包含多个列(在多个列中创建的单索引并不能提高查询性能)
索引提高了查询速度,但是会降低更新表的速度,因为在更新表的时候也需要对索引文件进行更新
在创建了索引之后,查询会根据语句情况选择使用索引以提高查询效率,快速定位数据,不用扫描表中给定查询的每一行
B-TreeM阶的B树,每个节点最多有M个子节点,非叶子节点具有至少$ceil(m/2)$个子节点
B树的根节点拥有的子节点数量和上限的内部节点相同,如果根节点不是唯一节点,至少有两个 ...
2021腾讯暑期实习面经
TEG 一二面一面 2021.03.123.10的上午接到第一次电话,但是在上课就挂了,打回去结果是AI
3.11下午还在摸鱼,然后又打过来了,问第二天下午3点有没有时间,然后冲了(
头一天接到电话没有问是什么部门的,面试开始的时候面试官自己介绍了一下是TEG的(我怎么还被广州捞了啊
首先是自我介绍
结束了之后开始问项目(整个面试过程都在问项目,一点算法都没问),项目是寒假赶工赶出来的俱乐部Web
Web程序有用户鉴权吗(有,但是只针对管理员)
你的这个项目使用了Django,那么你知道Django的用户鉴权是怎么实现的你清楚吗(不清楚,没来得及看过)
怎么存储的用户信息,例如密码,怎么保证安全性,如果让你来设计保存,会怎么进行保存(哈希,加盐)
加盐的话使用的字符串都是同一个吗(在我构想的加盐方案中是这样)
加盐是为了防止什么(防止暴力跑彩虹表之类的)
你的项目里还使用了RSA,主要是用来干什么?(登录认证,balabalabala)
你使用公钥对用户信息进行加密,但是中间人截取不是也可以用来进行登录(不能,用户一旦登录成功服务器会销毁记录)
项目用的什么数据库(Postgresq ...
Google二次验证
该博文用于记录一下Google二次验证的生成及验证过程,以便以后需要用的时候不用到处查资料×
密钥生成在文档中查询到二次验证密钥属于Base32编码,所以在服务端生成密钥时使用的是随机字符串通过Base32后得到的字符串截取前16个字符作为密钥,实际上只要是Base32编码字符串,不管长度都可以。为了保证安全性可以取更长的编码字符串。
实际上这一过程也可以直接放在客户端生成,但是写的时候还是直接放在的服务端,主要也是为了通过进行字符串的混淆添加一些密钥信息到随机时间戳中保证一定的安全性
12345678def generate_secret(): timestamp = int(time.time()) half = len(secretString) // 2 import_str = secretString[:half] + str(timestamp) + secretString[half:] #添加其他信息到随机时间戳中 digest = hashlib.sha256(import_str.encode('utf-8')).he ...
Bukkit服务端插件开发(三)
昨天才把Ver 1.0放出来,只实现了简单的功能还没进行细节的完善
子命令配置将目前功能命令进行修改
/bvote setid [room_id]:设置绑定房间id号
/bvote setworld:设置当前世界为受影响世界
/bvote time [random|static] <args>:设置间隔时间为随机或定时
/bvote switch:设置插件状态
对于子命令的实现,之前进行time指令的实现中使用参数的方式可以进行实现
但是在游戏中输入指令的时候没用补全提示,现在需要实现的就是补全提示
在查阅了文档和一些开源代码后,在插件主类中可以覆写一个onTabComplete方法,其声明如下
1public List<String> onTabComplete(CommandSender sender, Command command, String alias, String[] args);
在主类中,可以通过判断参数然后返回一个列表作为待选的可以通过tab补全的子命令,而在onCommand中可以使用参数实现子命令
项目中的命令是通过实现Comm ...
Bukkit服务端插件开发(二)
有点摸了,现在开始复习下学期考试然后每天只修一点bug,所以这一部分的内容不是很多
线程分离在进行插件的测试过程中,存在一个问题,输入指令/debugvote之后,记分牌能够正常工作
但是由于在这之前插件的运行是单个线程,在插件的相关程序运行的过程中需要等待程序运行结束
这就导致了在客户端看来能够正常移动,但是在这个过程中服务端却是在运行命令程序的
PS:突然想起来之前用一些插件的时候也会出现类似的问题不知道是不是也是这个原因
Bukkit中提供了org.bukkit.scheduler中的相关类用来解决线程的问题,但是进行异步调用的时候,子线程中是不能调用Bukkit中提供的API的
准确来说,是只能调用Bukkit中提供的线程安全的API
关于线程安全的问题,在mcbbs上了解到关于MC本身的一些操作不是线程安全的,具体的函数还不是很清楚
但是,在插件开发的过程中最好是将一些需要调用API的方法放到主线程中进行实现
对于这个问题,可以通过在异步线程中调用Bukkit中的同步调用
在项目中的实现如下:
DanmakuListener中开启异步线程对弹幕进行监听
12345 ...
Bukkit服务端插件开发(一)
前言:
博客停了很久没更,主要也是上一个学期一直摸鱼,没啥写的
然后开发的项目也一直放着,完成度比较高的就是课设和机器人的API,没什么好写的
之前打算用在MC建筑中使用的插件也是鸽了很久没动,因为那个东西除了我需要一个填充功能之外想不出其他的功能了
然后这个假期除了开发BilibiliVote之外还会改一下机器人API的前后端代码
而这一系列的博文仅仅在开发DanmakuVote过程中的一些记录,后续或许会系统的把Bukkit相关的东西整理一下
本项目仓库地址:DanmakuVote
DanmakuVote基本构想这个插件其实也是测试了一下土豆的HyperScape,然后看到有一个插件可以获取bilibili直播间弹幕发送到游戏中
土豆的这个游戏里面有一个观众互动性比较高的功能,每局游戏可以让观众投票一个事件,然后票高的事件接下来会在游戏中发生
那么结合bilibili直播间信息获取的一个接口,是不是可以考虑将这个功能在Minecraft中进行实现
那么基本的一个思路就是这样:
插件只有服务端,仅仅考虑直播间播主为腐竹(OP)的情况,当然后续开发中还可以进行扩展
OP指定一个世 ...