有关多项式的算法——四则运算、求逆

算法介绍 多项式的运算可以说比之前的多精度数运算还要简单一点,因为多项式的加减只能存在于同次数的项之间,所以不需要考虑加减法里面的进位退位问题,这也就使得乘除法简单了很多。 加减法的原理就没什么好说的了,乘除法都是基于多精度数的算法修改的,存储多项式也使用了ArrayList,索引值对应项的次数,其元素大小对应项的系数。 求逆则使用了欧几里得算法: 以及有限域 $F_{2^8}$ 上基于指数对数表的乘法和求逆,对应的不可约多项式 $f(x)=x^8+x^6+x^5+x+1$ 。 指数对数表的构建方法如下: 将元素$02$表示成为$\alpha$,依次计算 $\alpha^i\space modf(\alpha)\space,i=0,1,\cdots, 254$ ,将所得结果转变为十进制数,设为$\beta_i ,i=0,1,\cdots, 254$; 建表。第一行为 $\alpha_i ,i=0,1,\cdots, 254$,第二行元素依次为 $\beta_i ,i=0,1,\cdots, 254$。由于 $\alpha^0\equiv\alpha^{255}\space modf(\alpha)$,约定第$2$行,第$255$列元素为$0$; 0 1 2 3 … 253 254 255 1 2 4 8 … 233 177 0 按所建表的第二行元素的大小进行重排列; 255 0 1 197 … 72 230 104 0 1 2 3 … 253 254 255 将(3)中表的第一行放在(2)中表的第三行。 序号 0 1 2 3 … 253 254 255 $(02)^i$ 1 2 4 8 … 233 177 0 $log_{(02)^i}$ 255 0 1 197 … 72 230 104 建立上述指数对数表之后,通过查表很容易求出两个元素的乘积。又由于对于 $i=0,1,\cdots, 254$ 均有 $(\alpha^i)^{-1}\equiv\alpha^{255-i}mod(f(\alpha))$ ,所以可通过查表也很容易求出元素的逆元。...

Dec. 18, 2019 · 10 min · 2016 words

J.Craig Venter DNA水印解密

上选修课的时候,老师讲到了合成生物学,提到了有关DNA编码的技术,于是就讲了J.Craig Venter团队把水印编码进DNA的事情。 下面是我在Google上面搜集到的资料: Researchers at the J Craig Venter Institute recently unveiled their first self-replicating synthetic bacteria (M. mycoides JCVI-syn1.0) whose DNA was ‘programmed’ base pair by base pair. To verify that they had synthesized a new organism and not assembled the DNA from another natural bacteria, scientists encoded a series of ‘watermarks’ into the genes of M. mycoides JCVI-syn1.0. There are four of these hidden messages: an explanation of the coding system used, a URL address for those who crack the code to go visit, a list of 46 authors and contributors, and a series of famous quotes....

Dec. 17, 2019 · 5 min · 900 words

Windows Terminal美化

Windows Terminal是微软新发布的一款Terminal产品(以下称WT)。对比之前传统的cmd和Powershell来说,WT对定制的支持更好,同时又支持GPU对页面的渲染、emoji表情、多标签等的特点。其项目地址为:https://github.com/microsoft/terminal。 由于WT的可定制化非常之高,只需要很简单的步骤就可以调节各种界面元素以及操作习惯,所以把它打造成最适合自己的Windows终端程序是完全做得到的。 下面主要分为两个部分来美化WT: 安装oh-my-posh(类似于Linux上的oh-my-zsh) 安装scoop 首先在Powershell中输入以下代码来保证允许本地脚本的执行: 1 set-executionpolicy remotesigned -scope currentuser 然后就可以脚本安装scoop了: 1 iex (new-object net.webclient).downloadstring('https://get.scoop.sh') 更换Powerline字体 Powerline字体有很多种,这里使用了Fira Code,项目地址为https://github.com/tonsky/FiraCode,下载后安装在电脑上即可,其他字体可自行搜索。 安装在电脑上之后,只需要在WT的配置文件profiles.json中修改显示字体就可以了,这个下面会讲到。 安装choco 1 Set-ExecutionPolicy Bypass -Scope Process -Force; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1')) 安装ConEmu 1 choco install ConEmu 安装 posh-git、oh-my-posh 和 Get-ChildItemColor 前两个是oh-my-posh的必备组件,最后一个是美化ls命令的显示效果的插件,可以选装。 1 2 3 Install-Module posh-git -Scope CurrentUser Install-Module oh-my-posh -Scope CurrentUser Install-Module Get-ChildItemColor -Scope CurrentUser 设置 Powershell 的 profile 1 if (!(Test-Path -Path $PROFILE )) { New-Item -Type File -Path $PROFILE -Force } 打开$PROFILE文件并粘贴以下内容...

