1. 程式人生 > >各種加密算法在Go語言中的使用

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

各種加密算法在Go語言中的使用 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)]
}

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