文章目录
对称算法
目标:
-
了解每个概念的涵义
-
对称算法有哪些,了解使用算法加密的实现过程
正文:
-
什么是对称算法:数据发信方将明文(原始数据)和加密密钥一起经过特殊加密算法处理后,使其变成复杂的加密密文发送出去。收信方收到密文后,若想解读原文,则需要使用加密用过的密钥及相同算法的逆算法对密文进行解密,才能使其恢复成可读明文。在对称加密算法中,使用的密钥只有一个,发收信双方都使用这个密钥对数据进行加密和解密,这就要求解密方事先必须知道加密密钥。
-
对称加密算法:
DES算法(美国数据加密标准):明文按64位进行分组,密钥长64位,密钥事实上是56位参与DES运算(第8、16、24、32、40、48、56、64位是校验位, 使得每个密钥都有奇数个1)分组后的明文组和56位的密钥按位替代或交换的方法形成密文组的加密方法。 -
特点:分组比较短、密钥太短、密码生命周期短、运算速度较慢。
-
步骤:
分块-初始置换(置换表)-分成左右各32位-右边32位数据进行扩展置换(从32位置换位48位)-48位明文和48位密钥异或运算-s盒压缩处理(将48位的分成8组,将每组的首位取出组成一个二进制,转换为十进制后作为行,中间四位转化十进制作为列通过压缩置换表找到对应数据,转换为二进制)-p盒置换
具体:
密钥:初始密钥(64位)通过置换选择表去除奇偶校验得56位,将56位密钥分为左右各28位,根据循环左移表(前面的往后面放,左移位数参照左移表)分别进行左移然后合并,在进行压缩置换,得到48位的k0密钥,重复进行16轮操作,并各自进行不同位数的压缩置换得到k0-k15的密钥
明文:通过置换表得到左右各32位,右边进行扩展置换得到48位,再与48位的密钥进行异或,在经过s盒压缩为32位(将48位分成8组每组6位的块,每组的第一位和最后一位的组合为行标,中间四位作为列标),在通过p置换得到结果,再与左边异或得到结果作为下一轮的右边本轮的右边作为下一组的左边,最后一组左右交换,逆置换
-
3DES算法(三重数据加密算法TDEA):它相当于是对每个数据块应用三次DES加密算法
-
过程:设Ek()和Dk()代表DES算法的加密和解密过程,K代表DES算法使用的密钥,P代表明文,C代表密文,这样:
3DES加密过程为:C=Ek3(Dk2(Ek1§))
3DES解密过程为:P=Dk1(EK2(Dk3©))
K1、K2、K3决定了算法的安全性,若三个密钥互不相同,本质上就相当于用一个长为168位的密钥进行加密。多年来,它在对付强力攻击时是比较安全的。若数据对安全性要求不那么高,K1可以等于K3。在这种情况下,密钥的有效长度为112位。
TDEA算法:
BLOWFISH算法:
RC5算法:
IDEA算法:
AES(高级加密标准):
非对称算法
- 工作原理:
.A要向B发送信息,A和B都要产生一对用于加密和解密的公钥和私钥。
2.A的私钥保密,A的公钥告诉B;B的私钥保密,B的公钥告诉A。
3.A要给B发送信息时,A用B的公钥加密信息,因为A知道B的公钥。
4.A将这个消息发给B(已经用B的公钥加密消息)。
5.B收到这个消息后,B用自己的私钥解密A的消息。其他所有收到这个报文的人都无法解密,因为只有B才有B的私钥。
:
摘要算法
一般分为三类:MD、SHA、MAC
- MD (消息摘要):生成的消息摘要都是128位的。包括:MD2(jdk),MD4(Bouncy Castle),MD5(jdk)
从安全性上说:MD5 > MD4 > MD2
MD2:首先对信息进行数据补位,使信息的字节长度是16的倍数
MD4:算法同样需要填补信息以确保信息的比特位长度减去448后能被512整除(信息比特位长度mod 512 = 448)
- SHA算法(安全散列算法):
- 包括:SHA-1,SHA-2(SHA-224,SHA-256,SHA-384,SHA-512)
- HMAC(keyed-Hash Message Authentication Code):含有密钥的散列函数算法
包含了MD和SHA两个系列的消息摘要算法
MD系列:HmacMD2,HmacMD4,HmacMD5
SHA系列:HmacSHA1,HmacSHA224,HmacSHA256,HmacSHA38,HmacSHA512
对称加解密
-
DES:
-
AES:
非对称加解密
- RSA:
生成二个大素数: p、q
计算二个大数的乘积: n = p * q
计算n的欧拉函数: φ(n) = (p-1)(q-1)
m:明文
e:加密密钥,随机选择e小于φ(n),且和φ(n)互质,一般为3、5、17、257、65537
c:密文
n:大数质数
d:解密密钥 d ≡ 1 mod φ(n)/e
加密: C = M ^ e mod n
解密: M = C ^ d mod n
数字签名
数字签名的原理是将要传送的明文通过一种函数运算(Hash)转换成报文摘要(不同的明文对应不同的报文摘要),报文摘要加密后与明文一起传送给接受方,接受方将接受的明文产生新的报文摘要与发送方的发来报文摘要解密比较,比较结果一致表示明文未被改动,如果不一致表示明文已被篡改。
分组加密模式
ECB/CBC/CFB/OFB/CTR
1. ECB - Electronic Code Book, 电子密码本模式
特点: 简单, 效率高, 密文有规律, 容易被破解
最后一个明文分组必须要填充
des/3des -> 最后一个分组填充满8字节
aes -> 最后一个分组填充满16字节
不需要初始化向量
2. CBC - Cipher Block Chaining, 密码块链模式(推荐使用)
特点: 密文没有规律, 经常使用的加密方式
最后一个明文分组需要填充
des/3des -> 最后一个分组填充满8字节
aes -> 最后一个分组填充满16字节
需要一个初始化向量 - 一个数组
数组的长度: 与明文分组相等
数据来源: 负责加密的人的提供的
加解密使用的初始化向量值必须相同
3. CFB - Cipher FeedBack, 密文反馈模式
特点: 密文没有规律, 明文分组是和一个数据流进行的按位异或操作, 最终生成了密文
需要一个初始化向量 - 一个数组
数组的长度: 与明文分组相等
数据来源: 负责加密的人的提供的
加解密使用的初始化向量值必须相同
不需要填充
4. OFB - Output-Feedback, 输出反馈模式
特点: 密文没有规律, 明文分组是和一个数据流进行的按位异或操作, 最终生成了密文
需要一个初始化向量 - 一个数组
数组的长度: 与明文分组相等
数据来源: 负责加密的人的提供的
加解密使用的初始化向量值必须相同
不需要填充
5. CTR - CounTeR, 计数器模式(重点,推荐使用)
特点: 密文没有规律, 明文分组是和一个数据流进行的按位异或操作, 最终生成了密文
不需要初始化向量
go接口中的iv可以理解为随机数种子, iv的长度 == 明文分组的长度
不需要填充
这里我们有必要给出CTR模式额解密流程,因为CTR模式的解密和加密是一模一样的过程,在程序实现中也是可逆的
数据块填充模式
对于块密码算法,需要把明文分割成固定大小的块,并依次对每块明文进行加密。如果明文长度不是单块长度的整数倍,最后一个明文块的大小就会不足一块的长度。这时就要对最后一个明文块进行填充。
- Zeros填充:全部填充为0的字节
- ANSIX923 填充: 填充为0的字节序列,最后一个字节记录填充的总字节数
3)PKCS7 填充: 每个填充的字节都记录了填充的总字节数(向下兼容PKCS5)
4)PKCS5 填充: 每个填充的字节都记录了填充的总字节数((8字节/64位) 块的加密) - ISO10126 填充: 填充随机字节序列,最后一个字节记录填充的总字节数
fq:
恰好8个字节时要增加一个数据块,填充8个字节的0×08。
ssl3Padding也与PKCS5/PKCS7相同,都是用总字节数填充,区别在于SSL在明文和填充块之间有一组消息验证码(MAC)
Base64编码
实现原理:Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法
使用场合:Base64编码是从二进制到字符的过程,可用于在HTTP环境下传递较长的标识信息。采用Base64编码具有不可读性,需要解码后才能阅读。
Base64要求把每三个8Bit的字节转换为四个6Bit的字节(38 = 46 = 24),然后把6Bit再添两位高位0,组成四个8Bit的字节,也就是说,转换后的字符串理论上将要比原来的长1/3。
规则:
①.把3个字节变成4个字节。
②每76个字符加一个换行符。
③.最后的结束符也要处理。
转码过程例子:
38=46
内存1个字节占8位
转前: s 1 3
先转成ascii:对应 115 49 51
2进制: 01110011 00110001 00110011
6个一组(4组) 011100110011000100110011
然后才有后面的 011100 110011 000100 110011
然后计算机一个字节占8位,不够就自动补两个高位0了
所以有了高位补0
科学计算器输入 00011100 00110011 00000100 00110011
得到 28 51 4 51
查对下照表 c z E z
和BASE32区别:
Base64:
包含大写字母(A-Z),小写字母(a-z),数字(0-9)以及+/;
Base32:
而Base32中只有大写字母(A-Z)和数字234567;
Base16:
而Base16就是16进制,他的范围是数字(0-9),字母(ABCDEF);
签名验签
一、公钥加密
假设一下,我找了两个数字,一个是1,一个是2。我喜欢2这个数字,就保留起来,不告诉你们(私钥),然后我告诉大家,1是我的公钥。
我有一个文件,不能让别人看,我就用1加密了。别人找到了这个文件,但是他不知道2就是解密的私钥啊,所以他解不开,只有我可以用 数字2,就是我的私钥,来解密。这样我就可以保护数据了。
我的好朋友x用我的公钥1加密了字符a,加密后成了b,放在网上。别人偷到了这个文件,但是别人解不开,因为别人不知道2就是我的私钥, 只有我才能解密,解密后就得到a。这样,我们就可以传送加密的数据了。
二、私钥签名
如果我用私钥加密一段数据(当然只有我可以用私钥加密,因为只有我知道2是我的私钥),结果所有的人都看到我的内容了,因为他们都知 道我的公钥是1,那么这种加密有什么用处呢?
我的好朋友x说有人冒充我给他发信。怎么办呢?我把我要发的信,内容是c,用我的私钥2,加密,加密后的内容是d,发给x,再告诉他 解密看是不是c。他用我的公钥1解密,发现果然是c。 这个时候,他会想到,能够用我的公钥解密的数据,必然是用我的私钥加的密。只有我知道我得私钥,因此他就可以确认确实是我发的东西。 这样我们就能确认发送方身份了。这个过程叫做数字签名。当然具体的过程要稍微复杂一些。用私钥来加密数据,用途就是数字签名。
总结:公钥和私钥是成对的,它们互相解密。 公钥加密,私钥解密。(RSA) 私钥数字签名,公钥验证。
数字信封
(1)甲使用对称密钥对明文进行加密,生成密文信息。
(2)甲使用乙的公钥加密对称密钥,生成数字信封。
(3)甲将数字信封和密文信息一起发送给乙。
(4)乙接收到甲的加密信息后,使用自己的私钥打开数字信封,得到对称密钥。
(5)乙使用对称密钥对密文信息进行解密,得到最初的明文。
从以上加/解密过程中,可以看出,数字信封技术结合了对称密钥加密和公钥加密的优点,解决了对称密钥的发布安全问题,和公钥加密速度慢问题,提高了安全性、扩展性和效率等。但是,数字信封技术还是有一个比较大的问题,那就是无法确保信息是来自真正的对方
PKCS系列学习(PKCS10和PKCS7)
了解国密:SM2、SM3、SM4
国密即国家密码局认定的国产密码算法。主要有SM1,SM2,SM3,SM4。SM1\SM4密钥长度和分组长度均为128位。
SM1 为对称加密。其加密强度与AES相当。该算法不公开,调用该算法时,需要通过加密芯片的接口进行调用。
SM2为非对称加密,基于ECC。该算法已公开。由于该算法基于ECC,故其签名速度与秘钥生成速度都快于RSA。ECC 256位(SM2采用的就是ECC 256位的一种)安全强度比RSA 2048位高,但运算速度快于RSA。
SM3 消息摘要。可以用MD5作为对比理解。该算法已公开。SM3算法采用Merkle-Damgard结构,消息分组长度为512位,摘要值长度为256位,压缩函数的每一轮都使用2个消息字
SM4 无线局域网标准的分组数据算法。对称加密,密钥长度和分组长度均为128位。
由于SM1、SM4加解密的分组大小为128bit,故对消息进行加解密时,若消息长度过长,需要进行分组,要消息长度不足,则要进行填充。
X509证书概念
- X.509 标准规定了证书可以包含什么信息,并说明了记录信息的方法(数据格式)。除了签名外,所有 X.509 证书还包含以下数据:
**版本**
识别用于该证书的 X.509 标准的版本,这可以影响证书中所能指定的信息。迄今为止,已定义的版本有三个。
**序列号**
发放证书的实体有责任为证书指定序列号,以使其区别于该实体发放的其它证书。此信息用途很多。例如,如果某一证书被撤消,其序列号将放到证书撤消清单 (CRL) 中。
**签名算法标识符**
用于识别 CA 签写证书时所用的算法。
**签发人姓名**
签写证书的实体的 X.500 名称。它通常为一个 CA。 使用该证书意味着信任签写该证书的实体(注意:有些情况下(例如根或顶层 CA 证书),签发人会签写自己的证书)。
**有效期**
每个证书均只能在一个有限的时间段内有效。该有效期以起始日期和时间及终止日期和时间表示,可以短至几秒或长至一世纪。所选有效期取决于许多因素,例如用于签写证书的私钥的使用频率及愿为证书支付的金钱等。它是在没有危及相关私钥的条件下,实体可以依赖公钥值的预计时间。
**主体名**
证书可以识别其公钥的实体名。此名称使用 X.500 标准,因此在Internet中应是唯一的。它是实体的特征名 (DN),例如,
CN=Java Duke,OU=Java Software Division,O=Sun Microsystems Inc,C=US
(这些指主体的通用名、组织单位、组织和国家)。
**主体公钥信息**
这是被命名实体的公钥,同时包括指定该密钥所属公钥密码系统的算法标识符及所有相关的密钥参数。
- 常见的X.509证书格式包括:
cer/crt是用于存放证书,它是2进制形式存放的,不含私钥。
pem跟crt/cer的区别是它以Ascii来表示,可以用于存放证书或私钥。
pfx/p12用于存放个人证书/私钥,他通常包含保护密码,2进制方式。
p10是证书请求。
p7r是CA对证书请求的回复,只用于导入
p7b以树状展示证书链(certificate chain),同时也支持单个证书,不含私钥。