原创:号码日记(微信公众号ID:codelogs ),欢迎分享。 转载请控制出处。
在个人资料信息安全领域,通常会遇到“窃听”、“篡改”、“伪装”、“否认”等威胁,但密码学家们为解决这些问题提供了合适的密码学算法。 如下。
窃听:攻击者可以在网络上安装路由器,拦截所有通过的数据包。 这样会导致数据泄露。 密码学提供对称密码和公钥密码算法来加密数据并保证其机密性。 篡改:攻击者修复通过的数据包,使接收方获取错误的信息。 密码学提供单向散列函数以生成“数据指纹”以确保数据的完整性。 伪装:攻击者冒充发件人发送数据,使收件人获取虚假信息,提供密码学消息认证码,生成“认证码”,确保数据源的正确性。 否认:发送方本身就是攻击者,发送恶意请求后,谎称自己没有发送该请求,从密码学上提供了数字签名算法,使其不可否认。 对称加密、公钥加密、消息散列、消息认证码、数字签名等算法也称为密码学家工具箱。
加密的分类当前的加密算法主要分为两类,一类是对称加密,一类是不对称加密。 对称加密在实现方式中分为分组加密算法和流加密算法两种。
每次加密或解密数据中的特定长度的小块时,块加密( block cipher )都会打包此处的“块”,直到处理了前一块和下一块,以及处理了所有数据
典型的分组加密算法包括DES和AES。 例如,DES的包长度为64位,而AES的包长度为128位或192位或256位。 DES或AES的算法过程很复杂,这里不做介绍,但需要了解常用的基础运算XOR。
虽然XOR加密或位运算中通常使用and(and )-or )或( NOT )-not )运算,但是XOR )异或)的位运算也非常常用,且其运算规则如下:
简单来说,就是因为两边相同的结果是0,两边不同的结果是1,所以被称为“异或”。
将XOR运算应用于多位数据时,可以看到XOR具有非常好的自反特性,包括:
发现数据a和b异或后,变成了新的数据,新的数据和b异或后,又变成了a! 由此,令人惊讶的是,如果将b视为密钥,则XOR可以用于实现加密解密算法,加密解密过程只需要对数据和密钥进行XOR运算。 Linux命令创建XOR加密$ pip install XORtool#明文文件。 内容在hello $ echo-nhelloplain.txt $ xxd plain.txt 000000:68656 c6f hello #上用xor算法加密: encrypt.bin $ cat plain.txt|txt xor tool-xor-n-rpwd-f-encrypt.bin $ XXd encrypt.bin 00000:1812081 C18 . #用xx明文$ xor tool-xor-n-rpwd-ffd
用一个故事展开密码学各种算法的概念和用途。 背景如下。 男主:小李,女主:小红,男配:大小李,小李的哥哥,女配:小美,小红的好朋友小李和小红是同学,是专业的计算机,小李仰慕小红很久了!
恋爱日记:小李写情书是为了表达爱慕之情,小李写了情书,写了很久,决定送给小红,但不想被网络上的别人看到! 如下所示。
小李最近学习了XOR加密算法,所以用XOR加密了情书。 如下。
您可以在cat plain.txt|xor tool-xor-n-rpwd-f-encrypt.bin中看到,所有加密的数据都是乱码的,而且效果很好。
小李非常高兴,把自己的成果展示给哥哥小李! 李先生指出,这样的密码算法强度不够大,密码学家们很容易破译,并开始向李先生展示破译过程!
#统计原文字数$ grep-op.plain.txt|sort|uniq-c|sort-NR|head 66, 37你31的25我15是15不13一12想10会9都#统计密文字数$ xxd-G3-C3-PS encrypt.bin|sort|uniq-c|sort-NR | head 669 fcbe 83794 CAC 43197 ede 02596 fff 51596 efcb 1594 cfe 91394 cfe 41296 F4 d 71094 CBF e999 F4 d9#词数结构替换表$ paste ( xxd-G3-C3-PS encryps awk'{print$2}’|sed-e’s/) ) ) ) ) x/g ( ) ) grep-op.plain.txt|sort|uniq-c|sort-c ) ) ) ) x ) grep ) grop ) x96\xf4\xd7想\x94\xcb\xfe会\x99\xf4\ xd9都sed替换脚本$ paste ( xxd-G3-C3-PS encrypt.bin|sort-NR|head|awk ‘ { print $2} ‘|sed-e awk'{print$2} ‘ )|awk'{printf’s/%s ‘,$1,$2}’s/\x9f\xcb\xe8/,/g; s/\x94\xca\xc4/您/g; s/\x97\xed\xe0/的/g; s/\x96\xff\xf5/我/g; s/\x96\xef\xcb/是/g; s/\x94\xcf\xe9/否/g; s/\x94\xcf\xe4/一/g; s/\x96\xf4\xd7/想/g; s/\x94\xcb\xfe/会/g; s/\x99\xf4\xd9/都/g; 使用sed根据替换表替换密文。 如下所示。
知道一部分信息被复原了!
据大李先生介绍,XOR使用密码对每个数据字节进行异或后,实现了加密,这相当于一种置换表,各组的确定明文被确定密文置换。 然而,人类文章大多具有统计特征,例如汉语中“你”、“我”等单词出现频率较高,黑客收集大量人类文字并统计单词频率表,只能用单词频率表替代密集文中出现频率较高的密文
为了保守小李的秘密,大小李给小李用AES算法加密了情书,并发送给了小红.
恋爱日记:小红顺应心意收到情书后,非常感动。 为了表达自己的心情,小红拍了一张照片。 我修了很久。 我想寄给小李,但同时不想被别人看到。
小红也知道XOR可以加密,就用XOR算法加密了照片。 如下。
# bmp图像的前54个字节是图像元数据,请勿更改此部分。 ( head -c 54 image.bmp; tail-c 55 image.BMP|xor tool-xor-n-r password-f-) image2.bmp加密完成后,小红打开照片,发现照片确实不一样,但可以看到自己的大致样子。
小红,不行,加密算法要多改,这样熟人还能认出我! 为了解决这个问题,小红也打算使用密码学界广为人知的AES算法!
AES-ECB加密小红找到了以下代码,将图像加密如下。
( head -c 54 image.bmp; 在tail-c 55 image.BMP|OpenSSL enc-AES-128-EC B-e-in– out– k password ] image3. BMP中可以看到,AES算法很好
这张照片我已经认不出是小红了,但小红心里还有点疙瘩。 这张照片还是稍微露出了我的身体呢。
AES-CBC加密经过长时间搜索,小红发现AES有其他加密模式,如CBC。 因此,使用CBC模式进行了如下尝试。
( head -c 54 image.bmp; tail-c 55 image.BMP|OpenSSL enc-AES-128-CBC-e-in– out– k password-iv 0102030405060708 ) image4.bmp太棒了婴儿差点就出声了。 加密的照片,就像无法接收信号的黑白电视一样,宝宝不再认识自己了。 宝宝满意地笑了笑,把照片发给了小李。
加密模式
综上所述,为了使对称密码算法更可靠,密码专家们创造了一些新花样。 我们把这个称为加密模式。 一般的加密模式有ECB、CBC、CFB、CTR、OFB等。 这里只选择ECB和CBC进行介绍。 以下,ECB模式的ECB模式的全名是电子密码本模式(
在此模式下,所有小数据都使用相同的密钥和方法进行加密,就像上面提到的XOR加密算法一样。 因此,也解释了为什么图像加密后仍能看到轮廓。 这是因为密钥按小块进行了严格的加扰,因此在图像较大的情况下,会从宏中渗出少量的信息。
一般来说,目前不建议使用ECB模式加密数据。
CBC模式CBC模式被称为密文组链接模式( Cipher Block Chaining ),因为密文组以链式方式连接在一起。
您可以看到,CBC模式很巧妙,它对前一组加密生成的密文进行分组,参与下一组加密过程,对前一数据中的后一数据进行了加扰。
想象一下,实际上对加密进行分组的过程是在图像上撒沙子。 其中,图像是等待加密的数据,关键是沙子。 在ECB模式下,在每个区域播撒相同分布的砂子,在CBC模式下,每次播撒的砂子都会改变花纹。
可以看到,初始化向量在使用CBC模式时需要初始化向量IV。 实际上,它是一个包长的随机bit序列,用于提高第一个包的加密效果。 那是如何运作的呢?
初始化向量有时也称为盐( Salt )。 这就像盐一样工作,扰乱加密的数据。 简单地使用128位密钥会降低明文的前128位)的加密效果,从而使此数据包更容易被解密。 有了初始化向量后,由于初始化向量是随机的,第一个数据包也会受到干扰,看不到脸。
使用初始化向量还有另一个优点。 二次加密过程即使使用同一密钥,加密的密文也不同。
我有疑问。 如果解码方没有初始化向量,就不能解码。
是的,是的。 初始化向量需要传递给解密方。 一种方法是在每次加密时生成初始化向量,并将初始化向量连接到密文的开头。 是的,初始化向量不是密钥。 没有必要保密。 直接附加在密文上也没关系。
填充模式包加密算法还包括填充算法,如无填充、PKCS#5、PKCS#7、ISO 10126、ANSI X9.23和ZerosPadding。
为什么需要文件算法呢? 这是因为分组加密算法是按组加密的。 例如,如果包大小为128位,而最后一组明文数据小于128位,该怎么办? 在这种情况下,需要填充算法,而PKCS#7算法是目前使用最广泛的填充算法。
因此,如果在Java中使用AES加密数据,则应该传递的算法名称为AES/CBC/PKCS5Padding。 其中AES是算法,CBC是加密模式,PKCS5Padding是填充模式,PKCS5Padding实际上是blocksize=8byteter
pkcs5与pkcs7的区别: https://www.cn blogs.com/midea 0978/articles/1437257.html
流加密流加密( stream cipher )是连续处理数据流的一种加密算法。 流密码一般以1bit、8bit或32bit等为单位进行加密和解密。
常见的流加密算法有RC4、A5等,它们也是对称加密算法的一种,但目前分组加密算法更为广泛,故不多介绍。
非对称加密非对称加密也称为公钥密码,使用非对称加密算法需要生成一对密钥、公钥和私钥,加密方使用公钥进行加密,解密方使用私钥进行解密。
私钥:需要自己保持的私钥,不能让别人知道。 公钥:可以向大众公开使用,让他们与自己通信。 就像客户端和服务器模型一样,多个客户端拥有公钥,客户端使用公钥对数据进行加密后发送到服务端,加密后的数据只有拥有私钥的服务器才能解密。
注意:实际上,也可以使用私钥加密,使用公钥解密。 在后述的数字签名技术中使用该方法。
RSARSA是最广泛使用的公钥算法,由罗纳德李维斯特( Ron Rivest )、阿迪萨摩亚( addisamor )和伦纳德阿德曼( Leonard adman )于1977年提出。 他们三人曾在麻省理工学院工作。 RSA是他们三个姓的首字母组合而成。
RAS的实际加密和解密过程很简单,都是在对数据进行幂运算后采取模式。 按如下方式加密。 密文=明文^ E % N,其中e、n是两个数字的解密。 明文=密文^ D % N,其中d,n是两个数字
在此,( e,n )组合为公钥,( d,n )组合为私钥。 如下所示,假设E=5,N=323,D=29,可以看到234经过RSA加密为81,经过RSA解密后恢复为234。
$bcbc1.07.1copyright1991-1994、1997、1998、2000、2004、2006、2008、2012-2017 freesoftware foundation、 Inc.thisisfreesoftwarewithabsolutelynowarranty.fordetailstype ` warranty ‘.234 ^ 5238181 ^ 2923234当然e、n、d是随意得到的数字
这里省略了密钥对生成的详细信息以及RSA解密的数学证明。 阮一峰解析:见https://www.Ruan Yifeng.com/blog/2013/06/RSA _ algorithm _ part _ one.html 339
非对称加密算法除RSA外,还有Bergamer、拉宾、ECC等,一般来说,非对称加密算法是基于数学难题实现的。 例如,RSA基于质因数分解的课题。
另外,非对称加密算法还具有加密后的数据不能自己解密,只能由拥有其他密钥的人解密的特点。
模运算RSA的数学原理很复杂,但是用RSA加密的密文,可以通过简单的联合定理理解为主要贡献是模运算。 全等数:如果p,c对m求模所得的馀数相同,则模m称为p,c全等数。 联合运算规则中有以下联合式的加法运算。 ( A B ) ) c=( a ) cb ) c ) ) c假设C=256(1) 1字节大小),利用该规则,得到以下运算过程。
将x视为a,将127~129视为b,将( x 127~129 ) % 256 ) % 256 ) % 127~129 ) 256 )=x % 6视为a,将129视为b ( ( x 127~129 ) ) % 256 ) x%6=(x127 ) 256129 )如果256小于256,则由于x % 256=x,因此x=( ) x127 ) 256129 ) 256,因此非对称加密算法的结果如下: ( x 127 ) % 256=S )密文)解密) S 129 ) 256=( ) x 127 ) (其中公钥为6527,256 ),其中RSA使用模式乘方运算
可以认为基于模运算的密码破译是在不停地转。 起始明文位于以下位置:
加密后,行驶到将近半圈,到达了160 (密文)的位置。 如下所示。
进一步解密后,跑完一圈,回到了33 (明文)的位置。
当然,这种不对称加密算法不安全,如下所示。
该算法只需绕一圈就能回归明文,根据密文规律很容易估计明文,但RSA算法和解码均采用模幂运算,由于绕圈较多,译码难度较大,在数学上被称为离散对数难题。 该算法公钥和私钥之和是循环的,易于从公钥中估计私钥,而RSA算法公钥和私钥的隐式数学关系更为复杂,为了从公钥中估计私钥,需要解决大量质因数分解问题。 Linux工具命令#生成私钥和公钥OpenSSL genrsa-out RSA _ private _ key.PEM 2048 OpenSSL RSA-in RSA _ private _ key.PEM-out RSA _ key
#读取私钥信息$ OpenSSL RSA-in RSA _ private _ key.PEM-text-nooutrsaprivate-key:( 2048位, 2 primes ) modulus:00:D1:ca:47:3a:C5:34:B1:2f:4e:a7:29:0d:99:de:51:89:AE:1c:1f:89 privive F3:12:49 f:C1:85:81:4b:75:A8:88:7c:5e:a6:3b:9e:D1:3c:02:53:E0:2e:F2: prime2: 00 24:07:d9:07:09 0c:b8:B4:45:13:0e:5c:27:da:13:F0:C3:1d:C9:02:2f:12:FB:82:c0:71:71 读取公钥信息$ OpenSSL RSA-pub in-in RSA _ public _ key.PEM-text-noout RSA modulus:00:D1:ca:47:3a:C5:34:B1
#加密$ echo-n hello|opensslrsautl-encrypt-in– inkey RSA _ public _ key.PEM-pub in-out encrypt.bin #解密$ opey
对称加密算法加密速度快,因为大多数操作都是类似XOR的位运算,而类似客户端-服务器的模式需要为每个客户端分配对称密钥,密钥管理难度较大。 不对称加密算法可以将公钥通知所有客户端,服务端使用私钥解密,能很好地适应客户端-服务器模型,但由于需要数学运算,加密速度较慢。 爱情日记:提高沟通效率小李和小红了解了对称和不对称加密算法的优缺点,决定同时使用两种密码学算法。 如下。
小红首先随机生成对称密钥,使用公钥算法进行加密,然后将加密后的对称密钥发送给小李。 小李用私钥解密对称密钥。 然后小红和小李用对称密钥解密数据,完成信息的互通。 然后,小红和小李决定每隔一天生成一个新的对称密钥。 混合密码系统嗯,他们俩的这个方法真好。 结合这种加密算法的优缺点的方法在密码学中被称为混合加密系统,例如SSL/TLS是典型的混合加密系统,它是SSL/TLS中的一个加密套件TLS _ ECD he _ RSA _ with _ AES _ TLS
密钥轮换小李和小红每隔一天交换一次对称密钥。 这种定期更改密钥的方式称为密钥轮换。 按键轮换在秘密通信场景中也经常使用。 这样,即使某个密钥被泄露,所有加密数据也不会受到保护。
但是,大李先生知道了他们的这个方案,笑着说。 “你们的这个方案没有满足前瞻性的安全性呢。
前向安全性简单地说,前向安全性是指即使你的主密钥被泄露后,在泄露时间点之前传输的数据也是安全的,即使攻击者在网络上截获并保存了你们以前的所有通信数据,也是安全的。
像小李和小红一样其实发明了最简单的密钥协商方式。 这种方式是红小姐用RSA公钥加密对称密钥后,直接通过网络发送给对方,但是如果李先生的RSA私钥不小心泄露了,他们以前每次协商就可以解密对称密钥,也可以解密通信数据!
因此,这种基于加密协商密钥的方案不满足前向安全性。
为此,密码学家们发明了非常巧妙的加密算法,使得通信双方可以计算相同的密钥而不用直接在网络上传输密钥。 这样的算法统称为DH和ECDH等密钥协商算法。
DH(Diffie-Hellman )算法原理如下。
假设Ali和Bob需要互相通信和共享密钥
Ali首先向Bob赋予明文共享参数p,g。 任何人都知道该信息,Ali自身生成随机数a(Ali的私钥),不告诉包括Bob在内的任何人a,Bob自身生成随机数b ),不告诉b bob的私钥),从而向包括Ali在内的任何人传递Ali计算) g^a ) p ) b )用p=s获得共享密钥的Ali也同样) g ) b%p ) a%p=g ) ) b )用p=s获得共享密钥的DH算法的安全性基于离散对数的课题,p
另一方面,ECDH是一种结合ECC和DH的密钥协商算法,其安全性基于椭圆曲线上的离散对数问题。
恋爱日记)残缺的照片本来小红和好朋友小美就不见了,现在小红很少和她玩了。 然后小红天天在她面前炫耀男朋友,小米醋心大了,心里不高兴,决定用棍子打鸳鸯。 于是她躲在网上,胡乱修改了小红发给小李的密文,然后转发给小李。 变成下面这样。
#小美将图像的第90000个组( 16字节)之后的160000字节篡改为随机字节( head-c$ ) ( 5416*90000 ) ) image4.bmp。 head -c 160000 /dev/urandom; tail-c$((5416*90000160000 ) ) ) image4.bmp ) image5.bmp然后,小李把图片解码,自己收到的图片解码后,她的照片里的一些区域乱七八糟如下。
( head -c 54 image5.bmp; tail-c 55 image5. BMP|OpenSSL enc-AES-128-CBC-d-in– out– k password-iv 0102030405060708 ) image6.bmp李先生是
是的,AES算法保证机密性,但不能防止他人篡改密文。 有以下两种方法可以解决此问题:
使用认证加密算法可以防止类似于AES-GCM算法的篡改。 这样的算法统称为AEAD算法,在此不多讨论。 使用单向散列算法,如MD5、SHA1和SHA256。 这个现在开始说明。 单向散列算法,也称为“密码学”散列算法,主要作用是生成数据的散列值,也称为消息摘要或指纹,用于验证数据在传输过程中是否被篡改常见的散列算法有MD5、SHA1等
哈希算法(如CRC32和CRC64 )也可以生成32位或64位数据摘要,但由于不是密码学领域的设计,因此生成的数据哈希值容易冲突,从不同数据生成的哈希值相同。
单向散列算法具有以下特点。
抗冲突能力强,即使只改变1比特的原始数据,哈希值也会发生很大的变化,找到哈希值这样对人类有意义的两个数据非常困难。 虽然可以根据单向的数据计算哈希值,但是无法根据哈希值计算数据。 单向散列算法的用途:
原始数据更改会更改哈希值,因此可以使用密码学哈希算法(如MD5 )来检测数据是否被篡改。 像MD5等密码学哈希算法一样,它们通常具有很强的抗冲突能力,对于人类生成的有意义的不同数据几乎不可能生成相同的哈希值,因此MD5等算法用于生成数据的唯一标识符Linux工具命令在Linux上,可以使用以下命令使用单向散列算法:
# md5生成128位散列字节$ echo-n hello|m D5 sum 5d 41402 abc4 B2 a 76 b 9719 d 911017 c 592-# sha1生成160位散列字节$echo-nhello| sha1sum AAF 4c 61 DD cc5 E8 a2 dabe de 0f 3b 482 CD9AEA 9434 d-# sha 256使用256位散列字节$ echo -n hello | 产生的sha256sum 2cf 24 db a5 FB 0a 30 e26 e 83 B2 AC 5b 9e 29 e 1b 161 e5C1 fa 7425 e 7304362938 b 9824 -通常,产生的哈希值的长度越长,抗冲突能力越强,因此现在使用sha256
恋爱日记:我讨厌你! 了解单向哈希算法的作用后,小红和小李将SHA256用于后来的通信。 如果小李发现图片的哈希值和小红给的不对应,让小红再发一次就行了。
很快小美也注意到了这个状况,心情变得更不愉快了。 她经过反复考虑,想让小红能够生成散列值。 我也可以。 于是小美给小李发送了“我讨厌你”的信息,还发送了该消息的SHA256哈希值。
小李接到这个消息后,大受打击,不知道在哪里让小红不高兴了。 但是,和小红沟通后,小红发现根本没有发来这个消息。 有人冒充小红给小李发了信息,连哈希值都有,不知如何是好的小李,又找到了大小李。
李先生笑了,你们是时候使用消息验证码技术了.
消息认证码、消息认证码( message authentication code )是用于确认和认证其完整性的技术,它以三个单词的开头字母表示,简称为MAC。
消息认证码输入包含任意长度的消息以及发件人和收件人之间共享的密钥,可以输出固定长度的数据,称为MAC值。
密码学家们发明了许多消息认证码算法。 最常见的有两种,一种是HMAC,俗称Hash MAC,顾名思义是基于密码学哈希算法实现的消息认证码算法,另一种是CMAC,顾名思义是密码
在HMAC中一般的HMAC算法是如下这样的标准HMAC算法。
HMAC算法的特征是能够自由组合单向散列算法,例如MD5、SHA1、SHA256。 例如,Java中的HMACWithSha256算法是将SHA256组合在hmac上。
Linux工具命令在Linux上,hmac256命令为hmacWithSha256,如下所示:
$ echo-n ‘ hello ‘|hmac 256 ‘ secret ‘ 88 aab 3e de 8d3ADF 94 d 26 ab 90 D3 bafd 4a 2083070 C3 bcce 9c 014 ee 04 a 443847 c0b还在开放平台上签名
另外,在使用该拼接方式实现MAC算法的情况下,希望在text的两侧拼接一些东西。 具体为:散列长度扩展攻击: https://www.cn blogs.com/dre0m1/p/15858202.html
恋爱日记:我喜欢你! 小红和小李知道消息认证码技术后,马上决定使用HMAC算法。 这也很快被小美发现了。 小美发现好像不能冒充小红发信息。 我不知道他们使用HMAC时的钥匙,所以想不开.
有一次,小红被逗得捧腹大笑,一时兴奋,对小李说:“我喜欢你。”后来小红又后悔了,觉得自己是这么主动表达自己的,以后的恋爱过程就被小李掌握了。
小李兴高采烈地马上去找小红,结果小红否认这个消息是她发的。 小李和小红起了争执,说钥匙只有你知道,不是你送的,不是我送的。
小红故意淘气,没人知道你是不是自恋!
小李回家后,把这件事告诉了小李。 李先生安慰李先生说,是时候使用数字签名技术了.
数字签名根据上述问题可知,消息认证码是不可否认的。 为什么这么说呢,因为通信双方都有同样的密钥。 为了解决这个问题,发送方和接收方需要使用不同的密钥。 数字签名技术是发送方用一个密钥签名,接收方用另一个密钥验证签名。
不对称加密技术是一种使用不同密钥和解密的技术,可以满足数字签名的需要,如下所示:
数字签名的生成和验证过程与公钥加密的过程正好相反,如下所示。
公开密钥加密的过程,发送侧用公开密钥加密,接收侧用秘密密钥解密。 公钥签名的过程是签名者用私钥生成签名,签名者用公钥验证签名。 在数字签名过程中,需要注意以下两点。
签名是指私钥的加密,验证是指用公钥对签名值、即密文进行解密,并与明文进行比较。 为了加快签名验证的速度,在签名(加密)前对明文数据进行散列化,并在解密后与明文散列值进行比较。 注:理论上,可以用公钥签名,也可以用私钥签名,但从定义上来说,公钥是公开给别人的密钥,所以如果有很多人可以用公钥签名,就不符合签名的需要了。
Linux工具命令# 生成私钥和公钥OpenSSL genrsa-out RSA _ private _ key.PEM 2048 OpenSSL RSA-in RSA _ private _ key.PEM-out RSA _ public openssslric 因为只有签名拥有n # opensslrsautl-verify-insign-inkey RSA _ pub bling的验证私钥。 其他人将无法生成签名,包括公钥持有者。
恋爱日记:分手吧! 在李先生介绍了数字签名技术后,李先生和小红很快使用了RSAWithSha256签名算法。 当然,这需要两个人分别生成一对密钥。 如下所示。
小红自己生成一对私钥后,把公钥发给小李,私钥自己保存,不告诉任何人。 李先生自己也生成一对私钥后,将公钥发送给小红,私钥也自己保存,不告诉任何人。 小红发送消息时,同时使用自己的私钥计算消息的签名并发送给小李,小李用小红的公钥检查签名。 小李发送消息的时候,也用自己的私钥计算消息的签名并发送给小红,小红用小李的公钥检查签名。 看起来很完美,小红和小李都不能否定新闻了! 但是,好景不长。 小美为了破坏恋爱过程,发现了攻击中间人的手段。 如下。
所谓中间人攻击,例如在与Alice (小红: Bob :李)进行通信的情况下,需要将Bob的公开密钥发送到Alice,但在Alice与Bob之间存在Mallory :小美),从而Mallory在监听到了从Bob发送来的公开密钥之后
于是,小美在小红和小李互相发送公钥时,截获并保存了他们的公钥,然后将自己的公钥双向发送! 于是,小美在途中能做自己喜欢的事情,给双方寄去了“分手吧”。 如下。
小红用私钥签名消息时,小美截获了消息,给小李发了一条“分手吧”的信息,同时用自己的私钥在消息上签名,签名也发给了小李。 李先生收到信息后,使用“小红的公钥”检查签名。 这个公钥其实是小美的公钥。 我在那里检查了一下签名并通过了。 小李确信信息是小红发的。 小红也一样,收到了“分手吧”的信息,笃定的信息是小李发的。 哎呀呀,小李和小红伤心欲绝,差点儿就分手了。 好在李先生知道这个消息后,认真考察了李先生和小红,以为他们确实没有发这个消息,推测可能发生了中间人攻击。
小李安慰了小红和小李后,说:“我给你们俩做个保证。 用你们的公钥做证书吧。
证书信任问题和PKI上发生中间人攻击,是因为小红收到小李的公钥时,不知道该公钥是否属于小李。 反之亦然。 那么,怎么证明那个公钥是小李的呢?
一个是公钥上需要写小李的名字,小李可以在公钥上写“小李”。 小美也可以在公钥上写“小李”。 因此,光有名字是不够的。 另一个需要在公钥上进行数字签名。 就像印章一样。 谁来按这个印章呢? 想想看。 我们会在一生中制作各种证书。 学生证、身份证、结婚证、房产证。 为什么你出示结婚证,别人就会相信你结婚了? 因为结婚证是国家颁发的。 上面有国家机关盖章的印章。 我们普通人有理由相信国家盖章的证书是真正的证书。 毕竟,那个印章很难伪造,谁也不敢伪造。
在计算机世界中,为了解决公钥认证的问题,也构建了公钥基础设施PKI和认证机构CA。 例如,李先生用自己的公开密钥写下名字,大李先生( CA认证机构)用自己的秘密密钥生成数字签名,将公开密钥、名字、数字签名打包在一个文件中。 该文件是李先生的数字证书,就像中情局)大李)盖了印章一样。
另一方面,小红收到小李的数字证书后,首先用大李( CA机构)的公钥验证数字签名是否正确,然后确认证书上的名字是否是小李,确认数字签名和名字是否正确后,取出证书的公钥,小李
在这里面,李先生很像中情局。 小李可以私下把自己的公钥给小李和小红。
那么,对于互联网上千百万的网民,怎么会有CA机构的公钥呢? 这是因为CA机关与OS、浏览器制造商合作,预先将它们的公钥默认内置于OS和浏览器中。
证书示例:百度网站的证书,如下所示
在证书中可以看到这样的证书路径。 这是一个递归过程,大的CA机构可以在中等CA机构的证书上盖章,中等的CA机构又可以在小的CA机构的证书上盖章。 这样下去的话会变成木材,所以我们的证明书一般都是被根CA机关委托了几次之后,在CA机关盖章。
curl和openssl还显示证书信息,例如:
curl-v https://www.Baidu.comopenssls _ client-connect www.Baidu.com:443-pr exit注:这里红和李都生成了证书,但CS架构因为这里红先生和李先生都需要生成证书,而且SSL/TLS其实可以被配置为双向认证。
你可能对CA机构的职责有疑问,我会自己生成公钥,在公钥上写下名字baidu.com,对CA机构签名。 那个可以不同地实施中间人攻击吗?
确实有这种可能性,但CA机构并不是随便在证书上签名的。 发行各种证明材料,请他们严格审查。 只有在你确实被认定为baidu的情况下才会在证书上签名。
另外,只要CA机关的私钥不被泄露,签名是可靠的。 为了防止自己的私钥被泄露,需要严密控制对私钥的访问,也需要向私钥存放处派遣无人值守的人。 因此,CA机构出具证明需要收钱,就像国家为了保证你的安全需要收税一样。
恋爱日记:快乐的时光终于,用了证件后,小红和小李迎来了他们的快乐时光! 但小美在得知社会工程学攻击后,偷偷和大李约会了.
密码算法推荐加密算法,推荐AES。 加密模式使用CBC或GCM。 普通安全级别的AES128就足够了,但考虑到量子计算机的威胁,绝密场景推荐使用AES256。 RSA算法必须至少使用2048位的密钥长度以确保安全性。 为了确保前向安全性,密钥协商算法建议使用ECDH密钥协商算法,密钥长度至少为384位。 哈希验证算法目前不推荐使用MD5、SHA1。 HMAC算法现在也非常安全。