公钥算法和私钥算法

对称加密和非对称加密

对称加密算法,其解密密钥和加密密钥是相同的,正因为解密密钥和加密密钥相同,所以该密钥不能公开。所以对称加密算法又称私钥算法。常用的对称加密算法有** DES 加密算法 AES 加密算法**。

非对称加密算法,其加密和解密的密钥是不一样的,其中公开的叫公钥,私有的叫私钥。公钥和私钥是成对的;公钥加密的数据,有且只有对亚它的私钥能解密;私钥加密的数据,有且只有对应它的公钥能解密(所以其实公钥和私钥的概念同加密密钥和解密密钥的概念并非是同一的)。

SSH 是非对称加密的。它默认使用 RSA 加密。

这里随机生成了一对 RSA 密钥,私钥如下——

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
-----BEGIN PRIVATE KEY-----
MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQD3lkA6dVbIIcE5
X12EjbsInujgYzU84Qo29LcFtn1zyODplCB6r4yKp8r5yu2v2FRErXE3/+YfkaKa
9lW2JCYHFAm7KK6sXZ/qAMK9HljERjPvIEy9oTMQDQfnSjyU8xJ7zsLh/I108ibB
R1SdIoIn+sJmJu7YVsPY52M5JTG3pQFTkkcBSYnTfs0Wdjbu9cnkYR0Gp6dWj12C
17fe1xQxiF0tL90QCckx9g84arlXwRo+0o6JLWwbHzUZeELeeXetFu96k8VI5946
bf+iFVq6ECqPzaKv3X9wkfjrV9B/PWDsDbPJ6PYd+6C1RBWJCDsf6jhR2YmWlATL
DLpsio/VAgMBAAECggEBAO8ZIOnTi302a922JR/vp6IJpKed5znlsfGknmNb+wco
BVxNephAlB8LL8/Pk37wEWFJhj8oV9pA0KGKJvgBLOBFD6i4/wbiW56mIWp1tg/G
JD1YGgQ/eoqTqwBIBv1pSH5cDIQlW46Gk7qv4hzlyIBHgBkanCo8kGIWAxKawsqv
HrbFlPd/omaeQ44t+KfTTImSDsVvIAyd6OzqRVJVAivwSTwKh0V24gmvBXR/a+iV
xAha6pxl8W/nb/RFRVNgr76i1jgFR/eejfgdBqMCKEZU96h4VeWA3j9RQnVKVD14
Phc8IbzNtpEUkIeaDqGrduOamHqK3nQ+giKnaA7MO0ECgYEA/O+F/fQGDHTjl7EZ
Xf3DJlJ4kssihn5P6h/4Aj9TPoMudZV3GalencXBpH9pL1esFSNdXnYmdsqvO/d1
2ugfhyJh3Di/AAeMILVGzeHR2FER8b/rLCIuKsWgJaELbBzlrj4wetWiFxc0eyEa
jRYktbZu1pFxJo0W5hLjdrwbZ/kCgYEA+pYjdJgz3FmpJ5Otqy/5c3kP9b07PyqH
YOXXjdXWFtUAjHXZ1kIeWGhPLmY+jvFw5IeESZWFR8Hmj7NL2LC2+allwHaWHZFC
OAU76L2uC9IQ1BCLxZtrDeXdPvZnkUZj+t/I+l4/I9OY/P/64OUjzMy6op5geJd7
8gj2osqadb0CgYEAhXaJ2F+r1WTUNtWfEgZ1s8Hul16SgC8kUeC+h8kMTr7/g9Hz
P1osb8nKjNciFHYJejnn6ZEkaKg4YMcJrBGxmSeeRYq31fcljJi6nKZciOz2L/7Z
w7bhb3ZKM7DPiyOQWim8gQQ6/D4lVhc4oFuf0TZLM/MYpoPqIkqzNZK6T1kCgYAX
Xqkv1oH/qtz7s+oebPr2qfOzF1LPMUgu4UCZGbg9qN/EObl3IfNyi0fXK/HpotrE
dV8A/dDQQGUgQbhxHQnzfrjemjCl0UY7s0FDE22H7K9lF6XxZ+0z/pwDozdFdSsd
2oED2IZK8RDzh2v+TWBpWS6Ou/aDSJ1mlS9rPznogQKBgQDMkyFJnkDT3acyf6Ze
Wjen6omH6JgE2s+uJGLi6rKZFmz994EHdTEI1EVZG65mfh2lxpiaoF76y16+uIOO
Vae9KwoqraBnclZXXuuFwW4sVoMCvBNr26U1y7SUTqZeDm06lshvHa+2xKTPLTFA
uhr1oZJ7uyGsqvdGkPaBm3qzNg==
-----END PRIVATE KEY-----

