为了账号安全,请及时绑定邮箱和手机立即绑定

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

标签:
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)]}

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消