使用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)]}