为了在计算机中表示字符,在设计编码的时候用1个字节也就是8bit位数来编码英文字符集
可见字符的十六进制表示:
可见字符的十进制表示:
可见字符的二进制表示:
如果 URL 中出现了拉丁字母、阿拉伯数字、. -_~ 外的符号,则必须 使用百分号编码,所以 URL 编码也称为百分号编码。
如你在浏览器地址栏上看到:/s?wd=春节
我们知道,ASCII 的一个字符对应 8 比特,所以3个字 符对应4个Base64 位。
例如:fff→二进制表示为0
不足 3 的倍数怎么办,直接在末尾填充全 0 。
填充几个字节就再最后加上几个 =
所以base64只可能有一个=号或者两个=号
base16的表现形式就是16进制的ascii字符串表示
建议遇到base系列的多尝试几种base系列的解码
上面说的几种都是单表代换密码。
在单表替换加密中,所有的加密方式几乎都有一个共性,那就是明密文一一对应。
密钥空间小,直接爆破。
密钥空间大,尝试统计分析找到攻击点!
在学习了凯撒大帝使用的神奇密码后,密码前辈们有创造出了更为奇异的加密方法。本题出题者喜欢用helloworld当密钥,密文如下:dlpcsegkshrij,请破解后提交。附录是一张似乎有用的表。答案为非常规形式。
现代密码体制(系统)由五部分组成:
公钥加密体制(双钥加密体制):加密密钥(公开)≠ 解密密钥(保密) 加密算法 ≠ 解密算法。
安全性主要是基于数学上的计算困难问题,如大数分解RSA、离散对数、椭圆曲线上离散对数等。
理论上基于大数分解的困难性,即分解模数N的困难性
但随着计算机计算能力的发展,为了确保模数N不被分解,N需要取得越来越大。
首先,我这边就不放冗长的百度百科的东西了,我概括一下我自己对RSA的看法。
RSA是一种算法,并且广泛应用于现代,用于保密通信。
RSA算法涉及三个参数,n,e,d,其中分为私钥和公钥,私钥是n,d,公钥是n,e
n是两个素数的乘积,一般这两个素数在RSA中用字母p,q表示
一般CTF就是把我们想要获得的flag作为明文,RSA中表示为m。然后通过RSA加密,得到密文,RSA中表示为C。
一般来说,n,e是公开的,但是由于n一般是两个大素数的乘积,所以我们很难求解出d,所以RSA加密就是利用现代无法快速实现大素数的分解,所存在的一种安全的非对称加密。
p和q相差过大或过小,如上例。
其中若p和q的值相差较小,或者较大,都会造成n更容易分解的结果
因为p和q十分接近,所以可以使用yafu直接分解
通过在此类网站上查询n,如果可以分解或者之前分解成功过,那么可以直接得到p和q
当题目给的多对公钥n是公用了一个素数因子的时候,可以尝试公约数分解
所以当题目给了多个n,并且发现n无法分解,可以尝试是否有公约数。
求公约数可以使用欧几里得辗转相除法,实现python脚本如下
首先了解一下什么是dp、dq
这种参数是为了让解密的时候更快速产生的。
假设题目给出公钥n,e以及dp
我们可以通过n,e,dp求解私钥d。
以下推导过程如果有问题欢迎指正
我们将式1带入式2可以得到
求出p-1,求的方法也很简单,遍历65537种可能,其中肯定有一个p可以被n整除那么求出p和q,即可利用
注:这里的-1为逆元,不是倒数的那个-1
首先用公约数分解可以分解得到n1、n2的因子
但是发现e和φ(n)是不互为素数的,所以我们无法求出私钥d。
也就是说,e和φ(n)不互素且具有公约数79858
因为这题的公钥n是由四个素数相乘得来的,
其中四个素数的值相差较小,或者较大,都会造成n更容易分解的结果
因为p、q、r、s十分接近,所以可以使用yafu直接分解
明文过小,导致明文的e次方仍然小于n明文的三次方虽然比n大,但是大不了多少
小明文攻击是基于低加密指数的,主要分成两种情况。
明文过小,导致明文的e次方仍然小于n
这种情况直接对密文e次开方,即可得到明文
明文的三次方虽然比n大,但是大不了多少
爆破即可,每次加上一个n
如果选取的加密指数较低,并且使用了相同的加密指数给一个接受者的群发送相同的信息,那么可以进行广播攻击得到明文。
这个识别起来比较简单,一般来说都是给了三组加密的参数和明密文,其中题目很明确地能告诉你这三组的明文都是一样的,并且e都取了一个较小的数字。
主要利用的是私钥d很小,表现形式一般是e很大
github上有开源的攻击代码
识别:若干次加密,e不同,n相同,m相同。就可以在不分解n和求d的前提下,解出明文m。
首先,两个加密指数互质:
即存在s1、s2使得:
RSA是一种算法,并且广泛应用于现代,用于保密通信。
RSA算法涉及三个参数,n,e,d
,其中分为私钥和公钥,私钥是n,d
,公钥是n,e
n是两个素数的乘积,一般这两个素数在RSA中用字母p,q表示
一般CTF就是把我们想要获得的flag作为明文,RSA中表示为m。然后通过RSA加密,得到密文,RSA中表示为C。
一般来说,n,e是公开的,但是由于n一般是两个大素数的乘积,所以我们很难求解出d,所以RSA加密就是利用现代无法快速实现大素数的分解,所存在的一种安全的非对称加密。
对于字符串格式的验证语法
所有的计算机语言,正则表达式都是完全相同的
注:对于我们前端而言,正则表达式只需要会使用就可以了,一般不会再自己写需要的正则表达式
构造函数创建正则表达式
验证字符串内容是否符合正则表达式语法规范
如果符合,返回值是true
如果不符合,返回值是false
作用效果和html中的字符实体相同
使用特殊的符号表示对应的字符内容,防止程序执行冲突
//只定义 \d,字符串中只要有数字就可以 //只要有数字,结果就是true //都不是数字,结果就是false //只定义 \D,字符串中只要有非数字就可以 //只要有非数字,结果就是true //都是数字,结果就是false //只定义 \s,字符串中只要有空格就可以 //只要有空格,结果就是true //字符实体 在 html中 才会被识别成 对应的执行效果 //在 js中 只是 字符串内容而已 不会被识别解析 //只要不是非换行,结果就是true //只有换行,结果才是false具有特殊验证规范的关键词/运算符
//以数字开头,结果就是true
//以数字结尾,结果就是true
//从开头至结尾,只能是数字,并且只能有一个数字
正则表达式 -- 限定符
//从头到结尾,只能是数字,数字的个数是0 ~ 正无穷
//从开头到结尾,只能是数字,数字的个数是1 ~ 正无穷
//从开头到结尾,只能是数字,数字的个数是0 ~ 1
//从开头到结尾,只能是数字,数字的个数只能是3
//从开头到结尾,只能是数字,数字个数是3 ~ 正无穷
//从开头到结尾,只能是数字,数字的个数是3 ~ 5
正则表达式 -- 特殊符号
将()中的内容·作为一个整体 只要是[ ]中定义的内容就可以 n - m的内容都可以
配合正则表达式的字符串函数
//查询大写字符A,不区分大小写 //也就是a A都可以 //默认替换第一个符合的字符 //替换所有符合的字符
正则表达式不能解析变量
如果正则表达式中需要解析变量
1、使用模板字符串将变量解析
//给button标签添加点击事件 //获取input标签中的数据 //使用模板字符串解析含有变量的正则表达式 //解析的结果只是字符串而已 //没有正则表达式的功能,需要使用eval()来执行 //执行字符串调换操作,将结果写入span标签 //使用eval()执行正则字符串