NOIP复活了

我是标题党。。(为了上热搜)
真正的标题应该是

CSP-J-1复习


1.计算机的基本知识

这些需要死记硬背,所以我找了很多很好的图片放在这,一定要记住。不过应该没有太大的问题。

NOIP复活了_第1张图片


[外链图片转存失败(img-LA2cKlW4-1566606061989)(http://static.fuwo.com/upload/attachment/1605/19/cb531d081dac11e6999000163e00254c.jpg)]


NOIP复活了_第2张图片

注:2^10=1024


NOIP复活了_第3张图片


因为实在文件太大,只能搬运网址了实际上是因为没有下载券


NOIP复活了_第4张图片


十进制数转二进制数:

1、整数部分的转换

除以2倒取余数法,直到商为零

2、小数部分的转换

乘以2取整数法,直到乘积为零


二进制数转十进制数:

1、整数部分的转换

设二进制整数共有n位,将它的最高位乘以2的n-1次方,次高位乘以2的n-2次方,……,最后一位乘以2的0次方,这些乘积相加的和即所求的十进制整数。

2、小数部分的转换

设二进制小数共有n位,将它的最高位小数乘以2的-1次方,次高位乘以2的-2次方,……,最后一位乘以2的-n次方,将所有乘积加到一起,其和就是所求的十进制小数。


计算机的存储器中只能存储二进制数0、1,无法存储正负号。所以我们将数据用原码、反码、补码系统表示好存储到计算机中,有利于运算。

设:x=+0101,y=-1000。


一、原码

原码系统就是用0、1表示真值的符号,0表示正号,1表示负号。如:[x]原=00101,[y]原=11000。
注意:0有两种表示法[+0]原=00000,[-0]原=10000。
原码表示简单易懂,真值变换也方便,在进行乘除运算时也方便。符号位作异或运算,数据进行乘除运算。但加减运算比较复杂,如两数相加,如果同号,则数据相加,符号位不变。如果异号,则要判断两个数的大小,用大数减小数,结果符号与大数符号相同。在计算机中乘除运算都是利用加减运算完成的,所以原码系统使用不是很方便。


二、反码

反码系统也是用0、1表示真值的符号。真值为真与原码相同,为负则将数据每位求反,如:[x]反=00101,[y]反=10111。
注意:
1、0有两种表示法[+0]反=00000,[-0]反=11111。
2、两个数反码的和等于两数和的反码。当符号位进位时须循环进位。循环进位即将符号位的进位加到和的最低位上。
例1:x=+1001,y=-1011,计算x+y。
[x]反=01001,[y]反=10100,[x]反+[y]反=11101
x+y真值=-0010,[x+y]反=11101
例2:x=+1001,y=-0101,计算x+y。
[x]反=01001,[y]反=11010,[x]反+[y]反=100011,将首位的1取出与00011相加得到00100
x+y真值=+0100,[x+y]反=00100。
反码加减运算不必判断两数大小,还要有个循环进位。


三、补码

先介绍模和同余概念。对于两个整数a、b,同除一个数M,所得余数相等,则称a、b对模数M同余。记为a=b(Mod M)。
例如模为10,8+(-2)=8+8=16(Mod 10)=6,其中8就是(-2)的补码(模为10)。
注意:
1、0表示法惟一。
2、两个数补码的和等于两数和的补码。
3、负数的补码就是符号位不变,数据每位取反再加1。


1、克劳德·艾尔伍德·香农(Claude Elwood Shannon)

1916年4月30日-2001年2月26日

美国数学家、信息论的创始人,1940年在麻省理工学院获得硕士和博士学位,1941年进入贝尔实验室工作。香农提出了信息熵的概念,为信息论和数字通信奠定了基础。

香农理论的重要特征是熵(entropy)的概念,他证明熵与信息内容的不确定程度有等价关系。熵曾经是波尔兹曼在热力学第二定律引入的概念,我们可以把它理解为分子运动的混乱度。信息熵也有类似意义,例如在中文信息处理时,汉字的静态平均信息熵比较大,中文是9.65比特,英文是4.03比特。这表明中文的复杂程度高于英文,反映了中文词义丰富、行文简练,但处理难度也大。信息熵大,意味着不确定性也大。因此我们应该深入研究,以寻求中文信息处理的深层突破。不能盲目认为汉字是世界上最优美的文字,从而引申出汉字最容易处理的错误结论。

香农在进行信息的定量计算的时候,明确地把信息量定义为随机不定性程度的减少。这就表明了他对信息的理解:信息是用来减少随机不定性的东西。或香农逆定义:信息是确定性的增加。

虽然香农的信息概念比以往的认识有了巨大的进步,但仍存在局限性,这一概念同样没有包含信息的内容和价值,只考虑了随机型的不定性,没有从根本上回答“信息是什么?”的问题。


2、戈登·摩尔(Gordon Moore)

1929年-

美国科学家、企业家,世界头号CPU生产商Intel公司的创始人之一。1965年提出“摩尔定律”, 1968年创办Intel公司,1990年被布什总统授予“国家技术奖”。

1965年的一个无意的瞬间,摩尔发现出一个对后来计算机行业极为重大的定律,它发表在当年第35期《电子》杂志上,虽然只有3页纸的篇幅,但却是迄今为止半导体历史上最具意义的论文。在文章里,摩尔天才地预言说道,集成电路上能被集成的晶体管数目,将会以每18个月翻一番的速度稳定增长,并在今后数十年内保持着这种势头。摩尔所做的这个预言,因后来集成电路的发展而得以证明,并在较长时期保持了它的有效性,被人誉为“摩尔定律”,成为新兴电子电脑产业的“第一定律”。


3、查尔斯·巴比奇(Charles Babbage)

1792年-1871年

英国数学家,巴贝奇在1812至1813年初次想到用机械来计算数学表;后来,他制造了世界上第一台计算机,能进行8位数的某些数学运算。他于1834年发明了分析机(现代电子计算机的前身)的原理。

差分机(数学分析机器):1822年出现模型,能提高乘法速度和改进对数表等数字表的精确度。1834年,巴贝奇就已经提出了一项新的更大胆的设计并称之为分析机。


4、冯·诺依曼(John von Neumann):

1903年12月28日-1957年2月8日

20世纪最重要的数学家之一,在现代计算机、博弈论和核武器等诸多领域内有杰出建树的最伟大的科学全才之一;

被称为“计算机之父”和“博弈论之父”。

原籍匈牙利,布达佩斯大学数学博士,先后执教于柏林大学和汉堡大学。1930年前往美国,后入美国籍。历任普林斯顿大学、普林斯顿高级研究所教授,美国原子能委员会会员、美国全国科学院院士。

冯·诺伊曼对世界上第一台电子计算机ENIAC(电子数字积分计算机)的设计提出过建议,1945年3月他在共同讨论的基础上起草ENIAC(电子离散变量自动计算机)设计报告初稿,这对后来计算机的设计有决定性的影响,特别是确定计算机的结构,采用存储程序以及二进制编码等,至今仍为电子计算机设计者所遵循。

存储程序原理的主要思想:将程序和数据存放到计算机内部的存储器中,计算机在程序的控制下一步一步进行处理,直到得出结果。


5、阿兰·麦席森·图灵(Alan Mathison Turing):

1912年6月23日-1954年6月7日

英国著名的数学家和逻辑学家,被称为“计算机科学之父”、“人工智能之父”;

是计算机逻辑的奠基者,提出了“图灵机”和“图灵测试”等重要概念;

1912年6月23日出生于英国帕丁顿,1931年进入剑桥大学国王学院,师从著名数学家哈代,1938年在美国普林斯顿大学取得博士学位,二战爆发后返回剑桥,曾经协助军方破解德国的著名密码系统Enigma,帮助盟军取得了二战的胜利。


图灵奖:

图灵奖是美国计算机协会于1966年设立的,专门奖励那些对计算机事业作出重要贡献的个人;

图灵奖有“计算机界诺贝尔奖”之称;

图灵奖的名称取自计算机科学的先驱、英国科学家阿兰·图灵;

2000年美籍华裔计算机科学家姚期智获得图灵奖;

世界顶级奖项,奖励为计算机科学与技术领域做出杰出贡献的科学而设立。


6、奥古斯塔·艾达·洛夫莱斯(Ada Lovelace):

1815年12月10日-1852年11月27日

英国著名诗人拜伦的女儿;

曾设计了巴贝奇分析机上解伯努利方程的一个程序;

她甚至还建立了循环和子程序的概念;

由于她在程序设计上的开创性工作,Ada Lovelace被称为世界上第一位程序员。


如果你通过信息高速公路发出一条信息,你的计算机或其他的信息装置就可以用只有你才能使用的数字签字“签名”,信息将被加密,因此只有其特定的接收者方可破译。使这种现象成为可能的机械装置根据的是数学原理,其中包括“单向功能”和“公共密钥加密”原理。

“单向功能”是一种操作要比解开容易的功能。打碎一片玻璃是单向功能,但这对编码来说毫无用处。密码术所需的单向功能是:知道一条特殊信息,解码就会异常简单,而不知这条信息,解码就会十分困难。数学中有很多单向功能,其中之一与质数有关。

将两个质数11927和20903相乘,可以很容易地得出249310081。但是将它们的积249310081分解因子得出上述两个质数却要困难得多。这种单向功能,也就是分解因子的困难,预示了一种巧妙的密码:目前使用的一种最复杂的加密系统。即使最大的计算机将一个大的乘积数分解还原为组成此数的两个质数也要很长时间。建立在分解因子上的密码系统有两个不同的译码钥,一个用来给信息加密,另一个不同但却相关的是用来解密的。有了加密钥,把信息译成密码就相当简单,但只用它在可行时间内解密却不太可能。解密需要一个单独的密钥,只有信息的特定接收者或不如说接收者的计算机方可拥有。加密钥是基础是两个巨大的质数的乘积,而解密钥的基础则是质数本身。一台计算机可在瞬间内造出一对新的独特的密钥,因为对于计算机来说,选出两个大的质数并把它们相乘非常容易。加密钥造出后可公之于众而不会冒任何危险,因为即使另一台计算机将其分解因子后来取得解密钥也是非常困难的。

每一用户的计算机或其他的信息装置会使用质数来创造一个公开的加密钥和一个相应的只有用户本人知道的解密钥。在应用中它是这样工作的:我有信息要发给你,我的信息装置或计算机系统查找你的加密钥并在发出之前将信息加密。虽然你的密钥是公开的,但没有人能读懂加密的信息,因为公开密钥中不包含解密所需的信息。你收到信息后,你的计算机会用与你的公开密钥相对应的私人密钥将信息解密。

质数和它们的乘积要多大才能保证有效的单向功能呢?

公开密钥加密概念是威特菲尔德.迪菲和马丁.海尔曼于1977年首次提出的。另一组计算机科学家隆.里维斯特、阿迪.沙米尔和雷奥纳德.阿德尔曼,不久就提出了使用质数分解因子的想法,这也是以他们名字的首字母命名的RSA密码系统的一部分。他们提出,分解一个130位的两个质数和乘积数需要几百万年的时间,不管使用的计算机能力多大。为了证明这一点,他们找到下面这个129位数,并向世界挑战要他们找出它的两个因子。这个数就是圈内人熟悉的RAS 129:
114 381 625 757 888 867 669 235 779 976 146 612 010 218 296 721 242 362 562 561 842 935 706 935 245 733 897 830 597 123 563 958 705 058 989 075 147 599 290 026 879 543 541
他们坚信用这个数做的公开密钥加密的信息将会永远安全。但是他们既没有预料到摩尔定律的全面效应,也没有预料到个人计算机的成功。前者大大提高了计算机的能力,而后者则使全世界的计算机和用户数目得到了显著提高。1993年,世界各地600多个研究人员和爱好者通过使用Internet协调各自计算机的工作向这个129位数发动了进攻。不到一年,他们就分解出了这个数的两个质数,其中一个长64位,另一个长65位,这两个质数分别为:
3 490 529 510 847 650 949 147 849 619 903 898 133 417 764 638 493 387 843 990 820 577

32 769 132 993 266 709 549 961 988 190 834 461 413 177 642 967 992 942 539 798 288 533
加密的信息是:“吹毛求疵和鱼鹰是两个有魔力的单词”。

从这次挑战中得出的一个教训是:如果加密的信息确实重要并且高度机密的话,公开密钥的长度为129位仍不够长。另一个教训是:任何人对加密的安全性都不应过份肯定。

将密钥只增加几位数字分解起来就会困难得多。今天的数学家相信用可预测的未来计算能力分解两个250位长的质数的乘积要用数百万年。可是谁知道呢?这种不确定性,也就是有人会用简单方法将大数字分解因子的可能性,表明信息高速公路的软件平台将会设计成这样一种形式,那就是它的加密系统将会随时更换。

有一件事我们大可不必担心,即质数会用尽或两台计算机偶然会用同样的数字作为密钥。适当长度的质数数量比宇宙中原子的数量还要大得多,因此两个密钥偶然相同的机会微乎其微。

密钥加密的方法不仅仅可以保密,它还可以保证文件的真实性,因为用私人密钥编码的信息只能用公开密钥才能译码。它的工作方式如下:如果我有信息在发出之前需要签字,我的计算机会用我的私人密钥将其加密。现在这条信息只有用我的公开密钥,也就是你和所有其他人都知道的密钥方可解密。这条信息确实系我发出,因为没有其他人有用这种方法加密的私人密钥。我的计算机接收这条加密信息,再用你的公开密钥将此信息重新加密,然后通过信息高速公路把这条双重加密的信息传送给你。你的计算机收到信息后用你的私人密钥对其解密,这解除了第二层编码,但用我的私人密钥编的第一层密码仍然存在。然后你的计算机用我的公开密钥再次对其解密。因为它确实是由我发出的,如果这则信息解密正确,你也就知道它是真实的了。即使信息有些微小改动,信息就不能正确译码,而窜改或通信错误也就会很明显。这种特殊的安全性可使你同陌生人甚或不信息的人进行交易,因为你能确认数字货币的有效性以及签名的文件的真实性。

把时间特征加入到加密信息中可以进一步提高安全性。如果有人企图窜改文件书写或发出的时间,窜改很容易被察觉。这使得照片和图像的可信度得到恢复,过去因为对它们进行窜改是轻而易举的事,所以它们易受攻击。


一、整除

设 a、b 都是非 0 整数,如果存在一个整数 q,使得 b=a*q,那么就说 b 可被 a 整除,记作 a | b,且称 b 是 a 的倍数,a 是 b 的约数(因子)。例如:3 | 12,21 | 63。

整除的性质:

1、如果a | b 且 b | c,那么a | c

2、a | b 且 a | c 等价于对任意的整数 x、y,有 a | (bx+cy)

3、设 m<>0,那么 a | b 等价于 (ma) | (mb)

4、设整数 x、y 满足:ax+by=1,且 a | n、b | n,那么 (a*b) | n

证明:因为a | n 且 b | n,由性质 3 可得(ab) | (bn)且(ab) | (an)

再由性质 2 得(ab) | (anx+bn*y)

而anx+bny=n*(ax+by)=n*1=n

所以 (a*b) | n

5、若 b=q*d+c,那么 d | b 的充要条件是 d | c


一些有用的例子:
若 2 能整除 a 的最末位(约定 0 可以被任何数整除),则 2 | a;

若 4 能整除 a 的最后两位,则 4 | a;

若 8 能整除 a 的最后三位,则 8 | a;
……

若 3 能整除 a 的各位数字之和,则 3 | a;

若 9 能整除 a 的各位数字之和,则 9 | a;

若 11 能整除 a 的偶数位数字之和与奇数位数字之和的差,则 11 | a;

能被 7、11、13 整除的数的特征是:这个数的末三位数与末三位数以前的数字所组成的数之差能被 7、11、13 整除。

说明:将一个多于4位的整数在百位与千位之间分为两截,形成两个数,左边的是原来的千位、万位成为个位、十位(依此类推)。将这两个新数相减(较大的数减较小的数),所得的差不改变原来数能被7、11、13整除的特性。这个方法可以连续使用,直到所得的差小于1000为止。

例如:判断71858332能否被7、11、13整除?

这个数比较大,将它分成71858、332两个数(右边是三位数),71858-332=71526

再将71526分成71、526两个数(右边是三位数),526-71=455

由于455数比原数小得多,相对来说容易判断455能被7和13整除,不能被11整除,

所以原来的71858332能被7和13整除,不能被11整除


二、最大公约数与最小公倍数

一般地,设 a1、a2、a3、…、ak 是 k 个非 0 整数,如果存在一个非 0 整数 d,使得d | a1、d | a2、…、d | ak,那么 d 就称为a1、a2、a3、…、ak 的公约数。公约数中最大的一个称为最大公约数,记为GCD(a1、a2、a3、…、ak),显然它是存在的,至少为1。当GCD=1时,称这n个数是互质的或既约的。公约数一定是最大公约数的约数。

一般地,设 a1、a2、a3、…、ak 是 k 个非 0 整数,如果存在一个非 0 整数 d,使得a1 | d、a2 | d、…、ak | d,那么 d 就称为a1、a2、a3、…、ak 的公倍数。公倍数中最小的一个称为最小公倍数,记为LCM(a1、a2、a3、…、ak),显然它是存在的。公倍数一定是最小公倍数的倍数。

数学上,求两个数的最大公约数常用辗转相除法(或辗转相减法);而求两个数的最小公倍数的方法可以用穷举法或逐步倍增法,如求 3 和 8 的最小公倍数,可以让 n 从 1 开始逐步加 1,不断检查 8*n 是不是 3 的倍数。

定理:a、b 两个数的最大公约数乘以它们的最小公倍数等于 a 和 b 本身的乘积。


三、勾股数

对于正整数X、Y、Z,如果满足下列不定方程:XX+YY=Z*Z,则称这组正整数(X、Y、Z)为勾股数,它们有着不同的几何含义,如作为一个三角形的三条边。一般限定 X 和 Y 互质,且 X 为偶数。认为(4、3、5)和(6、8、10)为本质相同的勾股数,(X、Y、Z),(X、Z、Y),(Y、X、Z),(Y、Z、X),(Z、X、Y),(Z、Y、X)是一组相同的勾股数。

勾股数有如下性质:

1、X、Y、Z 一定两两互质

2、X、Y 一定一奇一偶

3、X+Z 一定是一个完全平方数

4、(Y+Z)/2 一定是一个完全平方数

5、XYZ 一定能被60整除


四、完全数
把全部因数之和(除其本身以外)等于本身的数称为完全数(perfect number,又称完美数)。

将本身大于其因数之和的数称为盈数;将本身小于其因数之和的数称为亏数。

6 是一个完全数,因为6=1+2+3;

直到1952年,人类才知道 12 个完全数,它们都是偶数,其中前三个是6、28和496。


五、亲和数

两个数是亲和的,即一个数的真因子的和等于另一个数。例如 284 和 220 就是亲和的,因为284的真因子是 1、2、4、71、142,其和为220;而220的真因子有 1、2、4、5、10、11、20、22、44、55、110,其和为284。

其余的亲和数有:1184 和 1210、17296 和 18416。

瑞士数学家欧拉着手于系统地寻找亲和数,1747 年他给出了一个 30 对亲和数的表,后来又扩展到超过 60 对。


六、同余

若 a、b 为两个整数,且它们的差 a-b 能被某个自然数 m 所整除,则称 a 就模 m 来说同余于 b ,或者说 a 和 b 关于模 m 同余,记为:a≡b(mod m)。它意味着:a-b=m*k(k 为某一个整数)。

例如:32≡2(mod 5),此时 k 为 6。


同余的性质:

对于整数 a、b、c 和自然数m、n,则对模 m 同余满足:

1、自反性:a≡a(mod m)

2、对称性:若 a≡b(mod m),则 b≡a(mod m)

3、传递性:若 a≡b(mod m),b≡c(mod m),则 a≡c(mod m)

4、同加性:若 a≡b(mod m),则 a+c≡b+c(mod m)

5、同乘性:若 a≡b(mod m),则 ac≡bc(mod m)

一般情况,若 a≡b(mod m),c≡d(mod m),则有 ac≡bd(mod m)

6、同幂性:若 a≡b(mod m),则(a 的 n 次方)≡ b 的 n 次方(mod m)

7、若 a mod p=x,a mod q=x,p、q 互质,则 a mod (p*q)=x。

证明:因为 a mod p=x,a mod q=x,p、q 互质

则一定存在整数 s,t,使 a=sp+x,a=tq+x

所以 sp=tq

则一定存在整数 r,使s=r*q

所以:a=rpq+x,得出:a mod(p*q)=x

但是,同余不满足同除性,即不满足:a/n≡b/n(mod m)

七、素质

素数又称质数,是指除了 1 和它本身以外,没有其他的约数的大于 1 的正整数,例如 2、3、5、7 等等,反之就是合数。1 既不是素数也不是合数。

素数就像整数世界里的原子,整个整数世界都是由这些素数原子组成的,比如 15=35,121=1111等。

2000年古希腊数学家欧几里德用反证法证明了:素数有无穷多个。他是这样证明的:设 a,b,c 是给定的素数,构造一个新的数:t=abc+1,则已有的素数 a,b,c 均不能整除 t ,所以要么 t 本身就是素数,此时 t 不等于 a,b,c 中任意一个数;要么 t 能被不同于 a,b,c 的某一个素数整除,因此必然存在一个素数 p 不同于已有的素数 a,b,c 。例如:235+1=31,357+1=106=2*53。也就是说,有了 n 个素数,就可以构造出第 n+1 个素数,因此素数有无穷多个。


拓展:

数学家们一直在寻找大质数,大质数在密码通信方面非常有用,他们设计了一种数论密码,编制方法如下:选定正整数 S 与某两个质数之积 R(一般R为100位以上的大数),对于明码数字 X,0<=X

R 和 S 可以公开,但需要保密的是 R=P*Q 的两个质因数 P 和 Q,P、Q均被取成 40 位以上的数,且 S 的选择使得 S 和 P-1及 S 和 Q-1 均互质。

要破这样的密文,需要从100 位以上的数 R,计算出它的两个 50 位左右的质因数 P 和 Q,即使使用最快的计算机也很难在短时间内破掉。

素数的几个定理:

1、惟一分解定理

若整数 a>=2,那么 a 一定可以表示为若干个素数的乘积(惟一形式),即:

a=p1p2p3*…*ps(其中 pj 为素数,称为 a 的质因子,1<=j<=s)

如:1260=22335*7

2、威尔逊(Wilson)定理

若 P 为素数,则(P-1)! ≡ -1(mod P),注:n ! 表示123*……*n。

威尔逊定理的逆定理也成立。即:若对某一正整数 P,有(P-1)! ≡ -1(mod P),则 P 一定为素数。

既然如此,则有(P-1)!+1 一定是 P的倍数。

3、费马(Fermat)定理

若 P 为素数,a 为正整数,且 a 和 P 互质,则:ap-1 ≡ 1(mod P)。

证明:

首先,P-1 个整数 a,2a,3a,…,(P-1)a 中没有一个是 P 的倍数。

其次,a,2a,3a,…,(P-1)a 中没有任何两个同余于模 P 的。

于是:a,2a,3a,…,(P-1)a 对模 P 的同余既不为 0,也没有两个同余相同,因此,这 P-1 个数对模 P 的同余一定是1,2,3,…,P-1 某一种排列,即:

a2a3a*…(P-1)a ≡ 123…*(P-1)(mod P)

化简为:

ap-1 *(P-1)! ≡ (P-1)! (mod P)

又由于 P 是素数,根据威尔逊定理得出(P-1)! 和 P 互质。所以约去(P-1)!

得到:ap-1 ≡ 1(mod P)

其实这是一种特殊情形,一般情况下,若 P 为素数,则:ap ≡ a(mod P),这就是著名的费马小定理。


4、欧拉定理

费马定理是用来阐述在素数模下,指数的同余性质。当模是合数的时候,就要应用范围更广的欧拉定理了。

(1)欧拉函数

设 n 为正整数,欧拉函数 φ(n)定义为不超过 n,且与 n 互质的正整数的个数。下表为 1<=n<=15 的 φ(n)值。

(2)引理1

A、如果 n 为某一个素数 p,则:φ(p)=p-1;

B、如果 n 为某一个素数 p 的幂次 pa,则:φ(pa)=(p-1)*pa-1;

C、如果 n 为任意两个素质的数 a,b 的积,则:φ(a*b)=φ(a)*φ(b);


八、Catalan 数

卡特兰数又称卡塔兰数,英文名Catalan number,是组合数学中一个常出现在各种计数问题中出现的数列。以比利时的数学家欧仁·查理·卡塔兰(1814–1894)的名字来命名,其前几项为:1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 208012, 742900, 2674440, 9694845, 35357670, 129644790, 477638700, 1767263190, 6564120420, 24466267020, 91482563640, 343059613650, 1289904147324, 4861946401452, …


信息安全常识科普

曹政

前天在新加坡IC咖啡做了一场关于信息安全的常识普及分享,主要是一些基本概念的澄清,以及对信息安全入门级别的了解。

我不是信息安全技术高手,很多很实际的技术细节可能不够了解,所以如果有一些概念错误或其他误导,也请技术高手指正

先说一些错误的概念


1、对于企业而言,信息安全是技术人员的工作。

错误,普通员工如果不注重安全很容易被突破。

内网安全往往是由非技术人员的疏忽造成的。

范例1: 某巨头互联网公司内网曾因某员工不安全的电脑导致ARP欺骗,导致内网dns解析遭受感染,在内网正常电脑的正常用户的访问本公司网址居然被转移到木马网址。

范例2:某信息安全上市公司因销售人员安全意识淡泊个人电脑被入侵,导致内网穿透,信息泄露很久后被发现。

全员信息安全意识培训非常重要。


2、良好的上网习惯,不乱下文件,不点开奇怪的文件,不上奇怪的网站,个人电脑就不会中病毒。所以,裸奔有理 的论调特别流行。

错误,15年前,从尼姆达病毒起,病毒和木马就已经具有了主动攻击性,他们根本不需要你点击和打开,会主动在网段内扫描和入侵有缺陷的主机。


3、装好杀毒软件,打好补丁,就不会被入侵被黑掉。

错误,0day攻击可以轻松穿透杀毒软件和打好最新补丁的系统。

名词解释:0day

我们知道每隔一段时间,微软,苹果或其他系统厂商都会公布安全漏洞,发布安全补丁,然后用户就会及时打补丁防止被入侵,那么我们想一个简单的问题,1、这个漏洞是系统厂商公布的时候才出现的么?2、在漏洞被系统厂商发现之前请问谁能防止基于这个漏洞的攻击?

很遗憾,事实,就是,没有,所以,在安全漏洞没有被系统厂商发现,或者被发现但安全补丁没有发布之前,这段时间,基于这个安全漏洞的攻击,就统称为0day,所以0day实际上不是一种技术形式,而是一种时间的概念,未公开的漏洞是广泛的,长期存在的,有一种说法叫做长老漏洞,什么是长老漏洞呢?比如说有款微软的操作系统漏洞,当微软发现这个漏洞的时候,其存在时间已经超过了10年。那么,这十年是否一直没有被人发现呢?很遗憾,只是没有被微软发现而已,在某些技术高手手里,这是一个通杀的入侵工具,想想可怕不。

那么,谁手里有0day呢,第一,各国军方,美国有,中国也有,俄罗斯有,以色列有,韩国有,日本也会有。第二,各大安全公司,有人会说,安全公司不是要讲操守,发现漏洞不是应该公告么? 有些会公告,有些不会,为什么不会呢? 因为有时候需要,比如说,两个安全公司去抢一个军方的订单,军方说了,你来检测一下我的系统,给我一个报告吧,如果你手里没有0day,你可能就竞争不过手里有0day的同行。你对手拿到了人家服务器的权限你没拿到,你不就丢单了么,你说其实你漏洞挖掘比对手强,不过你都公告了(你公告了系统厂商就有补丁了,有补丁了人家军方的运维也不是吃闲饭的,早就补了,明白这个逻辑不。),你看微软,google给你一沓感谢信呢,你想想军方领导人怎么想,尼玛另一家随时可以入侵我,而你不能,你让我跟你合作,我傻啊。第三,很不幸,一些个人高手和黑产手里也有,存在0day交易的地下黑市,简单说个数字概念,比如微软给TK教主发现的漏洞和利用方法发奖金,10万美元,大家觉得了不起,这是TK教主比较有操守,如果这个漏洞放到黑产的地下黑市里,100万美金都可以卖掉你信不信。 一个高危漏洞,在黑产手里的话,其价值是极为巨大的,很多人让我写写黑产,但我不敢,实话说,我惹不起他们。你看你看,我敢写黑社会,我不敢写黑产。写了黑社会我大不了不去香港了,写黑产我互联网的业务不要碰了。

那么问题来了,为什么系统厂商不给很高的奖金去奖励安全专家呢?而让漏洞流向黑产?这里还真不是钱的问题,而是存在一个悖论,如果系统厂商,对漏洞的奖励过高,会存在一个管理风险,如果奖金激励太大,那么系统厂商的开发工程师真有可能会故意留一些看上去很不小心的问题点,然后将这个问题点泄露给第三方的安全专家,分享奖金。所以,很多时候,利弊权衡,并不能只看一面。

名词解释:漏洞挖掘

什么叫漏洞挖掘,就是针对某个系统,某个应用,去分析其弱点并挖掘其可被利用的漏洞,其结果又分为高危漏洞和低危漏洞,高危一般是可以取得系统控制权,或者利用系统执行一些危险的操作。低危往往是可能导致系统不稳定,或者存在一些非机密信息泄露的可能。

发现漏洞和找到漏洞利用方法是两个步骤。

有的时候安全专家发现一个可能严重的漏洞,比如一个权限很高系统服务在一个偏僻的系统调用处存在一个溢出点。但这时只能说这可能是一个高危漏洞,有时候系统厂商会认为这个漏洞无法利用,当作低危漏洞来处理,这种情况以前很常见,但一旦找到漏洞利用方法,这才是实现一个完美的漏洞挖掘。所以微软很多对安全专家的重奖不是因为发现了一个漏洞,而是提供了一个非常巧妙的漏洞利用方法。

所以公众可能理解黑客是黑掉一个网站,或者黑掉一个账户,而漏洞挖掘不是这样的概念,一旦发现一个高危漏洞,比如说,发现微软操作系统的高危漏洞,可能所有这个版本的用户的电脑都可以被入侵,比如说发现mysql数据库的一个高危漏洞,可能所有使用mysql数据库服务并且存在外网访问接口的都可能被入侵。 所以漏洞挖掘的高手,他们并不是针对特定网站,特别目标去分析,他们的目标是主流的系统和应用。然后一旦有所成就,几乎就等于手里掌握了可以横扫互联网的核武器。 在这种情况下,你去说黑掉几个网站了不起,人家就只能呵呵了。

0day攻击应对策略:暂无

不过也不用过于紧张,如果你不是特别特别有价值的目标,一般人不会用0day对付你。互联网上有一次经典的0day攻击事件,被一个商业安全公司捅出来的,目标直指伊朗核设施,实施者是谁你猜猜看?


4、我输入可信的网站地址,访问的网站一定是安全的

错,DNS劫持可能让你即便输入了正确的网址,也会进入错误的网站。

DNS劫持是一种常见网络安全风险,但其实这里并不只有一种攻击途径,有很多途径可以劫持dns。

从你的主机开始,病毒木马可能会改写你的电脑的host文件,或者改写浏览器的钩子,导致你访问的目标网址被导向其控制者的手里。

如果你的主机是安全的,不能保证你邻居会不会用arp欺骗来干扰你。

这里说句公道话,arp欺骗曾经猖獗一时,对网民上网带来的伤害特别大,改写host和浏览器挂钩子也曾是中国互联网常见的毒瘤,360崛起后这些东西从某种角度基本上没有了(其实还有,一会说),我知道很多人讨厌360,但这个事实还是必须承认的,当然,3721是浏览器钩子的鼻祖。

你的邻居也安全,你访问的就安全了?你上网是不是默认配置dns的,电信接入商耍流氓在中国太普遍了。 那么你强设了可信任的dns,你访问网址就安全了? GFW的能力相信大部分人并不真正了解,为了本帐号的合法运营,此处忽略多个案例。

刚才说道,某种程度上,浏览器钩子和劫持不常见了,但不是真的没有了,只是特别恶意的基本被遏制了,但是依然有一种常见的,而且极具中国特色的,大家见怪不怪早就习惯的劫持行为,你们如果使用ie浏览器,输入错误网址或文字的时候,按照正常逻辑,应该是跳转到bing的搜索页,早前应该是msn的搜索页,但是很遗憾,在中国你几乎不可能看到这一幕,各种安全工具设置的浏览器钩子早将这个访问劫持了,侥幸没有劫持,也会被电信运营商劫持。这就是我们最常见而又最麻木的dns劫持,这个原因是因为利益链,因为对用户体验来说不是危害,所以没人觉得不对,不展开了。

移动互联网还存在假基站的问题,假基站在国内目前也很猖獗,能不能劫持DNS我不是很明确,但是伪造来电号码是稳稳的,今天我还看到朋友圈有人说亲戚收到移动官方发来短信,点过去链接操作结果被诈骗了几千元,投诉移动没有效果云云,我一看就是中了假基站的骗子短信。所以误以为信息是官方发送的。移动上网其实也是存在风险的。

此外,蹭免费wifi也存在dns劫持风险。


5、百度,新浪这种公司是安全的,所以我在这里的帐号也是安全的。

错误:彩虹库和撞库攻击屡屡突破巨头防线。

名词解释:彩虹库,社工库

还记得csdn爆库事件么,很多很多很多论坛社区的用户库都被黑客入侵并拿到过,有些是明文密码的被黑客100%拿到帐号密码,有些仅仅做了md5的被80%拿到,有些做了md5+md5的也差不多被80%拿到,除了做随机salt的几乎都被破的七七八八。(随机salt不解释了,下一篇会讲)

黑客们将彼此拿到的数据库里的用户名和密码,合并在一起,就是社工库,也叫彩虹库。 这个库的规模特别大,而且一直还在激增,实际上,社工库的历史特别的悠久,当你从媒体上看到的时候,已经流行了很多年了。

名词解释:撞库攻击

由于很多用户习惯在多个网站用同样的帐号和密码,所以一旦A网站的用户密码透露,有经验的黑客会去尝试用同样的帐号密码去b网站尝试,这就是所谓撞库攻击,新浪也好,百度也好,很多巨头都饱受撞库攻击的侵扰,而且很多帐号密码因此被泄露。

我在大约七八年前的时候一个安全圈的朋友曾把我百度的帐号密码发给我,让我赶紧去改密码,我大吃一惊,以为百度的帐号系统被入侵,后来询问才知道是因为对方通过社工库拿了我的帐号密码,随便一试就发现其实我在很多网站用的同样的密码,包括百度。

应对策略:不同网站密码保持不同;或者对高安全需求的网站强化密码。


6、我的密码很复杂,别人一定不会破解

错误,获取你的权限,其实未必需要你的密码

通过找回密码来暴力破解的以前非常常见

范例1:以前很多邮局都是有通过生日和回答问题来重设密码,通过程序暴力破解生日(最多5分钟)+猜测问题,是攻破很多小姑娘邮箱的绝招。

范例2:腾讯出过一个案例,以手机短信验证码来重设密码,但短信密码只有4位数字,暴力破解只需要9999次,程序员轻松搞定。

应对策略:验证码,而且是变态的验证码是防止程序暴力测试的重要方案。

SQL注入和跨站脚本是获取用户权限非常常见的攻击方式,流行超过15年,至今仍然广泛可用。

其原理是程序员在编写程序中对用户输入或浏览器传递参数校验不够严谨,黑客可以将可执行代码植入到正常的输入或参数中,导致程序员的代码被改写,其中SQL注入是改写数据库查询脚本,跨站脚本是改写浏览器的可执行脚本,但均可未授权获得用户身份并执行危险操作。很多巨头在此跌过跟头,至今不绝。

范例:某知名安全论坛管理员曾因为论坛程序不够严谨,被人用跨站脚本发帖拿走权限。

2000年左右的时候,SQL注入几乎可以入侵一切用户登录系统。现在情况好多了,但并未绝迹。


其他概念

嗅探侦听,sniffer

互联网数据传输会经过很多设备,通过特定软件截获传输的数据,可能会包括很多的敏感信息,包括不限于网站登录的帐号密码,邮件帐号密码等等。

应对策略:http是明文传输,https是加密传输, telnet是明文传输,ssh是加密传输,很多明文传输的协议还有对应加密传输的协议,敏感的浏览和登录行为尽可能使用加密传输方式。

当然,加密传输也存在证书风险,中间人攻击,这是另外一个话题,所以还是要装好的浏览器和安全工具,如果提示证书可能有问题,还是要小心一点。(提示证书有问题不代表一定有问题,评估一下自己操作的敏感程度)

世界上最大的嗅探侦听都在政府手里,美国有棱镜,中国有敏感词。


权限绕过

系统对权限的授权判断不严谨,被人绕过验证获得权限。

说个范例,好像是windows98吧,具体版本不记得了,出了一个中文输入法权限绕过漏洞,理论上你必须输入帐号和密码才能进入系统,但是输入帐号的时候可以调用输入法,输入法有个帮助选项,打开帮助找词条可以点击进入浏览器,进入浏览器后就可以直接输入c:\ 了,后面就一马平川,你可以通过浏览器点开cmd命令,然后命令行执行任何操作,系统就完全在你掌控了。

从整个操作流程而言,几乎没什么技术含量,就是一个设计漏洞,系统验证就被绕过了。

分布式拒绝服务攻击

用超过系统承受能力的请求,流量导致目标系统无法正常响应,实现攻击效果。

这里也包括非常多类型

针对协议弱点的攻击,比如syn flood。实施成本特别低,追溯难度极高,曾经特别流行。

针对流量带宽的攻击

针对应用程序的计算资源的攻击

针对域名解析的攻击

六省断网事件就不用解释了。

前段时间网易也被人打挂了半天,至今也没个啥说法出来。你去看梦幻西游苹果市场的畅销榜,从冲榜到第一名开始,梦幻西游连续几个多月一直是第一名,其中只有一天是第二名,就是那天,被人打挂了几个小时。

目前黑产这个领域规模特别大,以攻击威胁收保护费是常见手段,据说很多p2p金融公司都交过保护费了。这个我也只能说这么多,理由很简单,我真惹不起。


缓冲区溢出

漏洞挖掘的一个重要几乎领域,原理是因为程序中对数据段的长度判断不够严谨,导致数据段超出内存数据区间,从而覆盖代码执行区间,如果数据中在溢出点处编写了精心设计的代码,黑客的这部分代码就会以相关服务程序的权限执行,从而实现黑客目的。

大部分系统级别的高危漏洞来自于缓冲区溢出,苹果越狱的某些版本技术似乎也来自于缓冲区溢出技术的实现。

但因为这个太技术化,可能普通用户理解起来会比较困难。


综述

黑客入侵更多是一种思维方式,正常的程序员写程序是认为用户会正常请求和访问他的系统,对异常的处理都是非常简单的,而黑客的想法是伪造各种不正常的请求,欺骗系统,导致系统脱离其正常的执行流程,从而获得黑客所期望的结果,比如获取权限,或获取资料。

今天讲这些以科普为主,面向感兴趣的非技术人员,技术名词不展开,有兴趣的可以去自行搜索。

其他一些名词如APT,我自己也不是能解释哦很清楚,也建议自行搜索。

电影里那些啪啦啪啦敲键盘试密码的,都不是黑客,黑客没那么ShaBby。大部分入侵不需要去试密码。需要试的人家用程序去撞库。


栈是只能在某一端插入和删除的特殊线性表。

用桶堆积物品,先推进来的压在底下,随后一件一件往上堆。取走时,只能从上面一件一件取。堆和取都在顶部进行,底部一般是不动的。

栈就是一种类似桶堆积物品的数据结构,进行删除和插入的一端称栈顶,另一端称栈底。插入称为进栈(PUSH),删除则称为出栈(POP),栈也称为后进先出表(LIFO表)。

一个栈可以用定长为N的数组S来表示,用一个栈指针TOP指向栈项。若TOP=0,表示栈空,TOP=N时,表示栈满。进栈时TOP加1,出栈时TOP减1,当TOP<0时为下溢。栈指针在运算中永远指向栈项。

一、进栈(PUSH)算法

1、若TOP>=n时,则给出溢出信息,作出错处理(进栈前首先检查栈是否已满,满则溢出;不满则运行第2步)

2、置TOP=TOP+1(栈指针加1,指向进栈地址)

3、S(TOP)=X,结束(X为新进栈的元素)


二、出栈(POP)算法

1、若TOP<=0,则给出下溢信息,作出错处理(出栈前先检查是否已为空栈,空则下溢;不空则运行第2步)

2、X=S(TOP),(出栈后的元素赋给X)

3、TOP=TOP-1,结束(栈指针减1,指向栈顶)


打住

你已经看了600多行了,休息一会,听个笑话!

英语老师:Push的反义词是啥?

普通人:Pull!

程序猿:POP!

哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈


NOIP复活了_第5张图片


NOIP复活了_第6张图片


Thank you.觉得好的赞一个

你可能感兴趣的:(C++)