Nov. 27, 2019 · 2 min · 279 words

多精度数的四则运算-Java和Python实现

多精度数指的是位数超过1024Bit的数。由于这一类数的位数超过了计算机CPU寄存器表达,也就是超出了计算机的字长,所以不能够使用计算机进行直接的运算。除此之外,多精度数的大小也超出了计算机中定义的整型变量的最大大小,所以也不能使用标准的整型来存储这一类数,而需要使用数组或是字符串来存储。 对于多精度数的计算,目前有两种处理办法: 模拟人们手工进行“竖式计算”的过程编写其加减乘除函数。 这个方法的优点是操作逻辑符合人们的日常思维,易于理解,缺点是效率较低。 将多精度数当作一个二进制流进行处理,使用各种移位和逻辑操作来进行加减乘除运算。 这个方法的优点是执行效率高,缺点是代码极其复杂,可读性低,难以理解。 下面的算法都是基于第一种办法进行处理。 算法原理 先重新理一下竖式计算的流程: 加法在手工竖式计算中,当两个位相加得到的值大于10时就会产生一个进位值,并会在高一位的计算中把进位值也加入计算,这样从低位到高位一直计算直到计算结束为止。所以在算法中也需要定义一个进位值的变量。 减法与加法类似,当被减数位小于减数位时,会产生一个退位值,即向更高一位去借10,来避免产生负数。若这一位产生了借位,那么高一位的计算中就要减去1再进行计算。所以在算法中也需要定义一个退位值的变量。 乘法的运算在竖式计算中是把乘数逐位的与被乘数相乘,且运算结果随着乘数的位数向左移,最后再全部相加。所以在对单个结果位的处理中要考虑到三个因素:第一个是当前的计算结果;第二个是前一位产生的进位;第三个是之前的计算中在这一位得出的结果。 除法在竖式运算中可以理解为是多次的减法。下图展示了除法算法的流程: 模指数运算 除此之外,还有多精度数的模指数运算,即计算以下式子的值: $$\Large{a^e\space mod\space m} $$ 可采用重复平方乘算法来实现: 算法实现 理解了竖式计算的流程与规则后,就可以使用算法进行实现了。由于课程实验原因,我做了Java和Python两个语言的版本,其中Java里面使用了ArrayList对数进行存储,Python中则使用了列表List进行存储。 Java: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 // 导入对应模块 import java....

Nov. 10, 2019 · 8 min · 1531 words

CentOS服务器上安装Python3.7并设置为默认Python

最近由于课程设计要求要在服务器上配置Flask框架,但是我在配置的时候各种报错搞不来,搜了一番之后发现是默认Python版本是2.7导致的。然后我尝试去运行Python3,发现服务器上压根没有……于是……就有了这篇文章 注:本文转载自https://blog.csdn.net/weixin_41216356/article/details/99819899 0x00 引言 Linux操作系统自带一个Python2.7,没有Python3,在开发的时候非常不便,因此需要安装一个Python3,并且将Python3设置系统默认Python,同时还不能影响那些Linux系统中需要用Python2的底层文件。 0x01 安装Python3 查看操作系统及Python基本信息 首先查看一下系统的版本以及Python信息,各系统查看信息的方法参考:https://www.cnblogs.com/wzk-0000/p/7483262.html 1 2 3 cat /etc/redhat-release # 查看内核版本 python -V # 查看python版本 which python # 查看python路径 我这边的系统的内核为CentOS 7,默认Python的版本为2.7.5,路径为/usr/bin/python。 然后我们导航到该目录,查看Python相关文件的信息,可以看到Python和Python2指向的都是Python2.7。 1 2 3 4 5 6 [root@libra-server ~]# cd /usr/bin [root@libra-server bin]# ll python* # 查看以python开头的文件信息 lrwxrwxrwx. 1 root root 7 Oct 15 2017 python -> python2 lrwxrwxrwx. 1 root root 9 Oct 15 2017 python2 -> python2.7 -rwxr-xr-x. 1 root root 7136 Aug 4 2017 python2....

