iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >有哪些Go加密解密算法
  • 663
分享到

有哪些Go加密解密算法

2023-06-16 04:06:08 663人浏览 泡泡鱼
摘要

这篇文章主要讲解了“有哪些Go加密解密算法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“有哪些Go加密解密算法”吧!md5MD5信息摘要算法是一种被广泛使用的密码散列函数,可以产生出一个12

这篇文章主要讲解了“有哪些Go加密解密算法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“有哪些Go加密解密算法”吧!

md5

MD5信息摘要算法是一种被广泛使用的密码散列函数,可以产生出一个128位(16进制,32个字符)的散列值(hash value),用于确保信息传输完整一致。

func GetMd5String(s string) string {      h := md5.New()     h.Write([]byte(s))      return hex.EncodeToString(h.Sum(nil))  }

hmac

HMac是密钥相关的哈希运算消息认证码(Hash-based Message Authentication Code)的缩写,

它通过一个标准算法,在计算哈希的过程中,把key混入计算过程中。

和我们自定义的加salt算法不同,Hmac算法针对所有哈希算法都通用,无论是MD5还是SHA-1。采用Hmac替代我们自己的salt算法,可以使程序算法更标准化,也更安全

示例

//key随意设置 data 要加密数据  func Hmac(key, data string) string {      hash:= hmac.New(md5.New, []byte(key)) // 创建对应的md5哈希加密算法      hash.Write([]byte(data))      return hex.EncodeToString(hash.Sum([]byte("")))  }  func HmacSha256(key, data string) string {      hash:= hmac.New(sha256.New, []byte(key)) //创建对应的sha256哈希加密算法      hash.Write([]byte(data))      return hex.EncodeToString(hash.Sum([]byte("")))  }

sha1

SHA-1可以生成一个被称为消息摘要的160位(20字节)散列值,散列值通常的呈现形式为40个十六进制数。

func Sha1(data string) string {      sha1 := sha1.New()      sha1.Write([]byte(data))      return hex.EncodeToString(sha1.Sum([]byte("")))  }

AES

密码学中的高级加密标准(Advanced Encryption Standard,AES),又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES(Data Encryption Standard),已经被多方分析且广为全世界所使用。AES中常见的有三种解决方案,分别为AES-128、AES-192和AES-256。如果采用真正的128位加密技术甚至256位加密技术,蛮力攻击要取得成功需要耗费相当长的时间。

AES 有五种加密模式:

  •  电码本模式(Electronic Codebook Book (ECB))、

  •  密码分组链接模式(Cipher Block Chaining (CBC))、

  •  计算器模式(Counter (CTR))、

  •  密码反馈模式(Cipher FeedBack (CFB))

  •  输出反馈模式(Output FeedBack (OFB))

ECB模式

出于安全考虑,golang默认并不支持ECB模式。

