對稱加密存在的問題
非對稱加密
加密解密使用不相同同的鑰匙
加密流程
對稱加密與非對稱加密對比
秘鑰數量: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
後面的要要傳位址&pubkey
go語言實現公鑰加密,私鑰解密
公鑰加密
流程讀取公鑰檔案
解碼,得到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位快高 低非對稱演算法 加密金鑰和解密金鑰不同 名稱成熟...