Nov. 1, 2019 · 3 min · 606 words

Bugku论剑场WriteUp(Web)

自己第一次真正意义上开始练习CTF,收获很多,看来还是面向漏洞学习更有效率一点。。。 链接:https://new.bugku.com/challenges/tag/web web26 题目链接:http://123.206.31.85:10026/ 先看看这个正则表达式/\d+/sD的含义: 先是贪婪匹配数字,然后有两个模式限定符,s代表把换行符当作普通字符,即把整个字符串当作单行字符串看待;D表示Dollar符$只匹配至字符串的末尾而不是行末尾。也就是说$str不能包含数字,无论是在开头、末尾还是中间都不行。 于是尝试构造参数num=1&str=a看看会报什么错,发现直接出flag了,,,。。。??? 于是仔细一看,发现运算符and这里有问题。and和&&的运算优先级是不一样的,&&的优先级高于=,而and的优先级则低于=,所以在这里有效的只有赋值运算,后面的and运算由于没有变量来存放运算结果,等于没有。下表是PHP中运算符的优先级排序: 这题真的奇葩。。。被甩flag甩的猝不及防。。。 web1 题目链接:http://123.206.31.85:10001/ 打开网页,里面就一张图片里面有一段PHP代码,很明显就是代码审计题了。 在这里第一次碰到extract()函数,下面是PHP Manual对这个函数的介绍: extract — 从数组中将变量导入到当前的符号表 本函数用来将变量从数组中导入到当前的符号表中。 检查每个键名看是否可以作为一个合法的变量名,同时也检查和符号表中已有的变量名的冲突。 extract( array &$array[, int $flags = EXTR_OVERWRITE[, string $prefix = NULL]] ) : int 这个函数的必选参数是一个关联数组,函数的功能就是把这个关联数组转化为PHP程序中的变量,并检查是否与已存在变量存在冲突。关联数组里的键名为变量名,键值为变量值。 从这里来看,程序是默认把整个$_GET超全局数组的内容都转化为了变量,也就相当于可以通过GET方法传入变量。后面的if要求$a变量必须存在,且$c变量从$b变量对应的文件中读取内容。如果$a和$c的值相等,则输出flag。 显然服务器上的任何文件我们都是不知道内容的,于是无法通过读取真正的文件来满足要求。于是只能使用PHP伪协议php://input。令POST内容与变量a的内容相同即可得到flag。 看了一下别人的WriteUp,只需要传入a=即可,因为使用file_get_contents()函数去读的文件如果不存在的话,那么会返回false。而空字符串与false做等于运算返回的是true,所以也可以打印出flag。 web9 题目链接:http://123.206.31.85:3031/ 页面打开只有一句话: 这一行字直接暗示(明示)了一些信息:使用PUT方法发送信息bugku即可拿到flag。 使用BurpSuite修改请求头,拿到一段字符串: 进行base64解密,得到flag:flag{T7l8xs9fc1nct8NviPTbn3fG0dzX9V} 流量分析 题目文件:点击下载 下载下来是一个WireShark的抓包记录文件,使用WireShark打开,追踪TCP数据流即可拿到flag。 flag:flag{bugku123456} web2 题目链接:http://123.206.31.85:10002/ 网页产生了一个随机生成的算式,算式每3秒刷新一次。要求算出正确答案就可以拿到flag。 单靠算肯定是不行的,于是开始玩蛇,成功拿到flag: 1 2 3 4 5 6 7 8 9 import requests import re session = requests.session() # 创建session r = session....

