1. 程式人生 > >SM2演算法第十二篇:數字證書原理

SM2演算法第十二篇:數字證書原理

作者:無恙

完美的邏輯,簡直碉堡了。學習學習,,,尊重原創,熱愛大神。

通過一段時間的學習,我漸漸地可以將好幾篇不同的部落格聯絡起來,對照著看,領會到各篇文章之間的交叉與獨到之處。

------------------------------------------------------分割線---------------------------------------------------------

文中首先解釋了加密解密的一些基礎知識和概念,然後通過一個加密通訊過程的例子說明了加密演算法的作用,以及數字證書的出現所起的作用。接著對數字證書做一個詳細的解釋,並討論一下windows中數字證書的管理,最後演示使用makecert生成數字證書。如果發現文中有錯誤的地方,或者有什麼地方說得不夠清楚,歡迎指出!

1、基礎知識

      這部分內容主要解釋一些概念和術語,最好是先理解這部分內容。

1.1、公鑰密碼體制(public-key cryptography)

公鑰密碼體制分為三個部分,公鑰私鑰、加密解密演算法,它的加密解密過程如下:

  • 加密:通過加密演算法公鑰對內容(或者說明文)進行加密,得到密文。加密過程需要用到公鑰
  • 解密:通過解密演算法私鑰密文進行解密,得到明文。解密過程需要用到解密演算法私鑰。注意,公鑰加密的內容,只能由私鑰進行解密,也就是說,由公鑰加密的內容,如果不知道私鑰,是無法解密的。

公鑰密碼體制公鑰和演算法都是公開的(這是為什麼叫公鑰密碼體制的原因),私鑰

是保密的。大家都以使用公鑰進行加密,但是隻有私鑰的持有者才能解密。在實際的使用中,有需要的人會生成一對公鑰私鑰,把公鑰釋出出去給別人使用,自己保留私鑰

1.2、對稱加密演算法(symmetric key algorithms)

對稱加密演算法中,加密使用的金鑰和解密使用的金鑰是相同的。也就是說,加密和解密都是使用的同一個金鑰。因此對稱加密演算法要保證安全性的話,金鑰要做好保密,只能讓使用的人知道,不能對外公開。這個和上面的公鑰密碼體制有所不同,公鑰密碼體制中加密是用公鑰,解密使用私鑰,而對稱加密演算法中,加密和解密都是使用同一個金鑰,不區分公鑰私鑰

        // 金鑰,一般就是一個字串或數字,在加密或者解密時傳遞給加密/解密演算法。前面在

公鑰密碼體制中說到的公鑰私鑰就是金鑰公鑰是加密使用的金鑰私鑰是解密使用的金鑰

1.3、非對稱加密演算法(asymmetric key algorithms)

非對稱加密演算法中,加密使用的金鑰和解密使用的金鑰是不相同的。前面所說的公鑰密碼體制就是一種非對稱加密演算法,他的公鑰和是私鑰是不能相同的,也就是說加密使用的金鑰和解密使用的金鑰不同,因此它是一個非對稱加密演算法

1.4、RSA簡介

RSA是一種公鑰密碼體制,現在使用得很廣泛。如果對RSA本身有興趣的,後面看我有沒有時間寫個RSA的具體介紹。

RSA密碼體制是一種公鑰密碼體制,公鑰公開,私鑰保密,它的加密解密演算法是公開的。 由公鑰加密的內容可以並且只能由私鑰進行解密,並且由私鑰加密的內容可以並且只能由公鑰進行解密。也就是說,RSA的這一對公鑰、私鑰都可以用來加密和解密,並且一方加密的內容可以由並且只能由對方進行解密

1.5、簽名和加密

我們說加密,是指對某個內容加密加密後的內容還可以通過解密進行還原。 比如我們把一封郵件進行加密,加密後的內容在網路上進行傳輸,接收者在收到後,通過解密可以還原郵件的真實內容。

