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