千锋教育-做有情怀、有良心、有品质的职业教育机构

手机站
千锋教育

千锋学习站 | 随时随地免费学

千锋教育

扫一扫进入千锋手机站

领取全套视频
千锋教育

关注千锋学习站小程序
随时随地免费学习课程

当前位置:首页  >  技术干货  > Go语言常用加密算法和加密技术全面解析!

Go语言常用加密算法和加密技术全面解析!

来源:千锋教育
发布人:xqq
时间: 2023-12-27 06:59:54 1703631594

Go语言常用加密算法和加密技术全面解析!

在现代计算机领域,安全性非常重要,而加密技术是保证计算机信息系统安全性的重要措施之一。为了满足这个需求,Go语言提供了丰富的加密算法和加密技术,本文将为大家详细解析Go语言中常用的加密算法和加密技术。

一、对称加密算法

对称加密算法是加密和解密使用相同的密钥的一种加密方式。常用的对称加密算法有DES、3DES、AES等。Go语言中的crypto包中提供了多种对称加密算法。

以下是一个示例,使用AES加密算法加密字符串,然后再进行解密:

`go

package main

import (

"crypto/aes"

"crypto/cipher"

"fmt"

)

func AesEncrypt(plainText, key byte) (byte, error) {

block, err := aes.NewCipher(key)

if err != nil {

return nil, err

}

iv := byte("1234567890123456")

plainText = pkcs5Padding(plainText, block.BlockSize())

blockMode := cipher.NewCBCEncrypter(block, iv)

cipherText := make(byte, len(plainText))

blockMode.CryptBlocks(cipherText, plainText)

return cipherText, nil

}

func AesDecrypt(cipherText, key byte) (byte, error) {

block, err := aes.NewCipher(key)

if err != nil {

return nil, err

}

iv := byte("1234567890123456")

blockMode := cipher.NewCBCDecrypter(block, iv)

plainText := make(byte, len(cipherText))

blockMode.CryptBlocks(plainText, cipherText)

plainText = pkcs5UnPadding(plainText)

return plainText, nil

}

func pkcs5Padding(cipherText byte, blockSize int) byte {

padding := blockSize - len(cipherText)%blockSize

padText := bytes.Repeat(byte{byte(padding)}, padding)

return append(cipherText, padText...)

}

func pkcs5UnPadding(plainText byte) byte {

length := len(plainText)

unPadding := int(plainText)

return plainText

}

func main() {

plainText := byte("Hello World")

key := byte("12345678901234567890123456789012")

cipherText, err := AesEncrypt(plainText, key)

if err != nil {

fmt.Println(err)

return

}

fmt.Printf("Cipher Text: %x\n", cipherText)

plainTextResult, err := AesDecrypt(cipherText, key)

if err != nil {

fmt.Println(err)

return

}

fmt.Printf("Plain Text: %s\n", plainTextResult)

}

二、非对称加密算法非对称加密算法也称为公钥加密算法,加密和解密使用不同的密钥。常用的非对称加密算法有RSA、ECC等。Go语言中的crypto包中也提供了多种非对称加密算法。以下是一个示例,使用RSA加密算法加密字符串,然后再进行解密:`gopackage mainimport (    "crypto/rand"    "crypto/rsa"    "crypto/x509"    "encoding/pem"    "fmt")func RsaEncrypt(plainText byte, publicKey byte) (byte, error) {    block, _ := pem.Decode(publicKey)    if block == nil {        return nil, fmt.Errorf("public key pem decode failed")    }    pubInterface, err := x509.ParsePKIXPublicKey(block.Bytes)    if err != nil {        return nil, err    }    pub := pubInterface.(*rsa.PublicKey)    cipherText, err := rsa.EncryptPKCS1v15(rand.Reader, pub, plainText)    if err != nil {        return nil, err    }    return cipherText, nil}func RsaDecrypt(cipherText byte, privateKey byte) (byte, error) {    block, _ := pem.Decode(privateKey)    if block == nil {        return nil, fmt.Errorf("private key pem decode failed")    }    pri, err := x509.ParsePKCS8PrivateKey(block.Bytes)    if err != nil {        return nil, err    }    priKey := pri.(*rsa.PrivateKey)    plainText, err := rsa.DecryptPKCS1v15(rand.Reader, priKey, cipherText)    if err != nil {        return nil, err    }    return plainText, nil}func main() {    plainText := byte("Hello World")    publicKey, privateKey := GenerateRsaKeyPair(2048)    cipherText, err := RsaEncrypt(plainText, publicKey)    if err != nil {        fmt.Println(err)        return    }    fmt.Printf("Cipher Text: %x\n", cipherText)    plainTextResult, err := RsaDecrypt(cipherText, privateKey)    if err != nil {        fmt.Println(err)        return    }    fmt.Printf("Plain Text: %s\n", plainTextResult)}func GenerateRsaKeyPair(bitsize int) (byte, byte) {    priKey, err := rsa.GenerateKey(rand.Reader, bitsize)    if err != nil {        return nil, nil    }    priDER := x509.MarshalPKCS1PrivateKey(priKey)    priPEM := pem.EncodeToMemory(&pem.Block{        Type:  "RSA PRIVATE KEY",        Bytes: priDER,    })    publicKey := priKey.PublicKey    pubDER, err := x509.MarshalPKIXPublicKey(&publicKey)    if err != nil {        return nil, nil    }    pubPEM := pem.EncodeToMemory(&pem.Block{        Type:  "PUBLIC KEY",        Bytes: pubDER,    })    return pubPEM, priPEM}