這裡主要解釋一下簽名簽名就是在資訊的後面再加上一段內容,可以證明資訊沒有被修改過,怎麼樣可以達到這個效果呢?一般是對資訊做一個hash計算得到一個hash值,注意,這個過程是不可逆的,也就是說無法通過hash值得出原來的資訊內容。在把資訊傳送出去時,把這個hash值加密後做為一個簽名資訊一起發出去。 接收方在收到資訊後,會重新計算資訊的hash值,並和資訊所附帶的hash值(解密後)進行對比,如果一致,就說明資訊的內容沒有被修改過,因為這裡hash計算可以保證不同的內容一定會得到不同的hash值,所以只要內容一被修改,根據資訊內容計算的hash值就會變化。當然,不懷好意的人也可以修改資訊內容的同時也修改hash值,從而讓它們可以相匹配,為了防止這種情況,hash值一般都會加密後(也就是簽名)再和資訊一起傳送,以保證這個hash值不被修改。至於如何讓別人可以解密這個簽名,這個過程涉及到數字證書等概念,我們後面在說到數字證書時再詳細說明,這裡您先只需先理解簽名的這個概念。

 簽名值:用<這裡應該填一種演算法的名稱>對明文的hash值加密後的結果就是一個簽名。目的是保證資料的完整性。

2、一個加密通訊過程的演化

      我們來看一個例子,現在假設“伺服器”和“客戶”要在網路上通訊,並且他們打算使用RSA(參看前面的RSA簡介)來對通訊進行加密以保證談話內容的安全。由於是使用RSA這種公鑰密碼體制,“伺服器”需要對外發布公鑰(演算法不需要公佈,RSA的演算法大家都知道),自己留著私鑰。“客戶”通過某些途徑拿到了“伺服器”釋出的公鑰,客戶並不知道私鑰。“客戶”具體是通過什麼途徑獲取公鑰的,我們後面再來說明,下面看一下雙方如何進行保密的通訊:

2.1 第一回合:

“客戶”->“伺服器”:你好

“伺服器”->“客戶”:你好,我是伺服器

“客戶”->“伺服器”:????

因為訊息是在網路上傳輸的,有人可以冒充自己是“伺服器”來向客戶傳送資訊。例如上面的訊息可以被黑客截獲如下:

“客戶”->“伺服器”:你好

“伺服器”->“客戶”:你好,我是伺服器

“客戶”->“黑客”:你好// 黑客在“客戶”和“伺服器”之間的某個路由器上截獲“客戶”發給伺服器的資訊,然後自己冒充“伺服器”

“黑客”->“客戶”:你好,我是伺服器

因此“客戶”在接到訊息後,並不能肯定這個訊息就是由“伺服器”發出的,某些“黑客”也可以冒充“伺服器”發出這個訊息。如何確定資訊是由“伺服器”發過來的呢?有一個解決方法,因為只有伺服器有私鑰,所以如果只要能夠確認對方有私鑰,那麼對方就是“伺服器”。因此通訊過程可以改進為如下:

2.2 第二回合:

“客戶”->“伺服器”:你好

“伺服器”->“客戶”:你好,我是伺服器

“客戶”->“伺服器”:向我證明你就是伺服器

“伺服器”->“客戶”:你好,我是伺服器 {你好,我是伺服器}[私鑰|RSA]

// 意這裡約定一下,{} 表示RSA加密後的內容,[ | ]表示用什麼金鑰和演算法進行加密,後面的示例中都用這種表示方式,例如上面的 {你好,我是伺服器}[私鑰|RSA]  就表示用私鑰“你好,我是伺服器”進行加密後的結果。

為了向“客戶”證明自己是“伺服器”, “伺服器”把一個字串用自己的私鑰加密,把明文和加密後的密文一起發給“客戶”。對於這裡的例子來說,就是把字串 “你好,我是伺服器”和這個字串用私鑰加密後的內容 {你好,我是伺服器}[私鑰|RSA] 發給客戶。

“客戶”收到資訊後,她用自己持有的公鑰解密密文,和明文進行對比,如果一致,說明資訊的確是由伺服器發過來的。也就是說“客戶”把 {你好,我是伺服器}[私鑰|RSA] 這個內容用公鑰進行解密,然後和“你好,我是伺服器”對比。因為由“伺服器”用私鑰加密後的內容,由並且只能由公鑰進行解密,私鑰只有“伺服器”持有,所以如果解密出來的內容是能夠對得上的,那說明資訊一定是從“伺服器”發過來的。

假設“黑客”想冒充“伺服器”:

