国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Go語言做對稱加密怎么做

開關(guān)電源芯片 ? 來源:CSDN博客 ? 作者:尹成學(xué)院 ? 2021-08-23 09:44 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

【導(dǎo)讀】什么是對稱加密?Go 語言做對稱加密怎么做?本文作者從加密原理到代碼實現(xiàn)帶你上車。

對稱加密中,加密和解密使用相同的密鑰,因此必須向解密者配送密鑰,即密鑰配送問題。而非對稱加密中,由于加密和解密分別使用公鑰和私鑰,而公鑰是公開的,因此可以規(guī)避密鑰配送問題。非對稱加密算法,也稱公鑰加密算法。

1977 年,Ron Rivest、Adi Shamir、Leonard Adleman 三人在美國公布了一種公鑰加密算法,即 RSA 公鑰加密算法。RSA 是目前最有影響力和最常用的公鑰加密算法,可以說是公鑰加密算法的事實標(biāo)準(zhǔn)。

一、RSA 加密原理

使用 M 和 C 分別表示明文和密文,則 RSA 加密、解密過程如下:

img

其中 e、n 的組合 (e, n) 即為公鑰,d、n 的組合 (d, n) 即為私鑰。當(dāng)然 e、d、n 并非任意取值,需要符合一定條件,如下即為 e、d、n 的求解過程。

生成密鑰對

e、d、n 的求解過程,也即生成密鑰對的過程。涉及如下步驟:1、取兩個大質(zhì)數(shù)(也稱素數(shù))p、q,n = pq。2、取正整數(shù) e、d,使得 ed mod (p-1)(q-1) = 1,也即:ed ≡ 1 mod (p-1)(q-1)。e 和 d 是模 (p-1)(q-1) 的乘法逆元,僅當(dāng) e 與 (p-1)(q-1) 互質(zhì)時,存在 d。舉例驗證:1、取 p、q 分別為 13、17,n = pq = 221。2、而 (p-1)(q-1) = 12x16 = 192,取 e、d 分別為 13、133,有 13x133 mod 192 = 1取明文 M = 60,公鑰加密、私鑰解密,

RSA 加密原理證明過程

手動求解密鑰對中的 d

ed mod (p-1)(q-1) = 1,已知 e 和 (p-1)(q-1) 求 d,即求 e 對模 (p-1)(q-1) 的乘法逆元。如上面例子中,p、q 為 13、17,(p-1)(q-1)=192,取 e=13,求 13d mod 192 = 1 中的 d。13d ≡ 1 (mod 192),在右側(cè)添加 192 的倍數(shù),使計算結(jié)果可以被 13 整除。13d ≡ 1 + 192x9 ≡ 13x133 (mod 192),因此 d = 133其他計算方法有:費馬小定律、擴(kuò)展歐幾里得算法、歐拉定理。

RSA 安全性

由于公鑰公開,即 e、n 公開。因此破解 RSA 私鑰,即為已知 e、n 情況下求 d。因 ed mod (p-1)(q-1) = 1,且 n=pq,因此該問題演變?yōu)椋簩?n 質(zhì)因數(shù)分解求 p、q。目前已被證明,已知 e、n 求 d 和對 n 質(zhì)因數(shù)分解求 p、q 兩者是等價的。實際中 n 長度為 2048 位以上,而當(dāng) n》200 位時分解 n 是非常困難的,因此 RSA 算法目前仍被認(rèn)為是安全實用的。

RSA 計時***和防范

RSA 解密的本質(zhì)是模冪運算

img

其中 C 為密文,(d,n) 為私鑰,均為超過 1024 位的大數(shù)運算,直接計算并不可行,因此最經(jīng)典的算法為蒙哥馬利算法。而這種計算是比較是耗時的,因此者可以觀察不同的輸入對應(yīng)的解密時間,通過分析推斷私鑰,稱為計時。而防范 RSA 計時的辦法,即在解密時加入隨機(jī)因素,使得***者無法準(zhǔn)確獲取解密時間。

二、Go RSA 加密解密

1、rsa 加解密,必然會去查 crypto/ras 這個包

Package rsa implements RSA encryption as specified in PKCS#1.

這是該包的說明:實現(xiàn) RSA 加密技術(shù),基于 PKCS#1 規(guī)范。

