md5签名算法
md5加密是我们常用的一种加密算法,可以对明文进行处理产生一个128位(16字节)的散列值,为了便于展示和读写一般将128位的二进制数转换成32位16进制数(如:655A6E9A375DF4F82B730833C807AADD)。通常用在密码存储和文件的完整性校验上。
func Md5Str(src string) string {
    has = md5.New()
    has.Write([]byte(src))
    return hex.EncodeToString(has.Sum(nil))
}
哈希sha签名算法
哈希函数,又称散列算法,是一种从任何一种数据中创建小的数字“指纹”的方法。散列函数把消息或数据压缩成摘要,使得数据量变小,将数据的格式固定下来。该函数将数据打乱混合,重新创建一个叫做散列值(或哈希值)的指纹。散列值通常用一个短的随机字母和数字组成的字符串来代表。对于任意长度的消息,SHA256都会产生一个256bit长的哈希值,称作消息摘要。
// 哈希sha256算法
func HmacSha256(src, key string) string {
    has = hmac.New(sha256.New, []byte(key))
    has.Write([]byte(src))
    return hex.EncodeToString(has.Sum(nil))
}
//哈希sha512签名算法
func HmacSha512(src, key string) string {
    has = hmac.New(sha512.New, []byte(key))
    has.Write([]byte(src))
    return hex.EncodeToString(has.Sum(nil))
}
//哈希sha1签名算法
func HmacSha1(src, key string) string {
    has = hmac.New(sha1.New, []byte(key))
    has.Write([]byte(src))
    return hex.EncodeToString(has.Sum(nil))
}

//sha256密码散列函数
func Sha256str(src string) string {
    has = sha256.New()
    has.Write([]byte(src))
    return hex.EncodeToString(has.Sum(nil))
}
//sha512密码散列函数
func Sha512str(src string) string {
    has = sha512.New()
    has.Write([]byte(src))
    return hex.EncodeToString(has.Sum(nil))
}
//sha1密码散列函数
func Sha1str(src string) string {
    has = sha1.New()
    has.Write([]byte(src))
    return hex.EncodeToString(has.Sum(nil))
}
base64 编码、解码函数
规则如下:
- step1、找到每个字母对应的acsii码的二进制(八位表达,1个字节8位)如Man对应的ASCII码值分别为77,97,110,对应的二进制值是01001101、01100001、01101110
- step2、将step1得到的二进制24位每6位二进制位一组(如果不能整除要加一组0直到被6整除为止)分成四组,也就是00010011、00010110、00000101、00101110 (将6位前面补0满足8位)
- step3、再跟base64的编码表做对比,上述也就是19、22、5、46
- step4、用上面的值在Base64编码表中进行查找,分别对应:T、W、F、u。因此“Man”Base64编码之后就变为:TWFu
// base64编码函数
func Base64EncodeStr(src string) string {
    return string(base64.StdEncoding.EncodeToString([]byte(src)))
}

// base64解码函数
func Base64DecodeStr(src string) string {
    data, err = base64.StdEncoding.DecodeString(src)
    if err != nil {
        return ""
    }
    return string(data)
}
非对称加密算法(RSA)
1、乙方生成两把密钥(公钥和私钥)。公钥是公开的,任何人都可以获得,私钥则是保密的。
2、甲方获取乙方的公钥,然后用它对信息加密。
3、乙方得到加密后的信息,用私钥解密。
/**
 * 生成公钥、私钥文件
 */