“黑客”->“客戶”:你好,我是伺服器

“客戶”->“黑客”:向我證明你就是伺服器

“黑客”->“客戶”:你好,我是伺服器 {你好,我是伺服器}[???|RSA]//這裡黑客無法冒充,因為他不知道私鑰,無法用私鑰加密某個字串後傳送給客戶去驗證。

“客戶”->“黑客”:????

由於“黑客”沒有“伺服器”的私鑰,因此它傳送過去的內容,“客戶”是無法通過伺服器的公鑰解密的,因此可以認定對方是個冒牌貨!

到這裡為止,“客戶”就可以確認“伺服器”的身份了,可以放心和“伺服器”進行通訊,但是這裡有一個問題,通訊的內容在網路上還是無法保密。為什麼無法保密呢?通訊過程不是可以用公鑰私鑰加密嗎?其實用RSA的私鑰公鑰是不行的,我們來具體分析下過程,看下面的演示:

2.3 第三回合:

“客戶”->“伺服器”:你好

“伺服器”->“客戶”:你好,我是伺服器

“客戶”->“伺服器”:向我證明你就是伺服器

“伺服器”->“客戶”:你好,我是伺服器 {你好,我是伺服器}[私鑰|RSA]

“客戶”->“伺服器”:{我的帳號是aaa,密碼是123,把我的餘額的資訊發給我看看}[公鑰|RSA]

“伺服器”->“客戶”:{你的餘額是100元}[私鑰|RSA]

注意上面的的資訊 {你的餘額是100元}[私鑰],這個是“伺服器”用私鑰加密後的內容,但是我們之前說了,公鑰是釋出出去的,因此所有的人都知道公鑰,所以除了“客戶”,其它的人也可以用公鑰{你的餘額是100元}[私鑰]進行解密。所以如果“伺服器”用私鑰加密發給“客戶”,這個資訊是無法保密的,因為只要有公鑰就可以解密這內容。然而“伺服器”也不能用公鑰對傳送的內容進行加密,因為“客戶”沒有私鑰,傳送個“客戶”也解密不了。

這樣問題就又來了,那又如何解決呢?在實際的應用過程,一般是通過引入對稱加密來解決這個問題,看下面的演示:

2.4 第四回合:

“客戶”->“伺服器”:你好

“伺服器”->“客戶”:你好,我是伺服器

“客戶”->“伺服器”:向我證明你就是伺服器

“伺服器”->“客戶”:你好,我是伺服器 {你好,我是伺服器}[私鑰|RSA]

“客戶”->“伺服器”:{我們後面的通訊過程,用對稱加密來進行,這裡是對稱加密演算法金鑰}[公鑰|RSA]    //藍色字型的部分是對稱加密的演算法和金鑰的具體內容,客戶把它們傳送給伺服器。

“伺服器”->“客戶”:{OK,收到!}[金鑰|對稱加密演算法]

“客戶”->“伺服器”:{我的帳號是aaa,密碼是123,把我的餘額的資訊發給我看看}[金鑰|對稱加密演算法]

“伺服器”->“客戶”:{你的餘額是100元}[金鑰|對稱加密演算法]

在上面的通訊過程中,“客戶”在確認了“伺服器”的身份後,“客戶”自己選擇一個對稱加密演算法和一個金鑰,把這個對稱加密演算法金鑰一起用公鑰加密後傳送給“伺服器”。注意,由於對稱加密演算法金鑰是用公鑰加密的,就算這個加密後的內容被“黑客”截獲了,由於沒有私鑰,“黑客”也無從知道對稱加密演算法金鑰的內容。

由於是用公鑰加密的,只有私鑰能夠解密,這樣就可以保證只有伺服器可以知道對稱加密演算法金鑰,而其它人不可能知道(這個對稱加密演算法金鑰是“客戶”自己選擇的,所以“客戶”自己當然知道如何解密加密)。這樣“伺服器”和“客戶”就可以用對稱加密演算法金鑰來加密通訊的內容了。

總結一下,RSA加密演算法在這個通訊過程中所起到的作用主要有兩個:

  • 因為私鑰只有“伺服器”擁有,因此“客戶”可以通過判斷對方是否有私鑰來判斷對方是否是“伺服器”。
  • 客戶端通過RSA的掩護,安全的和伺服器商量好一個對稱加密演算法金鑰來保證後面通訊過程內容的安全。

