golang中幾種加密方式的處理

2021-08-31 03:27:56 字數 3019 閱讀 9829

在與第三方平台進行接入的時候,通常會存在一些簽名或者加密的處理,在進行開發的時候,因為語言的

不同,需要按照規範進行相應處理。

des:

golang中的標準庫crypto/des中有des的實現,但是golang庫的描述比較簡單,如果不熟悉des的加密規則,是不容易

進行相應**編寫的,與第三方進行不同語言之間的加密與解密時,也容易混淆,出現錯誤。

des區分為cbc和ebc加密模式,並且有不同的填充方式。

cbc(等):

padding:

注意pkcs#5 padding is identical to pkcs#7 padding

所以對不同的平台與語言進行des加解密對接時,需要知道對方的是採用何種加密模式以及何種填充方式:

golang預設提供的是cbc模式,所以對於ecb模式,需要自己編寫**

pkcs5padding與pkcs5unpadding

func pkcs5padding(ciphertext byte, blocksize int) byte , padding)

}func pkcs5unpadding(origdata byte) byte

ecb加密模式

block, err := des.newcipher(key)

if err != nil

bs := block.blocksize()

src = pkcs5padding(src, bs)

if len(src)%bs != 0

out := make(byte, len(src))

dst := out

for len(src) > 0

...}

ecb下的解密

block, err := des.newcipher(key)

if err != nil

out := make(byte, len(src))

dst := out

bs := block.blocksize()

if len(src)%bs != 0

for len(src) > 0

out = pkcs5unpadding(out)

與其他語言預設有更高階的封裝不同,golang中需要依據不同的概念,自己組合進行封裝處理,為此,需要先理解幾個不同的概念。

pem: 通常是以.pem結尾的檔案,在金鑰儲存和x.509證書體系中使用比較多,下面是乙個x509證書下的pem格式:

-----begin certificate-----

base64

-----end certificate-----

pkcs:這是乙個龐大的體系,不同的金鑰採用不同的pkcs檔案格式。如私鑰採用pkcs8。

x.509:這是乙個公鑰管理基礎(public key infrastructure, pki),在ietf中通常對應pkix。

說明:使用 openssl(如openssl genrsa -out rsa_private_key.pem 1024)生成的pem檔案,就是符合pem格式的,以-----begin rsa private key-----開頭,-----end rsa private key-----結尾。

也可以轉換為pkcs8:

openssl pkcs8 -topk8 -inform pem -in rsa_private_key.pem -outform pem -nocrypt
注意,雖然資料格式pkcs8格式,但是-outform也表明了,檔案格式仍舊是符合pem格式的,只是兩個pem檔案是存在差異的。

清楚了上面幾種概念與格式之後,編寫golang對應的公鑰與私鑰加解密方式,就相對容易一些,首先是將pem檔案解碼,然後進行對應的密碼解碼為golang支援的結構體,再進行相應的處理。

如對於私鑰,可以進行如下操作進行簽名:

block, _ := pem.decode(byte(key))

if block == nil

private, err := x509.parsepkcs8privatekey(block.bytes)

if err != nil

h := crypto.hash.new(crypto.sha1)

h.write(data)

hashed := h.sum(nil)

// 進行rsa加密簽名

signeddata, err := rsa.signpkcs1v15(rand.reader, private.(*rsa.privatekey), crypto.sha1, hashed)

...

通過私鑰進行解密,**格式如下;

block, _ := pem.decode(byte(key))

if block == nil

private, err := x509.parsepkcs8privatekey(block.bytes)

if err != nil

v, err := rsa.decryptpkcs1v15(rand.reader, private, data)

...

對於公鑰對資料進行加密:

block, _ := pem.decode(byte(key))

if block == nil

pub, err := x509.parsepkixpublickey(block.bytes)

if err != nil

encrypteddata, err := rsa.encryptpkcs1v15(rand.reader, pub.(*rsa.publickey), data)

...

搞清楚具體的加密方式,然後再在golang裡面編寫,**還是很清晰也不難看懂。

golang中讀取檔案的幾種方式

golang中的檔案的讀取很多是做配置檔案使用,還有是讀取影象作為file類,儲存至檔案系統中,下面分別說明 type globalconf struct 配置檔案中字母要小寫,結構體屬性首字母要大寫 type dbconf struct var config globalconf配置檔案名稱 co...

幾種常見的加密方式介紹

密碼學在電腦科學中使用非常廣泛,https就是建立在密碼學基礎之上的一種安全的通訊協議。https早在1994年由網景公司首次提出,而如今在眾多網際網路廠商的推廣之下https已經被廣泛使用在各種大小 中。在完全理解https之前,有必要弄清楚一些密碼學相關的概念,比如 明文 密文 密碼 金鑰 對稱...

C 幾種常用的加密方式

aes演算法基於排列和置換運算。排列是對資料重新進行安排,置換是將乙個資料單元替換為另乙個。aes 使用幾種不同的方法來執行排列和置換運算。aes是乙個迭代的 對稱金鑰分組的密碼,它可以使用128 192 和 256 位金鑰,並且用 128 位 16位元組 分組加密和解密資料。與公共金鑰密碼使用金鑰...