溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

各種加密算法在Go語言中的使用

發(fā)布時(shí)間:2020-07-01 17:15:23 來源:網(wǎng)絡(luò) 閱讀:17026 作者:thao888 欄目:編程語言

使用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()
    // 將加密內(nèi)容的字節(jié)數(shù)組拷貝到ripemd160
    hasher.Write([]byte(str))
    fmt.Printf("RIPEMD160:%x", hasher.Sum(nil))
}

/**
 * 使用SHA256加密文件內(nèi)容
 */
func fileSha156() {
    file, err := os.OpenFile("e:/test.txt", os.O_RDONLY, 0777)
    if err != nil {
        panic(err)
    }
    defer file.Close()

    h := sha256.New()
    // 將文件內(nèi)容拷貝到sha256中
    io.Copy(h, file)
    fmt.Printf("%x\n", h.Sum(nil))
}

使用DES

import (
    "bytes"
    "crypto/cipher" //cipher密碼
    "crypto/des"
    "encoding/base64" //將對(duì)象轉(zhuǎn)換成字符串
    "fmt"
)

/**
 * DES加密方法
 */
func MyDesEncrypt(orig, key string) string{

    // 將加密內(nèi)容和秘鑰轉(zhuǎn)成字節(jié)數(shù)組
    origData := []byte(orig)
    k := []byte(key)

    // 秘鑰分組
    block, _ := des.NewCipher(k)

    //將明文按秘鑰的長(zhǎng)度做補(bǔ)全操作
    origData = PKCS5Padding(origData, block.BlockSize())

    //設(shè)置加密方式-CBC
    blockMode := cipher.NewCBCDecrypter(block, k)

    //創(chuàng)建明文長(zhǎng)度的字節(jié)數(shù)組
    crypted := make([]byte, len(origData))

    //加密明文
    blockMode.CryptBlocks(crypted, origData)

    //將字節(jié)數(shù)組轉(zhuǎn)換成字符串,base64編碼
    return base64.StdEncoding.EncodeToString(crypted)

}

/**
 * DES解密方法
 */
func MyDESDecrypt(data string, key string) string {

    k := []byte(key)

    //將加密字符串用base64轉(zhuǎn)換成字節(jié)數(shù)組
    crypted, _ := base64.StdEncoding.DecodeString(data)

    //將字節(jié)秘鑰轉(zhuǎn)換成block快
    block, _ := des.NewCipher(k)

    //設(shè)置解密方式-CBC
    blockMode := cipher.NewCBCEncrypter(block, k)

    //創(chuàng)建密文大小的數(shù)組變量
    origData := make([]byte, len(crypted))

    //解密密文到數(shù)組origData中
    blockMode.CryptBlocks(origData, crypted)

    //去掉加密時(shí)補(bǔ)全的部分
    origData = PKCS5UnPadding(origData)

    return string(origData)
}

/**
 * 實(shí)現(xiàn)明文的補(bǔ)全
 * 如果ciphertext的長(zhǎng)度為blockSize的整數(shù)倍,則不需要補(bǔ)全
 * 否則差幾個(gè)則被幾個(gè),例:差5個(gè)則補(bǔ)5個(gè)5
 */
func PKCS5Padding(ciphertext []byte, blockSize int) []byte {
    padding := blockSize - len(ciphertext)%blockSize
    padtext := bytes.Repeat([]byte{byte(padding)}, padding)
    return append(ciphertext, padtext...)
}

/**
 * 實(shí)現(xiàn)去補(bǔ)碼,PKCS5Padding的反函數(shù)
 */
func PKCS5UnPadding(origData []byte) []byte {
    length := len(origData)
    // 去掉最后一個(gè)字節(jié) unpadding 次
    unpadding := int(origData[length-1])
    return origData[:(length - unpadding)]
}

func main() {

    orig := "Hello World!"
    fmt.Println("原文:", orig)

    //聲明秘鑰,利用此秘鑰實(shí)現(xiàn)明文的加密和密文的解密,長(zhǎng)度必須為8
    key := "12345678"

    //加密
    encyptCode := MyDesEncrypt(orig, key)
    fmt.Println("密文:", encyptCode)

    //解密
    decyptCode := MyDESDecrypt(encyptCode, key)
    fmt.Println("解密結(jié)果:", decyptCode)
}

使用3DES

import (
    "bytes"
    "crypto/cipher"
    "crypto/des"
    "encoding/base64"
    "fmt"
)

func main() {
    orig := "hello world"
    // 3DES的秘鑰長(zhǎng)度必須為24位
    key := "123456781234567812345678"
    fmt.Println("原文:", orig)

    encryptCode := TripleDesEncrypt(orig, key)
    fmt.Println("密文:", encryptCode)

    decryptCode := TipleDesDecrypt(encryptCode, key)
    fmt.Println("解密結(jié)果:", decryptCode)

}

/**
 * 加密
 */
func TripleDesEncrypt(orig, key string) string {
    // 轉(zhuǎn)成字節(jié)數(shù)組
    origData := []byte(orig)
    k := []byte(key)

    // 3DES的秘鑰長(zhǎng)度必須為24位
    block, _ := des.NewTripleDESCipher(k)
    // 補(bǔ)全碼
    origData = PKCS5Padding(origData, block.BlockSize())
    // 設(shè)置加密方式
    blockMode := cipher.NewCBCEncrypter(block, k[:8])
    // 創(chuàng)建密文數(shù)組
    crypted := make([]byte, len(origData))
    // 加密
    blockMode.CryptBlocks(crypted, origData)

    return base64.StdEncoding.EncodeToString(crypted)
}

/**
 * 解密
 */
func TipleDesDecrypt(crypted string, key string) string {
    // 用base64轉(zhuǎn)成字節(jié)數(shù)組
    cryptedByte, _ := base64.StdEncoding.DecodeString(crypted)
    // key轉(zhuǎn)成字節(jié)數(shù)組
    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)
    // 去掉最后一個(gè)字節(jié) 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("解密結(jié)果:", decryptCode)
}

func AesEncrypt(orig string, key string) string {
    // 轉(zhuǎn)成字節(jié)數(shù)組
    origData := []byte(orig)
    k := []byte(key)

    // 分組秘鑰
    block, _ := aes.NewCipher(k)
    // 獲取秘鑰塊的長(zhǎng)度
    blockSize := block.BlockSize()
    // 補(bǔ)全碼
    origData = PKCS7Padding(origData, blockSize)
    // 加密模式
    blockMode := cipher.NewCBCEncrypter(block, k[:blockSize])
    // 創(chuàng)建數(shù)組
    cryted := make([]byte, len(origData))
    // 加密
    blockMode.CryptBlocks(cryted, origData)

    return base64.StdEncoding.EncodeToString(cryted)

}

func AesDecrypt(cryted string, key string) string {
    // 轉(zhuǎn)成字節(jié)數(shù)組
    crytedByte, _ := base64.StdEncoding.DecodeString(cryted)
    k := []byte(key)

    // 分組秘鑰
    block, _ := aes.NewCipher(k)
    // 獲取秘鑰塊的長(zhǎng)度
    blockSize := block.BlockSize()
    // 加密模式
    blockMode := cipher.NewCBCDecrypter(block, k[:blockSize])
    // 創(chuàng)建數(shù)組
    orig := make([]byte, len(crytedByte))
    // 解密
    blockMode.CryptBlocks(orig, crytedByte)
    // 去補(bǔ)全碼
    orig = PKCS7UnPadding(orig)
    return string(orig)
}

//補(bǔ)碼
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)]
}
向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI