各種密碼編譯演算法在Go語言中的使用

來源:互聯網
上載者:User

標籤:各種密碼編譯演算法在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語言中的使用

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.