首頁 >後端開發 >Golang >golang代碼能不能加密

golang代碼能不能加密

尚
原創
2019-12-28 14:38:013817瀏覽

golang代碼能不能加密

golang程式碼加密方法:

DES加解密

golang中的標準函式庫crypto/des中有DES的實現,但是golang函式庫的描述比較簡單,如果不熟悉DES的加密規則,是不容易
進行對應程式碼寫的,與第三方進行不同語言之間的加密與解密時,也容易混淆,出現錯誤。

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

Windows 預設是CBC模式,CryptSetKeyParam函數,openssl函數名稱中直接顯示

Java 中如果Cipher.getInstance()中不填寫,預設是DES/ECB/PKCS5Padding

C# 中預設是CBC模式,PKCS7Padding(PKCS5Padding)

golang預設提供的是CBC模式,所以對於ECB模式,需要自己寫程式碼

PKCS5Padding與PKCS5Unpadding

    func PKCS5Padding(ciphertext []byte, blockSize int) []byte {
        padding := blockSize - len(ciphertext)%blockSize
        padtext := bytes.Repeat([]byte{byte(padding)}, padding)
        return append(ciphertext, padtext...)
    }
 
    func PKCS5Unpadding(origData []byte) []byte {
        length := len(origData)
        unpadding := int(origData[length-1])
        return origData[:(length - unpadding)]
    }

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 {
            block.Encrypt(dst, src[:bs])
            src = src[bs:]
            dst = dst[bs:]
        }
        ...
    }

RSA加解密

與其他語言預設有更高階的封裝不同,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

清楚了上面幾種概念與格式之後,編寫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)
    ...

更多golang知識請關注golang教程欄位。

以上是golang代碼能不能加密的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn