本文参考《图解密码技术》第三版
密码学家的工具箱,指六种常用加密方式包括 对称密码、非对称密码、单向散列函数、消息认证码、数字签名、伪随机数生成器。堪称六大杀器,现代社会的信息安全皆基于此。本文用go语言代码实现六种工具的具体应用。
对称密码
是指加密解密时用同一个秘钥,下面代码采用AES进行加解密,私钥长度只支持128,192,256位的字节数组。
AES加解密的代码应用:
package main
import (
"bytes"
"crypto/aes"
"crypto/cipher"
"fmt"
)
func PKCS5Padding(ciphertext []byte, blockSize int) []byte {
padding := blockSize - len(ciphertext)%blockSize
padtext := bytes.Repeat([]byte{
byte(padding)}, padding)
return append(ciphertext, padtext...)
}
func PKCS5UnPadding(origData []byte) []byte {
length := len(origData)
unpadding := int(origData[length-1])
return origData[:(length - unpadding)]
}
func AesEncrypt(origData, key []byte) ([]byte, error) {
block, err := aes.NewCipher(key)
if err != nil {
return nil, err
}
blockSize := block.BlockSize()
origData = PKCS5Padding(origData, blockSize)
blockMode := cipher.NewCBCEncrypter(block, key[:blockSize])
crypted := make([]byte, len(origData))
blockMode.CryptBlocks(crypted, origData)
return crypted, nil
}
func AesDecrypt(crypted, key []byte) ([]byte, error) {
block, err := aes.NewCipher(key)
if err != nil {
return nil, err
}
blockSize := block.BlockSize()
blockMode := cipher.NewCBCDecrypter(block, key[:blockSize])
origData := make([]byte, len(crypted))
blockMode.CryptBlocks(origData, crypted)
origData = PKCS5UnPadding(origData)
return origData, nil
}
func main() {
//私钥长度只支持128 192 256位的任意字节数组
var aeskey = []byte("这就是私钥,自己定义呦.")
fmt.Println("私钥:", string(aeskey))
fmt.Printf("私钥长度:%d字节\n", len(aeskey))
pass := []byte("罗小黑战记大电影今天上映了,真好看,快去看啊")
fmt.Println("原文:", string(pass))
xpass, err := AesEncrypt(pass, aeskey)
if err != nil {
fmt.Println(err)
return
}
fmt.Println("==============进行加密==============")
fmt.Printf("加密信息:%x\n", xpass)
fmt.Println("===================================")
tpass, err := AesDecrypt(xpass, aeskey)
if err