Oct. 28, 2019 · 6 min · 1251 words

PHP中类的魔术方法总结

PHP中对对象设计了15个非常有用的魔术方法,分别是__construct(), __destruct(), __call(), __callStatic(), __get(), __set(), __isset(), __unset(), __sleep(), __wakeup(), __toString(), __invoke(), __set_state(), __clone() 和 __debugInfo()。这些魔术方法有助于对象在不同的情况下自动的实现一些行为,如初始化对象自动赋值、对象被销毁时发出提示信息等等。下面对这些魔术方法的功能进行简要总结。 __construct() 和 __destruct() __construct()方法是类的构造函数,它在类被实例化为对象时执行。通常用于把一些成员属性初始化为指定值。 __destruct()方法是类的析构函数,它在对象被销毁时执行,通常为对象失去引用时以及程序运行结束时。析构函数没有参数。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 <?php class Person{ var $sex; var $name; var $age; function __construct($name = "Nobody", $sex = "Unknown", $age = 1) { $this->name = $name; $this->sex = $sex; $this->age = $age; } function __destruct(){ echo "I'm "....

Oct. 23, 2019 · 6 min · 1276 words

PHP面向对象的关键字

面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了;面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。 面向对象是相对于面向过程来讲的,面向对象方法,把相关的数据和方法组织为一个整体来看待,从更高的层次来进行系统建模,更贴近事物的自然运行模式。 PHP为面向对象编程提供了很多的关键字和魔术方法,当然其中一些关键字和魔术方法在其他的面向对象编程语言中也存在,如Java。下面对这些关键字和魔术方法做一个总结。 PHP中的关键字 特殊对象引用$this、$that、self、parent $this 用于在类的实例化对象内部访问这个对象的非静态成员。 $that 用于__clone()魔术方法中,$that为被克隆的原对象,$this为克隆出来的那个对象。 self 用于在类的实例化对象内部访问这个类的静态成员。 parent 用于在某个类的子类对象中访问其父类的成员(通常是静态成员,但有时候可能是实例成员)。 private、protected、public 这三个关键字是用于PHP的访问类型控制的,我们可以使用这些关键字来对类中的属性与方法进行访问权限的设置,并且可以对类进行封装。 private关键字表示私有,使用private的属性和方法对同一个类内里面的所有成员都没有访问的限制,但是在这个类外部的任何位置都不能够访问和操作。 protected关键字表示受保护,使用protected的属性和方法在该类本身以及这个类的子类和父类中没有访问限制,但是在这个类以及它的子类和父类的外部代码中依然不具有对protected属性和方法的访问权限。 public关键字表示公共,也就是说使用public的属性和方法在程序的任何位置都可以被访问和操作。在PHP中,如果没有为成员指定访问控制关键字,那么默认这个成员为public。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 class MyClass { public $public = 'Public'; protected $protected = 'Protected'; private $private = 'Private'; function printHello() { echo $this->public; echo $this->protected; echo $this->private; } } $obj = new MyClass(); echo $obj->public; // 这行能被正常执行 echo $obj->protected; // 这行会产生一个致命错误 echo $obj->private; // 这行也会产生一个致命错误 $obj->printHello(); // 输出 Public、Protected 和 Private class MyClass2 extends MyClass { // 可以对 public 和 protected 进行重定义,但 private 而不能 protected $protected = 'Protected2'; function printHello() { echo $this->public; echo $this->protected; echo $this->private; } } $obj2 = new MyClass2(); echo $obj2->public; // 这行能被正常执行 echo $obj2->private; // 未定义 private echo $obj2->protected; // 这行会产生一个致命错误 $obj2->printHello(); // 输出 Public、Protected2 和 未定义 private 的错误 避免踩坑:在验证PHP的访问控制机制时,需要在PHP配置文件php....

Oct. 23, 2019 · 3 min · 548 words