對于什么是 PKCS#1,可以查閱相關(guān)資料。PKCS(公鑰密碼標(biāo)準(zhǔn)),而#1 就是 RSA 的標(biāo)準(zhǔn)??梢圆榭矗篜KCS 系列簡介

從該包中函數(shù)的名稱,可以看到有兩對加解密的函數(shù)。

EncryptOAEP 和 DecryptOAEPEncryptPKCS1v15 和 DecryptPKCS1v15

這稱作加密方案,詳細(xì)可以查看,PKCS #1 v2.1 RSA 算法標(biāo)準(zhǔn)

可見,當(dāng)與其他語言交互時,需要確定好使用哪種方案。

PublicKey 和 PrivateKey 兩個類型分別代表公鑰和私鑰,關(guān)于這兩個類型中成員該怎么設(shè)置,這涉及到 RSA 加密算法,本文中,這兩個類型的實例通過解析文章開頭生成的密鑰得到。

2、解析密鑰得到 PublicKey 和 PrivateKey 的實例

這個過程,我也是花了好些時間(主要對各種加密的各種東東不熟):怎么將 openssl 生成的密鑰文件解析到公鑰和私鑰實例呢?

在 encoding/pem 包中,看到了—–BEGIN Type—–這樣的字樣,這正好和 openssl 生成的密鑰形式差不多,那就試試。

在該包中,一個 block 代表的是 PEM 編碼的結(jié)構(gòu),關(guān)于 PEM,請查閱相關(guān)資料。我們要解析密鑰,當(dāng)然用 Decode 方法:

func Decode(data []byte) (p *Block, rest []byte)

這樣便得到了一個 Block 的實例(指針)。

解析來看 crypto/x509。為什么是 x509 呢?這又涉及到一堆概念。先不管這些,我也是看 encoding 和 crypto 這兩個包的子包摸索出來的。在 x509 包中,有一個函數(shù):

func ParsePKIXPublicKey(derBytes []byte) (pub interface{}, err error)

從該函數(shù)的說明:ParsePKIXPublicKey parses a DER encoded public key. These values are typically found in PEM blocks with “BEGIN PUBLIC KEY”??梢娺@就是解析 PublicKey 的。另外,這里說到了 PEM,可以上面的 encoding/pem 對了。(PKIX 是啥東東,查看這里 )

而解析私鑰的,有好幾個方法,從上面的介紹,我們知道,RSA 是 PKCS#1,剛好有一個方法:

func ParsePKCS1PrivateKey(der []byte) (key *rsa.PrivateKey, err error)

返回的就是 rsa.PrivateKey。

代碼實現(xiàn):

package main

