golang中RSA、HASH等常用加/解密、簽名/驗籤方式的封裝處理

前言

我在前文golang中關於RSA加密、解密、簽名、驗籤的通用處理方式中初步封裝了一個RSA相關的加/解密、簽名/驗籤的通用處理方案,也提到了進一步封裝更多加解密方式可能,此次就特意添加了針對DES、AES、HMAC、HASH的常見使用方式封裝。爲適應新的結構,特意調整了相關的結構,因此此版本與之前的版本並不兼容,需要特別注意。倉庫地址gocrypt,歡迎star和fork。

方案簡單說明

方案主要根據golang官方包crypto的架構組織,以package名稱限制各種加解密的入口。以NewFunc的形式構造相關對象,然後調用對應的方法。

特別說明

此版本新增了AES、DES、3DES、HMAC、HASH等常見加/解密及hash獲取方式,結構作了些調整,由之前的版本更新到此版本時一定要注意引用方法包名的變化。
AES/DES塊加密時,填充默認採用PKCS7 padding(如果塊大小爲64 位(8字節)時,此時PKCS7與PKCS5結果一致).

get & import

go get github.com/yuchenfw/gocrypt

使用方法

1.構建需要加解密的類型handle

handleRSA := rsa.NewRSACrypt(secretInfo)//RSA
handleDES := des.NewDESCrypt(key)//des
handle3DES := des.NewTripleDESCrypt(key)//3des
handleAES := aes.NewAESCrypt(key)//aes
handleHash := hash.NewHash(hashType)//common hash
handleHMAC := hash.NewHMAC(hashType,key)//hmac

2.加密、解密、hash、hmac

(1)加密

加密指定字符串,並以指定編碼格式輸出結果

encrypt, err := handle.Encrypt(src)//des/3des/aes

(2)解密

解密指定格式編碼後的加密串,返回原字符串

decrypt, err := handle.Decrypt(src)//des/3des/aes

(3)hash/hmac

哈希運算/密鑰相關的哈希運算。

    handle.Get([]byte("123456"))//輸出[]byte
    handle.EncodeToString([]byte("123456"),gocrypt.HEX)//輸出爲hex格式的字符串

RSA加密、解密、簽名、驗籤