func GenRsaKey(bits int, privatePath, publicPath string) error {

    /*****生成私钥文件*******/
    privateKey, err = rsa.GenerateKey(rand.Reader, bits)
    if err != nil {
        return err
    }
    data = x509.MarshalPKCS1PrivateKey(privateKey)
    block := pem.Block{
        Type:  "RSA PRIVATE KEY",
        Bytes: data,
    }
    privateFile, err = os.Create(privatePath)
    defer privateFile.Close()
    err = pem.Encode(privateFile, &block)
    if err != nil {
        return err
    }

    /***********生成公钥文件************/
    publicKey = &privateKey.PublicKey
    data = x509.MarshalPKCS1PublicKey(publicKey)
    block = pem.Block{
        Type:  "RSA PUBLIC KEY",
        Bytes: data,
    }
    publicFile, err = os.Create(publicPath)
    defer publicFile.Close()
    if err != nil {
        return err
    }
    err = pem.Encode(publicFile, &block)
    if err != nil {
        return err
    }
    return nil
}

/**
 * 公钥加密函数
 */
func RsaEncrypt(src []byte, filename string) ([]byte, error) {
    publicFile, err = os.Open(filename)
    if err != nil {
        panic(err)
        return nil, err
    }
    defer publicFile.Close()
    data, err = ioutil.ReadAll(publicFile)
    if err != nil {
        panic(err)
        return nil, err
    }
    block, rest = pem.Decode(data)
    if block == nil {
        panic(err)
        return nil, err
    }
    publicKey, err = x509.ParsePKCS1PublicKey(block.Bytes)
    if err != nil {
        return nil, err
    }
    return rsa.EncryptPKCS1v15(rand.Reader, publicKey, src)
}

/**
 * 私钥解密函数
 */
func RsaDecrypt(src []byte, filename string) ([]byte, error) {
    privateFile, err = os.Open(filename)
    if err != nil {
        return nil, err
    }
    defer privateFile.Close()
    data, err = ioutil.ReadAll(privateFile)
    if err != nil {
        return nil, err
    }
    block, rest = pem.Decode(data)
    if block == nil {
        return nil, err
    }
    privateKey, err = x509.ParsePKCS1PrivateKey(block.Bytes)
    if err != nil {
        return nil, err
    }
    return rsa.DecryptPKCS1v15(rand.Reader, privateKey, src)
}
对称加密算法(DES)
简介:加密和解密都使用的是同一个长度为64的密钥,实际上只用到了其中的56位,密钥中的第8、16...64位用来作奇偶校验。DES算法的安全性很高,目前除了穷举搜索破解外, 尚无更好的的办法来破解。其密钥长度越长,破解难度就越大。
func ZeroPadding(ciphertext []byte, blockSize int) []byte {
    padding = blockSize - len(ciphertext)%blockSize
    padtext = bytes.Repeat([]byte{0}, padding)
    return append(ciphertext, padtext...)
}

func ZeroUnPadding(origData []byte) []byte {
    return bytes.TrimFunc(origData, func(r rune) bool {
        return r == rune(0)
    })
}

func DesEncrypt(text string, key []byte) (string, error) {
    data = []byte(text)
    blockDes, err = des.NewCipher(key)
    if err != nil {
        return "", err
    }
    bs = blockDes.BlockSize()
    data = ZeroPadding(data, bs)
    if len(data)%bs != 0 {
        return "", errors.New("Need a multiple of the blocksize")
    }
    out := make([]byte, len(data))
    dst := out
    for len(data) > 0 {
        blockDes.Encrypt(dst, data[:bs])
        data = data[bs:]
        dst = dst[bs:]
    }
    return hex.EncodeToString(out), nil
}

func DesDecrypt(decrypted string, key []byte) (string, error) {
    data, err = hex.DecodeString(decrypted)
    if err != nil {
        return "", nil
    }
    blockDes, err = des.NewCipher(key)
    if err != nil {
        return "", err
    }
    out := make([]byte, len(data))
    dst := out
    bs = blockDes.BlockSize()
    if len(data)%bs != 0 {
        return "", errors.New("crypto/cipher: input not full blocks")
    }
    for len(data) > 0 {
        blockDes.Decrypt(dst, data[:bs])
        data = data[bs:]
        dst = dst[bs:]
    }
    out = ZeroUnPadding(out)
    return string(out), nil
}