package main  import (      "crypto/aes"      "fmt"  )  func AESEncrypt(src []byte, key []byte) (encrypted []byte) {      cipher, _ := aes.NewCipher(generateKey(key))      length := (len(src) + aes.BlockSize) / aes.BlockSize      plain := make([]byte, length*aes.BlockSize)      copy(plain, src)      pad := byte(len(plain) - len(src))      for i := len(src); i < len(plain); i++ {          plain[i] = pad      }      encrypted = make([]byte, len(plain))      // 分组分块加密      for bs, be := 0, cipher.BlockSize(); bs <= len(src); bs, be = bs+cipher.BlockSize(), be+cipher.BlockSize() {          cipher.Encrypt(encrypted[bs:be], plain[bs:be])      }      return encrypted  }  func AESDecrypt(encrypted []byte, key []byte) (decrypted []byte) {      cipher, _ := aes.NewCipher(generateKey(key))      decrypted = make([]byte, len(encrypted))      //      for bs, be := 0, cipher.BlockSize(); bs < len(encrypted); bs, be = bs+cipher.BlockSize(), be+cipher.BlockSize() {          cipher.Decrypt(decrypted[bs:be], encrypted[bs:be])      }      trim := 0      if len(decrypted) > 0 {          trim = len(decrypted) - int(decrypted[len(decrypted)-1])      }      return decrypted[:trim]  }  func generateKey(key []byte) (genKey []byte) {     genKey = make([]byte, 16)      copy(genKey, key)      for i := 16; i < len(key); {          for j := 0; j < 16 && i < len(key); j, i = j+1, i+1 {              genKey[j] ^= key[i]          }      }      return genKey }  func main()  {      source:="hello world"      fmt.Println("原字符:",source)      //16byte密钥      key:="1443flfsaWfdas"      encryptCode:=AESEncrypt([]byte(source),[]byte(key))      fmt.Println("密文:",string(encryptCode))      decryptCode:=AESDecrypt(encryptCode,[]byte(key))      fmt.Println("解密:",string(decryptCode))  }

CBC模式

package main import(      "bytes"      "crypto/aes"      "fmt"      "crypto/cipher"      "encoding/base64"  )  func main() {      orig := "hello world"      key := "0123456789012345"      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)      // 分组秘钥      // NewCipher该函数限制了输入k的长度必须为16, 24或者32      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)  }  //补码  //AES加密数据块分组长度必须为128bit(byte[16]),密钥长度可以是128bit(byte[16])、192bit(byte[24])、256bit(byte[32])中的任意一个。  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)]  }

CRT模式

package main  import (      "bytes"      "crypto/aes"      "crypto/cipher"      "fmt"  )  //加密  func aesCtrCrypt(plainText []byte, key []byte) ([]byte, error) {      //1. 创建cipher.Block接口      block, err := aes.NewCipher(key)      if err != nil {          return nil, err      }      //2. 创建分组模式,在crypto/cipher包中      iv := bytes.Repeat([]byte("1"), block.BlockSize())      stream := cipher.NewCTR(block, iv)      //3. 加密      dst := make([]byte, len(plainText))      stream.XORKeyStream(dst, plainText)      return dst, nil  }  func main() {      source:="hello world"      fmt.Println("原字符:",source)      key:="1443flfsaWfdasds"      encryptCode,_:=aesCtrCrypt([]byte(source),[]byte(key))      fmt.Println("密文:",string(encryptCode))      decryptCode,_:=aesCtrCrypt(encryptCode,[]byte(key))      fmt.Println("解密:",string(decryptCode))  }  CFB模式  package main  import (      "crypto/aes"      "crypto/cipher"      "crypto/rand"      "encoding/hex"      "fmt"      "io"  )  func AesEncryptCFB(origData []byte, key []byte) (encrypted []byte) {      block, err := aes.NewCipher(key)      if err != nil {          //panic(err)      }      encrypted = make([]byte, aes.BlockSize+len(origData))      iv := encrypted[:aes.BlockSize]      if _, err := io.ReadFull(rand.Reader, iv); err != nil {          //panic(err)      }      stream := cipher.NewCFBEncrypter(block, iv)      stream.XORKeyStream(encrypted[aes.BlockSize:], origData)      return encrypted  }  func AesDecryptCFB(encrypted []byte, key []byte) (decrypted []byte) {      block, _ := aes.NewCipher(key)      if len(encrypted) < aes.BlockSize {          panic("ciphertext too short")      }      iv := encrypted[:aes.BlockSize]      encryptedencrypted = encrypted[aes.BlockSize:]      stream := cipher.NewCFBDecrypter(block, iv)      stream.XORKeyStream(encrypted, encrypted)      return encrypted  }  func main() {      source:="hello world"      fmt.Println("原字符:",source)      key:="ABCDEFGHIJKLMNO1"//16位      encryptCode:=AesEncryptCFB([]byte(source),[]byte(key))      fmt.Println("密文:",hex.EncodeToString(encryptCode))      decryptCode:=AesDecryptCFB(encryptCode,[]byte(key))      fmt.Println("解密:",string(decryptCode))  }

OFB模式

package main  import (      "bytes"      "crypto/aes"      "crypto/cipher"      "crypto/rand"      "encoding/hex"      "fmt"      "io"  )  func aesEncryptOFB( data[]byte,key []byte) ([]byte, error) {      data = PKCS7Padding(data, aes.BlockSize)      block, _ := aes.NewCipher([]byte(key))      out := make([]byte, aes.BlockSize + len(data))      iv := out[:aes.BlockSize]      if _, err := io.ReadFull(rand.Reader, iv); err != nil {          return nil, err      }      stream := cipher.NewOFB(block, iv)      stream.XORKeyStream(out[aes.BlockSize:], data)      return out, nil  }  func aesDecryptOFB( data[]byte,key []byte) ([]byte, error) {      block, _ := aes.NewCipher([]byte(key))      iv  := data[:aes.BlockSize]      datadata = data[aes.BlockSize:]      if len(data) % aes.BlockSize != 0 {          return nil, fmt.Errorf("data is not a multiple of the block size")      }      out := make([]byte, len(data))      mode := cipher.NewOFB(block, iv)      mode.XORKeyStream(out, data)      out= PKCS7UnPadding(out)      return out, nil  }  //补码  //AES加密数据块分组长度必须为128bit(byte[16]),密钥长度可以是128bit(byte[16])、192bit(byte[24])、256bit(byte[32])中的任意一个。  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)]  }  func main() {      source:="hello world"      fmt.Println("原字符:",source)      key:="1111111111111111"//16位  32位均可      encryptCode,_:=aesEncryptOFB([]byte(source),[]byte(key))      fmt.Println("密文:",hex.EncodeToString(encryptCode))      decryptCode,_:=aesDecryptOFB(encryptCode,[]byte(key))      fmt.Println("解密:",string(decryptCode))  }

RSA加密

首先使用openssl生成公私钥

package main import (      "crypto/rand"      "crypto/rsa"      "crypto/x509"      "encoding/base64"      "encoding/pem"      "errors"      "fmt"  ) // 私钥生成  //openssl genrsa -out rsa_private_key.pem 1024  var privateKey = []byte(`  -----BEGIN RSA PRIVATE KEY-----  MIICWwIBAAKBgQDcGsUIIAINHfRTdMmgGwLrjzfMNSrtgIf4EGsNaYwmC1GjF/bM  h0Mcm10oLhNrKNYCTTQVGGIxuc5heKd1gOzb7bdTnCDPPZ7oV7p1B9Pud+6zPaco  qDz2M24vHFWYY2FbIIJh8fHhKcfXNXOLovdVBE7Zy682X1+R1lRK8D+vMQIDAQAB  AoGAeWAZvz1HZExca5k/hpbeqV+0+VtobMgwMs96+U53BpO/VRzl8Cu3CpNyb7HY  64L9YQ+J5QgpPhqkgIO0dMu/0RIXsmhvr2GCxmKObcQt3JQ6S4rjHTln49I2sYTz  7JEH4tcplKjsjHyq5MhHfA+CV2/AB2BO6G8limu7SheXuvECQQDwOpZrZDeTOOBk  z1vercawd+J9ll/FZYttnrWYTI1sSF1sNfZ7dUXPyYPQFZ0LQ1bhZGmWBZ6a6wd9  R+PKlmJvAkEA6o32c/WEXxW2zeh28sOO4wqUiBYq3L3hFObhcsUAY8jfykQefW8q  yPuuL02jLIajFWd0itjvIrzWnVmoUuXydwJAXGLrvllIVkIlah+lATprkypH3Gyc  YFnxCTNkOzIVoXMjGp6WMFylgIfLPZdSUiaPnxby1FNM7987fh7Lp/m12QJAK9iL 2JNtwkSR3p305oOuAz0oFORn8MnB+KFMRaMT9pNHWk0vke0lB1sc7ZTKyvkEJW0o  eQgic9DvIYzwDUcU8wJAIkKROzuzLi9AvLnLUrSdI6998lmeYO9x7pwZPukz3era  zncjRK3pbVkv0KrKfczuJiRlZ7dUzVO0b6QJr8TRAA==  -----END RSA PRIVATE KEY-----  `)  // 公钥: 根据私钥生成  //openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem var publicKey = []byte(`  -----BEGIN PUBLIC KEY-----  MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDcGsUIIAINHfRTdMmgGwLrjzfM  NSrtgIf4EGsNaYwmC1GjF/bMh0Mcm10oLhNrKNYCTTQVGGIxuc5heKd1gOzb7bdT  nCDPPZ7oV7p1B9Pud+6zPacoqDz2M24vHFWYY2FbIIJh8fHhKcfXNXOLovdVBE7Z  y682X1+R1lRK8D+vmQIDAQAB  -----END PUBLIC KEY-----  `)  // 加密  func RsaEncrypt(origData []byte) ([]byte, error) {      //解密pem格式的公钥      block, _ := pem.Decode(publicKey)      if block == nil {          return nil, errors.New("public key error")      }      // 解析公钥      pubInterface, err := x509.ParsePKIXPublicKey(block.Bytes)      if err != nil {          return nil, err      }      // 类型断言      pub := pubInterface.(*rsa.PublicKey)      //加密      return rsa.EncryptPKCS1v15(rand.Reader, pub, origData)  }  // 解密  func RsaDecrypt(ciphertext []byte) ([]byte, error) {      //解密      block, _ := pem.Decode(privateKey)      if block == nil {          return nil, errors.New("private key error!")      }      //解析PKCS1格式的私钥      priv, err := x509.ParsePKCS1PrivateKey(block.Bytes)      if err != nil {          return nil, err      }      // 解密      return rsa.DecryptPKCS1v15(rand.Reader, priv, ciphertext)  }  func main() {      data, _ := RsaEncrypt([]byte("hello world"))      fmt.Println(base64.StdEncoding.EncodeToString(data))      origData, _ := RsaDecrypt(data)      fmt.Println(string(origData))  }

感谢各位的阅读,以上就是“有哪些Go加密解密算法”的内容了,经过本文的学习后,相信大家对有哪些Go加密解密算法这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

--结束END--

本文标题: 有哪些Go加密解密算法

本文链接: https://www.lsjlt.com/news/282309.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 有哪些Go加密解密算法
    这篇文章主要讲解了“有哪些Go加密解密算法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“有哪些Go加密解密算法”吧!md5MD5信息摘要算法是一种被广泛使用的密码散列函数,可以产生出一个12...
    99+
    2023-06-16
  • java加密算法有哪些
    java中常用的加密算法有:1.BASE64算法,二进制数据;2.MD5算法,散列函数;3.SHA算法,消息摘要算法;4.RSA算法,用于加密和数字签名的算法;5.DES算法,对称密码体制加密算法;6.PBE算法,基于口令的加密算法;7.D...
    99+
    2024-04-02
  • Go加密解密算法小结
    目录前言md5hmacsha1AESECB模式CBC模式CRT模式CFB模式 OFB模式RSA加密参考:前言 加密解密在实际开发中应用比较广泛,常用加解密分为:&ldquo...
    99+
    2024-04-02
  • Python中常见的加密解密算法有哪些
    1.url encode加密简介:当url地址含有中文,或者参数有中文的时候,这个算是很正常了,但是把这样的url作为参数传递的时候(最常见的callback),需要把一些中文甚至'/'做一下编码转换。# -*- codin...
    99+
    2023-05-16
    Python
  • Python中有哪些加密算法
    这期内容当中小编将会给大家带来有关Python中有哪些加密算法,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。MD5加密全称:MD5消息摘要算法(英语:MD5 Message-Digest  Al...
    99+
    2023-06-16
  • java可逆加密算法有哪些
    java中的可逆加密算法有:1.DES算法,适用于计算机系统的商用密码;2.RSA算法,使用不同的加密与解密密钥;3.AES算法,基于排列和置换运算实现;4.IDEA算法,数据块加密算法;java中的可逆加密算法有以下几种DES算法DES算...
    99+
    2024-04-02
  • asp加密解密的方法有哪些
    ASP加密解密的方法有以下几种:1. 对称加密:使用相同的密钥对数据进行加密和解密,常见的对称加密算法有DES、3DES、AES等。...
    99+
    2023-06-03
    asp加密 asp
  • java中的加密算法有哪些
    java中的加密算法有哪些?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。java中的加密算法有哪些import java.security.MessageDigest...
    99+
    2023-05-31
    java 加密算法 ava
  • php加密解密的方法有哪些
    PHP加密解密的方法有哪些,需要具体代码示例 随着网络技术的不断发展,数据的安全性愈发受到关注。在Web开发过程中,处理和保护用户的敏感信息是必不可少的一环。 PHP作为一种广泛应用于...
    99+
    2024-02-23
    加密算法 php加密解密 解密算法
  • .NET中常见的加解密算法有哪些
    这篇文章主要讲解了“.NET中常见的加解密算法有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“.NET中常见的加解密算法有哪些”吧!一、MD5不可逆加密不可逆加密是指将原文加密成密文以后...
    99+
    2023-06-29
  • 网络数据加密算法有哪些
    常见的网络数据加密算法有以下几种AES加密算法AES算法是基于排列和置换运算实现的,排列是对数据重新进行安排,置换是将一个数据单元替换为另一个,AES是一个迭代的、对称密钥分组的密码,是使用相同的密钥进行加密和解密数据的。RSA加密算法RS...
    99+
    2024-04-02
  • Golang中常见加密算法有哪些
    本文小编为大家详细介绍“Golang中常见加密算法有哪些”,内容详细,步骤清晰,细节处理妥当,希望这篇“Golang中常见加密算法有哪些”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。1.md5 加密&md...
    99+
    2023-07-05
  • Python 加密解密算法
    呃,今天来看看加密和解密,本文讨论base64和hashlib库:      来看看HASHLIB,他是一种单向摘要出定长字符串的方法:    撸代码:    In [18]: import time,hashlib In [19]: t...
    99+
    2023-01-31
    算法 加密解密 Python
  • Go实现MD5加密的方法有哪些
    这篇文章主要介绍“Go实现MD5加密的方法有哪些”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Go实现MD5加密的方法有哪些”文章能帮助大家解决问题。第一种方法:md5.New() 和 Writep...
    99+
    2023-07-05
  • ssl支持哪些加密算法
    ssl支持的加密算法有:DES:数据加密标准,速度较快,适用于加密大量数据的场合。RSA:它是一个支持变长密钥的公共密钥算法,需要加密的文件块的长度也是可变的。SHA:安全散列算法,它是非可逆加密的,一般用于数据校验传输过程中是否被修改过。...
    99+
    2024-04-02
  • PHP中常用的加密算法有哪些?
    随着互联网的发展,数据安全已成为我们日常工作中必须关注的严肃问题。针对敏感的个人信息或商业数据,加密变得尤为重要。在PHP开发中,一些加密算法被广泛应用,下面我们就来了解一下PHP中常用的加密算法。一、Base64编码Base64编码常用于...
    99+
    2023-05-14
    PHP 加密算法 常用
  • OpenSSL中的加密算法指令有哪些
    OpenSSL中的加密算法指令有哪些?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。OpenSSL是一个开源的用以实现SSL协议的产品,它主要包括了三个部分:密码算法库、应用程序...
    99+
    2023-06-12
  • rsa对称加密算法有哪些优点
    RSA非对称加密算法有以下优点:1. 安全性高:RSA算法基于一个数论难题,即大整数分解,目前尚未发现有效的算法来解决这个难题。因此...
    99+
    2023-10-20
    rsa
  • web中常用的加密算法有哪些
    今天小编给大家分享一下web中常用的加密算法有哪些的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。 加密算法我们整体...
    99+
    2023-06-17
  • Linux下常见的加密算法有哪些
    这篇文章将为大家详细讲解有关Linux下常见的加密算法有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Linux系统中常见的加密算法有:对称加密;非对称加密;单向加密;SSL/TLS;秘钥交换等。1、...
    99+
    2023-06-27
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作