如果這裡您理解了為什麼不用RSA去加密通訊過程,而是要再確定一個對稱加密演算法來保證通訊過程的安全,那麼就說明前面的內容您已經理解了。(如果不清楚,再看下2.3和2.4,如果還是不清楚,那應該是我們說清楚,您可以留言提問。)

到這裡,“客戶”就可以確認“伺服器”的身份,並且雙方的通訊內容可以進行加密,其他人就算截獲了通訊內容,也無法解密。的確,好像通訊的過程是比較安全了。

但是這裡還留有一個問題,在最開始我們就說過,“伺服器”要對外發布公鑰,那“伺服器”如何把公鑰傳送給“客戶”呢?我們第一反應可能會想到以下的兩個方法:

a)把公鑰放到網際網路的某個地方的一個下載地址,事先給“客戶”去下載。

b)每次和“客戶”開始通訊時,“伺服器”把公鑰發給“客戶”。

但是這個兩個方法都有一定的問題,

對於a)方法,“客戶”無法確定這個下載地址是不是“伺服器”釋出的,你憑什麼就相信這個地址下載的東西就是“伺服器”釋出的而不是別人偽造的呢,萬一下載到一個假的怎麼辦?另外要所有的“客戶”都在通訊前事先去下載公鑰也很不現實。

對於b)方法,也有問題,因為任何人都可以自己生成一對公鑰私鑰,他只要向“客戶”傳送他自己的私鑰就可以冒充“伺服器”了。示意如下:

“客戶”->“黑客”:你好           //黑客截獲“客戶”發給“伺服器”的訊息

黑客”->“客戶”:你好,我是伺服器,這個是我的公鑰    //黑客自己生成一對公鑰私鑰,把公鑰發給“客戶”,自己保留私鑰

相關推薦

SM2演算法數字證書原理

作者:無恙 完美的邏輯,簡直碉堡了。學習學習,,,尊重原創,熱愛大神。 通過一段時間的學習,我漸漸地可以將好幾篇不同的部落格聯絡起來,對照著看,領會到各篇文章之間的交叉與獨到之處。 ---------------------------------------------

SM2演算法掃盲HTTPS和SSL/TLS協議

作者:程式設計隨想 本系列共有三節: 掃盲HTTPS和SSL/TLS協議[0]:引子(略了) 掃盲HTTPS和SSL/TLS協議[1]:背景知識、協議的需求、設計的難點 掃盲HTTPS和SSL/TLS協議[2]:可靠祕鑰交換的原理 ------------------

SM2演算法第二ECDSA數字簽名演算法原理與實現

---------------------------------------------轉載原因------------------------------------------------- 這邊部落格中有關 EC_KEY_set_private_key和EC_KEY_set_public_key

HTML基礎

項目 logs 瀏覽器 圖片 handle 標題欄 width light 標題 本篇內容 HTML概述 HTML常用基本標簽 CSS格式引入 一、 HTML概述 1.定義: HTML,超文本標記語言,寫給瀏覽器的語言,目前網絡上應用最廣泛的語言。HTML也在不斷

數據庫操作

mysq 查詢 alc mys clas 多對多 class 操作 連接查詢 一、數據庫簡紹 二、mysql 增刪改查 三、mysql 外鍵關聯 四、mysql 連接查詢 五、mysql 事務與索引 六、ORM 簡紹 七、sqlalchemy 常用語法 八、sqlalche

史上最簡單的SpringCloud教程 | 斷路器監控(Hystrix Dashboard)

詳細 pre 良好的 依次 alt ews 需要 ext 數據監控 最新Finchley版本,請訪問:https://www.fangzhipeng.com/springcloud/2018/08/30/sc-f12-dash/或者http://blog.csdn.net

隨手記一下javaBean的setter,getter方法的命名問題