公钥如下——

1
2
3
4
5
6
7
8
9
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA95ZAOnVWyCHBOV9dhI27
CJ7o4GM1POEKNvS3BbZ9c8jg6ZQgeq+MiqfK+crtr9hURK1xN//mH5GimvZVtiQm
BxQJuyiurF2f6gDCvR5YxEYz7yBMvaEzEA0H50o8lPMSe87C4fyNdPImwUdUnSKC
J/rCZibu2FbD2OdjOSUxt6UBU5JHAUmJ037NFnY27vXJ5GEdBqenVo9dgte33tcU
MYhdLS/dEAnJMfYPOGq5V8EaPtKOiS1sGx81GXhC3nl3rRbvepPFSOfeOm3/ohVa
uhAqj82ir91/cJH461fQfz1g7A2zyej2HfugtUQViQg7H+o4UdmJlpQEywy6bIqP
1QIDAQAB
-----END PUBLIC KEY-----

使用公钥加密”Hello, Happy World!”,得到如下字符串——

1
7fmMleOdHEcS3k61RDm0DK7Y6grJSwcNZcbsvXWTbMfcklbCsKvmF2oeOthSxlJQVhp0KR/6/0HBjWri64YGSaws7KbJKZTd6EZnxhXESPb4HGOlnazdRIXhMtCYY9BtiRpnpw58iPd7O4Xzv7Rli4HAXPdwl6OmaOVRBJwqaW3GBsMQKsXpeL/UCcvLcfUFUJIVrUOPw+1A9tfouxCeql+Kd+MINlehnxNMYLCglEL86RLDclD1VLxYnuFgvvQHD5ueXu+2RglPD0UHfll2CUbj9Uacuzs2euKsSHZP1S1zqTGo4PUrDgsk5v68tBxWaD26DyqzG5u0zrMXOlX/4w==

将该字符串使用私钥进行解密,得到如下结果——

1
Hello, Happy World!

可不可以拿它生成的公钥当私钥使,它生成的私钥当公钥使?理论上是可以这么干的,但是至少这里 ssh 使用的 rsa 加密不允许这样干。

非对称加密是如何传输数据的

如果使用对称加密算法,加解密使用同一个密钥,这样就需要对方和自己都要持有密钥才能进行,但如果把密钥也一起传过去,就存在密码泄露的可能。而非对称加密算法……至少不会存在这样的可能。

非对称加密算法传输数据的过程如下——

  1. 首先接收方生成一对密钥,接收方自己持有私钥。
  2. 接收方将公钥发送给发送方
  3. 发送方用公钥对数据进行加密,发送给接收方。
  4. 接收方用私钥解密数据。

可以看到,这个过程中,私钥是不暴露在传输过程中的,因而保证了传输过程的安全性。

公钥算法进行签名

公钥加密的数据只有私钥能够解密,私钥加密的数据只有公钥能解密,因此,如果某人用他的私钥加密数据并发布,其他人发现使用此人的公钥能解密该数据,说明这个数据一定是此人发布的。在这里,用私钥加密数据称为“签名”,其他人可以用公钥来验证该签名。

数字签名能够保证——

  1. 信息是签名者自己签名发送的(他的私钥,他很难否认)。
  2. 信息未经过更改。

公钥算法的缺点

!它比对称加密算法慢一两个数量级。因此它不适合对大量原始数据进行加密。

可以结合公钥算法和私钥算法,可以用公钥算法法来作为“引子”,实际传输使用私钥算法,其实质是把对称加密算法中使用的密钥使用非对称加密算法进行传输(这是为了防止在传输过程中暴露),从而避免非对称加密算法存在的一些缺点。

  1. 发送方首先使用对称加密算法加密数据
  2. 接收方通过公钥机制生成一对公私钥,将公钥发送给发送方。
  3. 发送方将对称加密算法中的密钥使用公钥加密,发送给接收方。
  4. 接收方进行解密,得到对称加密算法的密钥。
  5. 发送方将加密的数据发送给接收方。
  6. 接收方通过密钥解密。

ssh 是什么

ssh 是 Secure Shell 的缩写,它是专为远程登录会话和其他网络服务提供安全性的协议

ssh 协议使用对称加密非对称加密散列来确保信息的传输。客户端和服务器之间的 SSH 连接分为三个阶段:

  1. 客户端对服务器的验证。
  2. 生成会话密钥以加密所有通信。
  3. 客户端认证。

TODO:描述一下具体的

github(git)怎样使用 ssh

push 的时候,可以使用 github 的账户密码作为验证,也可以使用 ssh 进行验证,要使用 ssh,应当在 github 网页端设置自己的公钥。要注意的是,一个公钥只能对应一个仓库。

TODO:同上