各種加密算法在Go語言中的使用
阿新 • • 發佈:2018-05-17
各種加密算法在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語言中的使用