非對稱加密

2021-09-24 16:44:09 字數 4576 閱讀 1771

對稱加密存在的問題

非對稱加密

加密解密使用不相同同的鑰匙

加密流程

對稱加密與非對稱加密對比

秘鑰數量:1

效率:高,適合大檔案加解密

秘鑰數量:2

公鑰:public key,任何人都可以持有。公共的

私鑰:private key,只有自己持有,任何人都不可以擁有

公鑰與私鑰一一對應,

公鑰加密,只有自己的私鑰可以解密

私鑰簽名,只有自己的公鑰可以解密

生成過程:

選定乙個隨機數=> 生成私鑰 =》 公鑰 (不能反推)

效率:低,不適合大檔案加解密

應用非對稱加密的場景

通訊加密

公鑰加密,私鑰解密

驗證伺服器,數字證書,使用ca認證公鑰

簽名(防止篡改)

雜湊+非對稱加密

網銀u盾

驗證client,u盾相當於私鑰,公鑰在服務端

github ssh(secure shell)登入

rsa非對稱加密演算法

密文=明文^ e mod n(rsa加密)====> ==> 公鑰

明文=密文^d modn(rsa解密)====》 ==> 私鑰

核心思想:利用大素數的因式分解困難

素數:除了1和本身能整除,其他數字無法整除的數

go語言實現建立公鑰私鑰

基本概念

x509: 證書規範

der:公鑰私鑰的一種編碼格式

pem: pem編碼主要用於tls金鑰和證書。

base64:資料編碼格式,可逆的

pkcs: 公鑰密碼的發展而制訂的一系列標準。(pkcs 全稱是 public-key cryptography standards )

pkcs1、pkcs8:用的比較多,可以把pkcs1人工轉為pkcs8,目前pkcs8比較流行

建立私鑰

流程建立私鑰

對私鑰進行編碼,生成der格式的字串

將der字串拼裝到pem格式的資料塊中

pem格式進行base64編碼,得到最終的私鑰

**

func

generatersakeypair

(bit int

)error

// 2. 對私鑰進行編碼,生成der格式的字串

//x509包:公鑰標準, func marshalpkcs1privatekey(key *rsa.privatekey) byte

dertext, err := x509.

marshalpkcs8privatekey

(prikey)

if err !=

nil// 3. 將der字串拼裝到pem格式的資料塊中

// type block struct

block := pem.block

f1, err := os.

create

("rsaprikey.pem"

)if err !=

nildefer f1.

close()

// 4. pem格式進行base64編碼,得到最終的私鑰

// err = pem.encode(os.stdout, &block)

err = pem.

encode

(f1,

&block)

if err !=

nilreturn

nil}

建立公鑰

流程建立私鑰

通過私鑰得到公鑰

對公鑰進行編碼,生成der格式的字串

將der字串拼裝到pem格式的資料塊中

pem格式進行base64編碼,得到最終的公鑰

**

func

generatersapubkey

(prikey *privatekey)

error

// 4. 將der字串拼裝到pem格式的資料塊中

block := pem.block

f1, err := os.

create

("rsapublickey.pem"

)if err !=

nildefer f1.

close()

// 5. pem格式進行base64編碼,得到最終的公鑰

// err = pem.encode(os.stdout, &block)

err = pem.

encode

(f1,

&block)

if err !=

nilreturn

nil}

注意在生成公鑰的時候marshalpkixpublickey後面的要要傳位址&pubkeygo語言實現公鑰加密,私鑰解密

公鑰加密

流程讀取公鑰檔案

解碼,得到block

得到der

得到公鑰加密

**

func

getrsapubkey

(filename string)(

*rsa.publickey,

error

)//2. 解碼,得到block,

// block, rest := pem.decode(info)

block,

_:= pem.

decode

(info)

//3. 得到der

der := block.bytes

//4. 得到公鑰

// func parsepkixpublickey(derbytes byte) (pub inte***ce{}, err error)

// parsepkixpublickey解析乙個der編碼的公鑰。這些公鑰一般在以"begin public key"出現的pem塊中。

// dertext, err = x509.marshalpkixpublickey(&pubkey) //這是編碼過程

pubinte***ce, err := x509.

parsepkixpublickey

(der)

//這是解碼過程

if err !=

nil//斷言

pubkey, ok := pubinte***ce.

(*rsa.publickey)

//斷言失敗,返回錯誤資訊

if!ok

return pubkey,

nil}

//5. 加密

func

rsaencryptdata

(filename string

,src [

]byte)(

byte

,error

)// encryptpkcs1v15(rand io.reader, pub *publickey, msg byte) (byte, error)

encryptinfo, err := rsa.

encryptpkcs1v15

(rand.reader, pubkey, src)

if err !=

nilreturn encryptinfo,

nil}

私鑰解密

流程讀取私鑰檔案

解碼,得到block

得到der

得到私鑰解密

**

func

getrsaprikey

(filename string)(

*rsa.privatekey,

error

)//2. 解碼,得到block,

block,

_:= pem.

decode

(info)

//3. 得到der

der := block.bytes

//4. 得到私鑰

prikeyinter, err := x509.

parsepkcs8privatekey

(der)

if err !=

nil//斷言

prikey, ok := prikeyinter.

(*rsa.privatekey)

//斷言失敗,返回錯誤資訊

if!ok

return pubkey,

nil}

//5. 解密

func

rsadecryptdata

(filename string

,src [

]byte)(

byte

,error

) info, err := rsa.

decryptpkcs1v15

(rand.reader, prikey, src)

if err !=

nilreturn info,

nil}

對稱加密 非對稱加密

區別在於加密金鑰和解密金鑰是否一樣,一樣則是對稱加密,不一樣則是非對稱加密。對稱加密計算量小,但若不同的客戶端使用不能的金鑰時,伺服器的複雜大。常用的對稱加密包括 des 3des aes des 3des使用的架構為feistel。des金鑰長度為56位,3des相容des,可設定3個56位密碼,...

對稱加密 非對稱加密

1 對稱加密 對稱加密採用了對稱密碼編碼技術,它的特點是檔案加密和解密使用相同的金鑰,即加密金鑰也可以用作解密金鑰,這種方法在密碼學中叫做對稱加密演算法,對稱加密演算法使用起來簡單快捷,金鑰較短,且破譯困難,除了資料加密標準 des 另乙個對稱金鑰加密系統是國際資料加密演算法 idea 它比des的...

對稱加密 非對稱加密

演算法選擇 對稱加密aes,非對稱加密 ecc,訊息摘要 md5,數字簽名 dsa 對稱加密演算法 加解密金鑰相同 名稱金鑰長度 運算速度 安全性資源消耗 des56位較快低 中3des 112位或168位慢中 高aes 128 192 256位快高 低非對稱演算法 加密金鑰和解密金鑰不同 名稱成熟...