各种加密算法在Go语言中的使用

释放双眼,带上耳机,听听看~!

使用SHA256、MD5、RIPEMD160

import (    "fmt"    "crypto/sha256"    "os"    "io"    "crypto/md5"    "golang.org/x/crypto/ripemd160")func main()  {    str := "hello world"    sum := sha256.Sum256([]byte(str))    fmt.Printf("SHA256:%x/n", sum)    fileSha156()    result := md5.Sum([]byte(str))    fmt.Printf("MD5:%x/n", result)    hasher := ripemd160.New()    // 将加密内容的字节数组拷贝到ripemd160    hasher.Write([]byte(str))    fmt.Printf("RIPEMD160:%x", hasher.Sum(nil))}/** * 使用SHA256加密文件内容 */func fileSha156() {    file, err := os.OpenFile("e:/test.txt", os.O_RDONLY, 0777)    if err != nil {        panic(err)    }    defer file.Close()    h := sha256.New()    // 将文件内容拷贝到sha256中    io.Copy(h, file)    fmt.Printf("%x/n", h.Sum(nil))}

使用DES

import (    "bytes"    "crypto/cipher" //cipher密码    "crypto/des"    "encoding/base64" //将对象转换成字符串    "fmt")/** * DES加密方法 */func MyDesEncrypt(orig, key string) string{    // 将加密内容和秘钥转成字节数组    origData := []byte(orig)    k := []byte(key)    // 秘钥分组    block, _ := des.NewCipher(k)    //将明文按秘钥的长度做补全操作    origData = PKCS5Padding(origData, block.BlockSize())    //设置加密方式-CBC    blockMode := cipher.NewCBCDecrypter(block, k)    //创建明文长度的字节数组    crypted := make([]byte, len(origData))    //加密明文    blockMode.CryptBlocks(crypted, origData)    //将字节数组转换成字符串,base64编码    return base64.StdEncoding.EncodeToString(crypted)}/** * DES解密方法 */func MyDESDecrypt(data string, key string) string {    k := []byte(key)    //将加密字符串用base64转换成字节数组    crypted, _ := base64.StdEncoding.DecodeString(data)    //将字节秘钥转换成block快    block, _ := des.NewCipher(k)    //设置解密方式-CBC    blockMode := cipher.NewCBCEncrypter(block, k)    //创建密文大小的数组变量    origData := make([]byte, len(crypted))    //解密密文到数组origData中    blockMode.CryptBlocks(origData, crypted)    //去掉加密时补全的部分    origData = PKCS5UnPadding(origData)    return string(origData)}/** * 实现明文的补全 * 如果ciphertext的长度为blockSize的整数倍,则不需要补全 * 否则差几个则被几个,例:差5个则补5个5 */func PKCS5Padding(ciphertext []byte, blockSize int) []byte {    padding := blockSize - len(ciphertext)%blockSize    padtext := bytes.Repeat([]byte{byte(padding)}, padding)    return append(ciphertext, padtext...)}/** * 实现去补码,PKCS5Padding的反函数 */func PKCS5UnPadding(origData []byte) []byte {    length := len(origData)    // 去掉最后一个字节 unpadding 次    unpadding := int(origData[length-1])    return origData[:(length - unpadding)]}func main() {    orig := "Hello World!"    fmt.Println("原文:", orig)    //声明秘钥,利用此秘钥实现明文的加密和密文的解密,长度必须为8    key := "12345678"    //加密    encyptCode := MyDesEncrypt(orig, key)    fmt.Println("密文:", encyptCode)    //解密    decyptCode := MyDESDecrypt(encyptCode, key)    fmt.Println("解密结果:", decyptCode)}

使用3DES

import (    "bytes"    "crypto/cipher"    "crypto/des"    "encoding/base64"    "fmt")func main() {    orig := "hello world"    // 3DES的秘钥长度必须为24位    key := "123456781234567812345678"    fmt.Println("原文:", orig)    encryptCode := TripleDesEncrypt(orig, key)    fmt.Println("密文:", encryptCode)    decryptCode := TipleDesDecrypt(encryptCode, key)    fmt.Println("解密结果:", decryptCode)}/** * 加密 */func TripleDesEncrypt(orig, key string) string {    // 转成字节数组    origData := []byte(orig)    k := []byte(key)    // 3DES的秘钥长度必须为24位    block, _ := des.NewTripleDESCipher(k)    // 补全码    origData = PKCS5Padding(origData, block.BlockSize())    // 设置加密方式    blockMode := cipher.NewCBCEncrypter(block, k[:8])    // 创建密文数组    crypted := make([]byte, len(origData))    // 加密    blockMode.CryptBlocks(crypted, origData)    return base64.StdEncoding.EncodeToString(crypted)}/** * 解密 */func TipleDesDecrypt(crypted string, key string) string {    // 用base64转成字节数组    cryptedByte, _ := base64.StdEncoding.DecodeString(crypted)    // key转成字节数组    k := []byte(key)    block, _ := des.NewTripleDESCipher(k)    blockMode := cipher.NewCBCDecrypter(block, k[:8])    origData := make([]byte, len(cryptedByte))    blockMode.CryptBlocks(origData, cryptedByte)    origData = PKCS5UnPadding(origData)    return string(origData)}func PKCS5Padding(orig []byte, size int) []byte {    length := len(orig)    padding := size - length%size    paddintText := bytes.Repeat([]byte{byte(padding)}, padding)    return append(orig, paddintText...)}func PKCS5UnPadding(origData []byte) []byte {    length := len(origData)    // 去掉最后一个字节 unpadding 次    unpadding := int(origData[length-1])    return origData[:(length - unpadding)]}

使用AES

import (    "bytes"    "crypto/aes"    "fmt"    "crypto/cipher"    "encoding/base64")func main() {    orig := "hello world"    key := "123456781234567812345678"    fmt.Println("原文:", orig)    encryptCode := AesEncrypt(orig, key)    fmt.Println("密文:" , encryptCode)    decryptCode := AesDecrypt(encryptCode, key)    fmt.Println("解密结果:", decryptCode)}func AesEncrypt(orig string, key string) string {    // 转成字节数组    origData := []byte(orig)    k := []byte(key)    // 分组秘钥    block, _ := aes.NewCipher(k)    // 获取秘钥块的长度    blockSize := block.BlockSize()    // 补全码    origData = PKCS7Padding(origData, blockSize)    // 加密模式    blockMode := cipher.NewCBCEncrypter(block, k[:blockSize])    // 创建数组    cryted := make([]byte, len(origData))    // 加密    blockMode.CryptBlocks(cryted, origData)    return base64.StdEncoding.EncodeToString(cryted)}func AesDecrypt(cryted string, key string) string {    // 转成字节数组    crytedByte, _ := base64.StdEncoding.DecodeString(cryted)    k := []byte(key)    // 分组秘钥    block, _ := aes.NewCipher(k)    // 获取秘钥块的长度    blockSize := block.BlockSize()    // 加密模式    blockMode := cipher.NewCBCDecrypter(block, k[:blockSize])    // 创建数组    orig := make([]byte, len(crytedByte))    // 解密    blockMode.CryptBlocks(orig, crytedByte)    // 去补全码    orig = PKCS7UnPadding(orig)    return string(orig)}//补码func PKCS7Padding(ciphertext []byte, blocksize int) []byte {    padding := blocksize - len(ciphertext)%blocksize    padtext := bytes.Repeat([]byte{byte(padding)}, padding)    return append(ciphertext, padtext...)}//去码func PKCS7UnPadding(origData []byte) []byte {    length := len(origData)    unpadding := int(origData[length-1])    return origData[:(length - unpadding)]}

【转自慕课】https://www.imooc.com

Go

OpenGL 与 Go 教程(三)实现游戏

2022-3-3 12:38:34

Go

go技巧分享(三)

2022-3-3 12:40:59

搜索