今天測試新寫的一個系統表的完整Ibatis配置和呼叫,因為經驗少,到處撞牆、、、其他的坑爹問題就不提了       測試sqlMapClient.queryForList("...",param)這個方法,查詢正常有3條記錄,但是結果卻是[

Spring Boot 基礎系列教程 | 使用Spring-data-jpa簡化資料訪問層(推薦)

推薦 Spring Boot/Cloud 視訊: Spring Boot中使用Spring-data-jpa讓資料訪問更簡單、更優雅 在上一篇Spring中使用JdbcTemplate訪問資料庫 中介紹了一種基本的資料訪問方式,結合構建RESTful API和

Spring Boot之使用Spring RestTemplate訪問Rest服務

RestTemplate是Spring3.0後開始提供的用於訪問 Rest 服務的輕量級客戶端,相較於傳統的HttpURLConnection、Apache HttpClient、OkHttp等框架,RestTemplate大大簡化了發起HTTP請求以及處理響應的過程。這篇文章主要介紹怎

【SSH三大框架】Hibernate基礎load()懶載入分析以及一對一、一對多、多對一、多對多懶載入的分析

一、懶載入的定義: 懶載入:在WEB應用程式中,經常會需要查詢資料庫,系統的響應速度在很大程度上是與資料庫互動的響應。因此,如果能夠優化與資料庫的互動速度,則能夠大大提高WEB應用的響應速度。 例如:當有一個Student類和一個Teacher類。當我們載入一個學生的所有資

R實戰 隨機數

由R生成的隨機數實際上偽隨機數,也就是說,隨機數是由某種演算法而不是真正的隨機過程產生的,隨機數生成器需要一個初始值來生成數字,該初始值叫做種子。通過把種子設定為特定的值,可以保證每次運行同一段程式碼時都能生成相同的隨機數。 R使用set.seed(n)函式來設定種子值,n是一個正整數,不同的種子會生成不同

【屌絲程式的口才逆襲演講稿50世界上最快的捷徑【張振華.Jack】

演講稿主題:《世界上最快的捷徑》                    --作者:張振華Jack 給大家講個故事。         有一天正好猴子和鸚鵡坐同一架飛機去旅行。猴子向空姐說:“請來一瓶礦泉

OpenCV學習帶透明通道影象合成(縮放,旋轉,和ROI)

第一步:獲取素材圖片 Mat src, dst; src = imread("F:/識圖/底圖.PNG", 1); dst = imread("logo", -1); 【ps:這裡需要注意的是透明度圖片獲取,後面的引數帶-1】 第二

Spring Cloud Learning | Docker部署Spring Cloud專案

<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>sprin

自學python 數字 三角函式+數學常量

#python 三角函式 ''' 函式 描述 acos(x) 返回x的反餘弦弧度值。 asin(x) 返回x的反正弦弧度值。 atan(x) 返回x的反正切弧度值。 atan2(y,

SM2演算法第二 openssl庫中的BIGNUM(超讚)

openssl庫中的BIGNUM,處理大數比較好,可以用在很多方面。 BIGNUM是一個typedef的結構,可以直接使用。但一般來說,使用它的指標結構。如:BIGNUM *p; BIGNUM的建立與釋放 函式原型 解釋 示例 BIGNUM * BN_new (voi

SpringBoot整合jsp

作者:追夢1819 原文:https://www.cnblogs.com/yanfei1819/p/10953600.html 版權宣告:本文為博主原創文章,轉載請附上博文連結! 引言   SpringBoot 雖然官方推薦使用 thymelaf 模板引擎,但是也支援jsp,只不過需要做一些修改。本文將講解

跟我學SpringCloud | Spring Cloud Gateway初探

SpringCloud系列教程 | 第十二篇:Spring Cloud Gateway初探 Springboot: 2.1.6.RELEASE SpringCloud: Greenwich.SR1 如無特殊說明,本系列教程全採用以上版本 前面我們在聊服務閘道器Zuul的時候提到了Gateway,那

【設計模式】車票購買場景中的代理模式講解

![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/7024b047f558499f9194ab6fd34d9306~tplv-k3u1fbpfcp-zoom-1.image) 早在 Spring AOP 篇的講解中,我已經寫過關於 AOP 部分是如何

圖解Python 【Django 基礎

aps 不同的 mage 清空 font 一個 取數 ccf pos 本節內容一覽表: Django基礎:http://www.ziqiangxuetang.com/django/django-tutorial.html 一、Django簡介 Django文