三、哈希算法

哈希算法将任意长度的消息压缩到固定长度的摘要中。常用的哈希算法有SHA-1、SHA-256、MD5等。Go语言中的crypto包中也提供了多种哈希算法。

以下是一个示例,使用SHA-256算法计算字符串的哈希值:

`go

package main

import (

"crypto/sha256"

"fmt"

)

func ComputeSha256Hash(data byte) byte {

h := sha256.New()

h.Write(data)

return h.Sum(nil)

}

func main() {

data := byte("Hello World")

hash := ComputeSha256Hash(data)

fmt.Printf("SHA-256 Hash: %x\n", hash)

}

四、数字签名数字签名是一种基于公钥密码学的技术,用来保证消息的完整性、真实性和不可否认性。常用的数字签名算法有RSA、ECC等。Go语言中的crypto包中也提供了多种数字签名算法。以下是一个示例,使用RSA算法对数据进行数字签名,然后再进行验证:`gopackage mainimport (    "crypto/rand"    "crypto/rsa"    "crypto/sha256"    "crypto/x509"    "encoding/pem"    "fmt")func RsaSign(data byte, privateKey byte) (byte, error) {    block, _ := pem.Decode(privateKey)    if block == nil {        return nil, fmt.Errorf("private key pem decode failed")    }    pri, err := x509.ParsePKCS8PrivateKey(block.Bytes)    if err != nil {        return nil, err    }    priKey := pri.(*rsa.PrivateKey)    h := sha256.New()    h.Write(data)    hash := h.Sum(nil)    signature, err := rsa.SignPKCS1v15(rand.Reader, priKey, crypto.SHA256, hash)    if err != nil {        return nil, err    }    return signature, nil}func RsaVerify(data, signature, publicKey byte) (bool, error) {    block, _ := pem.Decode(publicKey)    if block == nil {        return false, fmt.Errorf("public key pem decode failed")    }    pubInterface, err := x509.ParsePKIXPublicKey(block.Bytes)    if err != nil {        return false, err    }    pub := pubInterface.(*rsa.PublicKey)    h := sha256.New()    h.Write(data)    hash := h.Sum(nil)    err = rsa.VerifyPKCS1v15(pub, crypto.SHA256, hash, signature)    if err != nil {        return false, err    }    return true, nil}func main() {    data := byte("Hello World")    publicKey, privateKey := GenerateRsaKeyPair(2048)    signature, err := RsaSign(data, privateKey)    if err != nil {        fmt.Println(err)        return    }    fmt.Printf("Signature: %x\n", signature)    ok, err := RsaVerify(data, signature, publicKey)    if err != nil {        fmt.Println(err)        return    }    fmt.Printf("Verify Result: %t\n", ok)}

总结:

上述代码示例了Go语言中常用的加密算法和加密技术,包括对称加密算法、非对称加密算法、哈希算法和数字签名。这些技术在实际应用中非常有用,能够帮助开发人员保证系统的安全性。

以上就是IT培训机构千锋教育提供的相关内容,如果您有web前端培训鸿蒙开发培训python培训linux培训,java培训,UI设计培训等需求,欢迎随时联系千锋教育。

tags:
声明:本站稿件版权均属千锋教育所有,未经许可不得擅自转载。
10年以上业内强师集结,手把手带你蜕变精英
请您保持通讯畅通,专属学习老师24小时内将与您1V1沟通
免费领取
今日已有369人领取成功
刘同学 138****2860 刚刚成功领取
王同学 131****2015 刚刚成功领取
张同学 133****4652 刚刚成功领取
李同学 135****8607 刚刚成功领取
杨同学 132****5667 刚刚成功领取
岳同学 134****6652 刚刚成功领取
梁同学 157****2950 刚刚成功领取
刘同学 189****1015 刚刚成功领取
张同学 155****4678 刚刚成功领取
邹同学 139****2907 刚刚成功领取
董同学 138****2867 刚刚成功领取
周同学 136****3602 刚刚成功领取
相关推荐HOT