import (

“crypto/rsa”

“crypto/rand”

“crypto/x509”

“encoding/pem”

“os”

“fmt”

func RSAGenKey(bits int) error {

/*

生成私鑰

*/

//1、使用 RSA 中的 GenerateKey 方法生成私鑰

privateKey, err := rsa.GenerateKey(rand.Reader, bits)

if err != nil {

return err

}

//2、通過 X509 標(biāo)準(zhǔn)將得到的 RAS 私鑰序列化為:ASN.1 的 DER 編碼字符串

privateStream := x509.MarshalPKCS1PrivateKey(privateKey)

//3、將私鑰字符串設(shè)置到 pem 格式塊中

block1 := pem.Block{

Type: “private key”,

Bytes: privateStream,

}

//4、通過 pem 將設(shè)置的數(shù)據(jù)進(jìn)行編碼,并寫入磁盤文件

fPrivate, err := os.Create(“privateKey.pem”)

if err != nil {

return err

}

defer fPrivate.Close()

err = pem.Encode(fPrivate, &block1)

if err != nil {

return err

}

/*

生成公鑰

*/

publicKey:=privateKey.PublicKey

publicStream,err:=x509.MarshalPKIXPublicKey(&publicKey)

//publicStream:=x509.MarshalPKCS1PublicKey(&publicKey)

block2:=pem.Block{

Type:“public key”,

Bytes:publicStream,

}

fPublic,err:=os.Create(“publicKey.pem”)

if err!=nil {

return err

}

defer fPublic.Close()

pem.Encode(fPublic,&block2)

return nil

}

//對數(shù)據(jù)進(jìn)行加密操作

func EncyptogRSA(src []byte,path string) (res []byte,err error) {

//1. 獲取秘鑰(從本地磁盤讀取)

f,err:=os.Open(path)

if err!=nil {

return

}

defer f.Close()

fileInfo,_:=f.Stat()

b:=make([]byte,fileInfo.Size())

f.Read(b)

// 2、將得到的字符串解碼

block,_:=pem.Decode(b)

// 使用 X509 將解碼之后的數(shù)據(jù) 解析出來

//x509.MarshalPKCS1PublicKey(block): 解析之后無法用,所以采用以下方法:ParsePKIXPublicKey

keyInit,err:=x509.ParsePKIXPublicKey(block.Bytes) //對應(yīng)于生成秘鑰的 x509.MarshalPKIXPublicKey(&publicKey)

//keyInit1,err:=x509.ParsePKCS1PublicKey(block.Bytes)

if err!=nil {

return

}

//4. 使用公鑰加密數(shù)據(jù)

pubKey:=keyInit.(*rsa.PublicKey)

res,err=rsa.EncryptPKCS1v15(rand.Reader,pubKey,src)

return

}

//對數(shù)據(jù)進(jìn)行解密操作

func DecrptogRSA(src []byte,path string)(res []byte,err error) {

//1. 獲取秘鑰(從本地磁盤讀取)

f,err:=os.Open(path)

if err!=nil {

return

}

defer f.Close()

fileInfo,_:=f.Stat()

b:=make([]byte,fileInfo.Size())

f.Read(b)

block,_:=pem.Decode(b)//解碼

privateKey,err:=x509.ParsePKCS1PrivateKey(block.Bytes)//還原數(shù)據(jù)

res,err=rsa.DecryptPKCS1v15(rand.Reader,privateKey,src)

return

}

func main() {

//rsa.GenerateKey()

err:=RSAGenKey(4096)

if err!=nil {

fmt.Println(err)

return

}

fmt.Println(“秘鑰生成成功!”)

str:=“山重水復(fù)疑無路,柳暗花明又一村!”

fmt.Println(“加密之前的數(shù)據(jù)為:”,string(str))

data,err:=EncyptogRSA([]byte(str),“publicKey.pem”)

data,err=DecrptogRSA(data,“privateKey.pem”)

fmt.Println(“加密之后的數(shù)據(jù)為:”,string(data))

}

責(zé)任編輯:haq

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4967

    瀏覽量

    73954
  • RSA
    RSA
    +關(guān)注

    關(guān)注

    0

    文章

    60

    瀏覽量

    19690

原文標(biāo)題:GO 語言 RSA 加密解密

文章出處:【微信號:gh_3980db2283cd,微信公眾號:開關(guān)電源芯片】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    Go 語言高并發(fā)服務(wù)設(shè)計與性能調(diào)優(yōu)實戰(zhàn):從萬級到百萬級并發(fā)的演進(jìn)之路

    在2026年的今天,Go 語言已成為高并發(fā)后端服務(wù)的首選語言。根據(jù) Stack Overflow 最新開發(fā)者調(diào)查: 指標(biāo) 數(shù)據(jù) Go 語言
    發(fā)表于 02-18 19:19

    低成本TLI4971/TLE4971電流傳感器評估套件——MS2Go與S2Go

    低成本TLI4971/TLE4971電流傳感器評估套件——MS2Go與S2Go 在電子工程師的日常工作中,電流傳感器的評估和應(yīng)用是一個重要的環(huán)節(jié)。今天我們要介紹的是英飛凌(Infineon
    的頭像 發(fā)表于 12-19 16:50 ?827次閱讀

    探索TLE493D-P3XX-MS2GO 3D 2Go套件:開啟3D磁傳感器評估之旅

    探索TLE493D-P3XX-MS2GO 3D 2Go套件:開啟3D磁傳感器評估之旅 在電子工程師的日常工作中,評估和開發(fā)磁傳感器是一項常見且重要的任務(wù)。英飛凌(Infineon
    的頭像 發(fā)表于 12-18 17:15 ?810次閱讀

    STM32L476低功耗怎么做

    STM32L476低功耗怎么做
    發(fā)表于 11-11 16:48

    快問快答:氣密性檢測到底是怎么做的?如何定義氣密性測試標(biāo)準(zhǔn)

    :氣密性檢測是怎么做的?氣密性測試標(biāo)準(zhǔn)如何定義?并結(jié)合國產(chǎn)代表品牌精誠工科(JCGK)的實際應(yīng)用,為您建立一份系統(tǒng)化理解。Ⅰ.什么是氣密性檢測?氣密性檢測(Lea
    的頭像 發(fā)表于 11-11 11:56 ?896次閱讀
    快問快答:氣密性檢測到底是<b class='flag-5'>怎么做</b>的?如何定義氣密性測試標(biāo)準(zhǔn)

    電能質(zhì)量在線監(jiān)測裝置的數(shù)據(jù)在云端是如何加密的?

    裝置上傳至云端時,強(qiáng)制使用 TLS 1.3 (或更高版本)加密通道。例如,Elspec G5DFR 裝置通過 HTTPS 協(xié)議傳輸數(shù)據(jù),采用 AES-256-GCM 對稱加密與 ECDHE 密鑰交換,確保即使數(shù)據(jù)被攔截也無法解密
    的頭像 發(fā)表于 10-30 09:42 ?317次閱讀

    加密算法的應(yīng)用

    保證信息傳輸過程中的安全性。只有經(jīng)過特定的解密算法才能還原出原始的明文。因此,加密算法是一種保護(hù)信息安全的手段。 3. 加密算法的分類 根據(jù)加密算法中密鑰的使用情況,可以將加密
    發(fā)表于 10-24 08:03

    AES加密流程

    AES(Advanced Encryption Standard)是一種對稱密鑰加密算法,它是當(dāng)前最常用的加密標(biāo)準(zhǔn)之一。AES是一種可靠、高效和安全的加密技術(shù),被廣泛應(yīng)用于網(wǎng)絡(luò)安全、移
    發(fā)表于 10-23 06:13

    對稱密鑰生成和轉(zhuǎn)換規(guī)格詳解

    對稱密鑰生成和轉(zhuǎn)換規(guī)格
    發(fā)表于 09-01 06:05

    當(dāng)系統(tǒng)和用戶交換機(jī)沒有連接 HXT(高速晶體振蕩器)時,應(yīng)該怎么做?

    當(dāng)系統(tǒng)和用戶交換機(jī)沒有連接 HXT(高速晶體振蕩器)時,用戶應(yīng)該怎么做
    發(fā)表于 08-28 07:41

    安芯半導(dǎo)體發(fā)布全新防復(fù)制加密芯片RJGT28E30

    ECC橢圓曲線加密算法是一種非對稱加密算法,相對于對稱加密算法,更便于密鑰的管理,且相對于等密鑰長度的RSA算法更安全。
    的頭像 發(fā)表于 06-10 17:53 ?1329次閱讀
    安芯半導(dǎo)體發(fā)布全新防復(fù)制<b class='flag-5'>加密</b>芯片RJGT28E30

    從 Java 到 Go:面向?qū)ο蟮木奕伺c云原生的輕騎兵

    Go 語言在 2009 年被 Google 推出,在創(chuàng)建之初便明確提出了“少即是多(Less is more)”的設(shè)計原則,強(qiáng)調(diào)“以工程效率為核心,用極簡規(guī)則解決復(fù)雜問題”。它與 Java 語言生態(tài)
    的頭像 發(fā)表于 04-25 11:13 ?642次閱讀

    LTC5588-1的基帶輸入可以用單端的方式輸入嗎?具體該怎么做

    LTC5588-1的基帶輸入可以用單端的方式輸入嗎?具體該怎么做?
    發(fā)表于 04-15 06:10

    如何在MBDT中使用S32k344進(jìn)行加密?

    我想加密和解密通過 CAN 總線發(fā)送的數(shù)據(jù),為此我想使用 S32k344 中的 HSE 模塊在 MBDT 1.5 中進(jìn)行對稱加密-解密,但工具箱中沒有可用的塊。那我該怎么做呢。請分享與
    發(fā)表于 03-25 07:21

    0基礎(chǔ)小白請教這個有關(guān)二極管的題目怎么做?謝謝!

    0基礎(chǔ)小白請教這個有關(guān)二極管的題目怎么做?謝謝!
    發(fā)表于 03-13 11:42