1.設置公私鑰信息

    secretInfo := gocrypt.SecretInfo{
        PublicKey:          "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyoiAraTnAbCoqGVOKugFDM2/ms2szXmb3zTOU3ByicH/XPZqy7Eougbs8OQQIoNW4xKw8PNyWf0lfr90qBfPj27INn6N7umVmbHCNCKkQ4frPn46xesw1ywtc2GhOEzZlC8ajlnzBUkj5FJZcrNjXfFmfsQcFQP0g/o/3CAUpk1BXFXt7eZsaYdyn0m7fMoyFt1wlF8egQeGYYE98vtKsvrII51HK8vOEf+5VXU4UZxGfvyzS3A8kuNEkKEh1n9mazjfPBT0KGSiOGh7Nugks+jjfswSgXRK/b2eP3fS7U625rbS798pKxnoS2E0Pgpzdk5fWoNgAlG/n2F9oI2/kQIDAQAB",
        PublicKeyDataType:  gocrypt.Base64,
        PrivateKey:         "MIIEowIBAAKCAQEAyoiAraTnAbCoqGVOKugFDM2/ms2szXmb3zTOU3ByicH/XPZqy7Eougbs8OQQIoNW4xKw8PNyWf0lfr90qBfPj27INn6N7umVmbHCNCKkQ4frPn46xesw1ywtc2GhOEzZlC8ajlnzBUkj5FJZcrNjXfFmfsQcFQP0g/o/3CAUpk1BXFXt7eZsaYdyn0m7fMoyFt1wlF8egQeGYYE98vtKsvrII51HK8vOEf+5VXU4UZxGfvyzS3A8kuNEkKEh1n9mazjfPBT0KGSiOGh7Nugks+jjfswSgXRK/b2eP3fS7U625rbS798pKxnoS2E0Pgpzdk5fWoNgAlG/n2F9oI2/kQIDAQABAoIBAF378hqiR0CVhe5+9EMc4BsM7zka8HF5WUe+7W/y4nPivmmZP/29/DQ3OoSekI4zfIJrDgkCL7JqspeaqLvIMN1Sfz4qhBq18mIcBw7CdI+R5yxcz1FAzq1LJtxAFdxWbTFCmoQsYYW2Zx1wyWlcrWPOvc1dm9p0t2b3HeM8T9jLdY+D0Bm9zmAS0nwTuDBxYS77DB9Ncl6pWLLd197/5IoN1/nunFuzpkiwMPI9RF7lgrnUthc/1Gfnylz5/tXCiQsEVSbAdbMXt9nsV0RgVeMcPq/aUqTMLS2lIV8JySWDrRQi4yPHU0hIjcp6ggo53YMuncJZweI/wwkJexojz0ECgYEA5QzRObpU0CryfJ7qa97/USIKHbvl6PuQG9OLyUeP9bG0edidQhUrR4EZwjIl73O8CTJ0bB24wAKZZEOK3eJeqG/N0q+CiD83ygr8pSZzpE1xvqQp32IgXtgvm7/UmT8cfAp05Z3bF4jcA8uXwodBz4NsVGijlO78PsCooLsArM0CgYEA4lz5pXDEN3w5JwkbspLnUSUS738hne8YM0PchCaww+8sXLS9GLL2CHcvwh6Tv9Mee7r6SdbDI73x118y68WEDDhidiYZCLhXJN2v12ezJOMqH5m9wVJzQOGNv6kPV1EW1WlWxoJQGxCdzbZMLxtTbyTZe3+iAVG++8u6NWMV3dUCgYA1dm1rnQto321kGy+6Z/2OMXTNBeufGwDDDfilzZdTkNwASMhEAW7trLuXcV8bahcsymMUTUevQawOFBnYupq/lAEluSOtq5vZBAF+huAdLJptFiJT6rKFkM5j+z2jW3DJnyMz6UmXT7GTDTVqCWoaBqIFfbsY60NjXlK92YhJzQKBgQDWfQjktbSHasLw9RV0oPRklD+cBhfBgfOpZ+0En3CxR+j+MxhW1gSBQwZS5wxTIGXrEeHlo4UmUe5diExE0dRsi+ToVPM1qw6P1SuwbQd3tXSNmu0NyOWCnfblm/j4YNLFB1p9IK9s5dLRQKJxpG/ribw15FuK6n2QM5vOyIPIvQKBgE5PUzRUCCVsjKAxZOfaZQatMbSzAUSB3bNmUw+F3pDq8ibs6XXvtySowG2femlPDNL7mDMuUc9kYrtTFTQNrEsQGB55wBopX3UxzRjpXJoAQ/d+RPdrSJC7xJyu+URoFI6ae0I3bx1BzjctYU0Rv5DUh+j9leMH5N2S9vHb+vqu",
        PrivateKeyType:     gocrypt.PKCS1,
        PrivateKeyDataType: gocrypt.Base64,
    }

加密、解密、簽名、驗籤

(1)RSA加密

加密指定字符串,並以指定編碼格式輸出結果

encrypt, err := handle.Encrypt("test", gocrypt.HEX)
    if err != nil {
        fmt.Println("encrypt error :", err)
        return
    }
    fmt.Println("encrypt data :", encrypt)

(2)RSA解密

解密指定格式編碼後的加密串,返回原字符串

    decrypt, err := handle.Decrypt(encrypt, gocrypt.HEX)
    if err != nil {
        fmt.Println("decrypt error :", err)
        return
    }
    fmt.Println("decrypt data :", decrypt)

(3)RSA簽名

以指定摘要算法簽名,並以指定編碼格式輸出結果,僅適用於RSA。

    sign, err := handle.Sign("test", gocrypt.SHA256, gocrypt.HEX)
    if err != nil {
        fmt.Println("sign error :", err)
        return
    }
    fmt.Println("sign data :", sign)

(4)RSA驗籤

驗證字符串是否是以指定摘要算法編碼的簽名串的原始字符串,僅適用於RSA。

    verifySign, err := handle.VerifySign("test", gocrypt.SHA256, sign, gocrypt.HEX)
    if err != nil {
        fmt.Println("verifySign error :", err)
        return
    }
    fmt.Println("verifySign result :", verifySign)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章