密码学
Base64
在申请证书的时候,需要生成一个根证书,现在查看一下:
cat 根证书CertificateSigningRequest.certSigningRequest
cat 根证书CertificateSigningRequest.certSigningRequest
-----BEGIN CERTIFICATE REQUEST-----
MIICfTCCAWUCAQAwODEYMBYGCSqGSIb3DQEJARYJ5qC56K+B5LmmMQ8wDQYDVQQD
DAbpvZDotoUxCzAJBgNVBAYTAkNOMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
CgKCAQEAvfNalljsxRNkvJ65sm8RP6kGylEHDsuARbVxfitXbyKCUWNCMvsR3/fB
ORM5mizjRueKzxQh4CoWLMc4R2udio7RZSp2jaMzPSHxTj7DEMTIEHLp3W3wjZwR
q1WDwNsHpnGigd2bq6PWHv9vWBlaxcOToNA1mTPW3ZNOCktESoVRCg2Tymlf9tBo
4JZlo+FbOhKw2vcf+7D9oTu2yK+kB6xtrhX5z1J/Pet7A/AE6izLdqsQeLAtJAuW
VbbzrxHJpn3qpKYF8qHUS+wmQKYqWR9Y3Scerf+dv2Be5ynOlaBIKmSA00v9F+Vm
W2/GvMhj6qfrIj55u6HsIpfXsRWOTQIDAQABoAAwDQYJKoZIhvcNAQELBQADggEB
ADAOPBwi5NWluFVP1mzJM+je03VmmZORYrURWGBdXR2s9dkAKQ/WUf51eR+qA0dl
zDt+XFARBcr57PjQDuYa5y+1coOVmybNcoMTg4xnOQr9sJmNGfRCcx/1BKOEYfRp
K4Aiy2VqohV+mG7PtIR7UmctfkjUyyaeu0hF3ZhjXh3GogTY0+5vWeVxldRMht7e
ejs3EhQyy3ZGFNtgR9lBvOQJJYUgwnBDVrW406JFbY0AVWLdREhN0bp7odteIHjF
PH/v5601P+4UJiAjtziJ3dWJYBH9VUs3+47Zp5hiSgzVGXo/R64Q5kkpSREHjnCn
Z0Rd2z7UCTpS5BaNoLdMZ5Y=
-----END CERTIFICATE REQUEST-----
就是用的 base64 编码,加密的二进制的。
base64 加密测试
终端新建一个文件:
touch test.txt
编辑文件:
11111111
22222222
33333333
base64 编码
base64 test.txt -o base64.txt
结果:
MTExMTExMTEKMjIyMjIyMjIKMzMzMzMzMzM=
解码:
base64 base64.txt -o encode.text -D
结果:
11111111
22222222
33333333
Base64索引表
![](https://img.haomeiwen.com/i4790087/4d12d8ccb8be6d1c.png)
A~Z,
a~z,
0~9,
+,/,
用于填充的 “=”
一共 65 个字符。
如此示例所示,Base64编码将三个八位字节转换为四个(6位字节)编码字符。
![](https://img.haomeiwen.com/i4790087/9029fb91a92a81e3.png)
' ='可以添加填充字符以使最后一个编码块包含四个Base64字符。
![](https://img.haomeiwen.com/i4790087/735229a28dde57f0.png)
![](https://img.haomeiwen.com/i4790087/776b3a440dde9213.png)
一般用于编码加密过后的 二进制数据。
哈希(散列)函数
- 哈希(散列)函数
- 不属于加密算法,但在密码学中也是经常用的。
- 不可逆,不可用于加密和解密。只有加密的过程,没有解密的过 程。加密后即返不回来了
加解密算法:
-
非对称加密 RSA (长度在200位以上的数字)
由于是简单的数学计算,所以加密的效率比较低,一般用于加密核心的数据。- 公钥加密,私钥解密
- 私钥解密,公钥解密。
很好的解决了服务端与客户端的通信问题。(量子计算机可以用来暴力破解 RSA 加密。目前的最简单的 RSA 加密用目前的计算机需要大概 50 年以上破解)
- 对称加密
- DES
- 3DES
- AES
RSA Open SSL 终端生成密钥
参考: 使用 openssl 生成证书
讲的很详细。
Open SSL 是目前最流行的 SSL 密码库工具,其提供了一个通用、健壮、功能完备的工具套件,用以支持SSL/TLS 协议的实现。
官网:https://www.openssl.org/source/
苹果内置了 Open SSL 类库,在终端中
openssl genrsa -out rsa_private.key 512
- 生成512 bit 的RSA私钥(无加密)
可以查看一下:
cat rsa_private.key
如下:
![](https://img.haomeiwen.com/i4790087/d7de17a2238a5eaf.png)
将私钥输出为 txt 文件,方便查看:
openssl rsa -in rsa_private.key -text -out private.txt
Superman ~/Desktop openssl rsa -in rsa_private.key -text -out private.txt
writing RSA key
Superman ~/Desktop cat private.txt
Private-Key: (512 bit)
modulus:
00:cb:26:b9:0e:d8:f2:ba:89:5a:ee:b6:32:24:c5:
b4:2a:0b:92:78:77:6a:cc:e9:fa:61:98:64:a5:9a:
e5:1e:fd:71:ae:33:ed:3f:3e:f3:cf:b6:3f:5b:05:
36:09:77:0d:4f:99:fe:cf:a3:cd:68:f4:1f:68:2b:
43:45:93:08:0d
publicExponent: 65537 (0x10001)
privateExponent:
00:9a:ff:c1:84:8d:8c:ad:3c:6d:8f:e2:9d:61:a7:
22:ae:4d:c4:04:7c:00:95:b6:13:de:70:da:a1:ec:
0b:d2:d6:e9:09:49:a7:3d:a1:c5:b5:1c:46:8c:10:
0b:a8:ac:ad:d2:d6:4a:48:23:93:6e:8a:38:9b:be:
e7:ef:92:c0:21
prime1:
00:fd:18:0c:5e:cd:f4:4f:71:da:96:25:c0:2b:a1:
fd:3c:46:e9:9a:5c:33:a2:e9:1c:0c:1d:a4:b0:64:
af:ec:f5
prime2:
00:cd:7b:df:21:6a:cf:5a:5e:00:61:93:a4:a0:71:
7f:9c:06:f1:50:89:ca:9c:da:2d:7c:86:cd:64:16:
4e:bf:b9
exponent1:
6b:0a:ee:c0:72:0e:f0:42:d1:16:4b:e5:19:0f:2c:
11:80:54:70:aa:aa:54:2e:8f:64:38:6d:5d:05:58:
ba:b9
exponent2:
00:a7:83:ab:64:7f:c1:a8:a6:e7:62:a4:cd:59:ab:
0d:5f:f2:5c:f9:ce:4b:29:d1:c7:b1:33:e7:ef:07:
2c:8d:a9
coefficient:
5b:ae:a8:fd:46:5d:14:02:81:9a:19:d3:70:3d:21:
69:19:ee:7f:0b:82:3e:26:b8:14:b0:41:87:37:79:
d4:15
-----BEGIN RSA PRIVATE KEY-----
MIIBOwIBAAJBAMsmuQ7Y8rqJWu62MiTFtCoLknh3aszp+mGYZKWa5R79ca4z7T8+
88+2P1sFNgl3DU+Z/s+jzWj0H2grQ0WTCA0CAwEAAQJBAJr/wYSNjK08bY/inWGn
Iq5NxAR8AJW2E95w2qHsC9LW6QlJpz2hxbUcRowQC6isrdLWSkgjk26KOJu+5++S
wCECIQD9GAxezfRPcdqWJcArof08RumaXDOi6RwMHaSwZK/s9QIhAM173yFqz1pe
AGGTpKBxf5wG8VCJypzaLXyGzWQWTr+5AiBrCu7Acg7wQtEWS+UZDywRgFRwqqpU
Lo9kOG1dBVi6uQIhAKeDq2R/waim52KkzVmrDV/yXPnOSynRx7Ez5+8HLI2pAiBb
rqj9Rl0UAoGaGdNwPSFpGe5/C4I+JrgUsEGHN3nUFQ==
-----END RSA PRIVATE KEY-----
- 通过私钥 生成RSA公钥:
openssl rsa -in rsa_private.key -pubout -out rsa_public.key
![](https://img.haomeiwen.com/i4790087/677e4bb05c1791ce.png)
MD5
MD5 用来标识一个二进制数据,一个二进制数据(文件)只有一个 HASH 值,有可能多个二进制数据有同一个 hash 值。
可以用于验证,可以判断一个二进制数据有没有被修改过或者不一致。
md5 -s "Superman"
结果:
MD5 ("Superman") = 527d60cd4715db174ad56cda34ab2dce
数字签名就是这样的道理,MD5 后再 RSA 加密,传送到服务端,验证数据有没有被修改过