使用SHA25六、MD五、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)]
}