美文网首页
(转载)AES和DES加密

(转载)AES和DES加密

作者: 小歪子go | 来源:发表于2018-02-09 20:24 被阅读0次

由于第一家公司的原因,所以在无论前端和后台开发过程中我对数据安全看的特别看重,

import (
    "bytes"
    "crypto/aes"
    "crypto/cipher"
    "crypto/des"
    "encoding/base64"
    "fmt"
)

func main() {
    testAes()
    testDes()
}

func testDes() {
    origData := []byte("Introduction of Hubei Polytechnic University")
    key := []byte("@23&5670")
    encrypt, err := DesEncrypt(origData, key)
    if err != nil {
        fmt.Println(err)
    }
    str := string(encrypt)
    fmt.Println(str)
    decrypt, err := DesDecrypt(encrypt, key)
    fmt.Println("decrypt:", string(decrypt))
}

func testAes() {
    // AES-128。key长度:16, 24, 32 bytes 对应 AES-128, AES-192, AES-256
    key := []byte("s@e023f_9fd&fwfl")
    result, err := AesEncrypt([]byte("polaris@studygolang"), key)
    if err != nil {
        panic(err)
    }
    resultStr := base64.StdEncoding.EncodeToString(result)
    fmt.Println(resultStr)
    data, err := base64.StdEncoding.DecodeString(resultStr)
    origData, err := AesDecrypt(data, key)
    if err != nil {
        panic(err)
    }
    fmt.Println(string(origData))
}

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)
    // origData = ZeroPadding(origData, block.BlockSize())
    blockMode := cipher.NewCBCEncrypter(block, key[:blockSize])
    crypted := make([]byte, len(origData))
    // 根据CryptBlocks方法的说明,如下方式初始化crypted也可以
    // crypted := 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))
    // origData := crypted
    blockMode.CryptBlocks(origData, crypted)
    origData = PKCS5UnPadding(origData)
    // origData = ZeroUnPadding(origData)
    return origData, nil
}

func DesEncrypt(origData, key []byte) ([]byte, error) {
    block, err := des.NewCipher(key)
    if err != nil {
        return nil, err
    } else {
        origData = PKCS5Padding(origData, block.BlockSize())
    }
    origData = PKCS5Padding(origData, block.BlockSize())
    blockModel := cipher.NewCBCEncrypter(block, key)
    crypted := make([]byte, len(origData))
    blockModel.CryptBlocks(crypted, origData)
    return crypted, nil
}

func DesDecrypt(crypted, key []byte) ([]byte, error) {
    block, err := des.NewCipher(key)
    if err != nil {
        return nil, err
    }
    blockModel := cipher.NewCBCDecrypter(block, key)
    origData := make([]byte, len(crypted))
    blockModel.CryptBlocks(origData, crypted)
    //origData = PKCUnPaddint(origData)
    origData = ZeroUnPadding(origData)
    return origData, nil

}

func ZeroPadding(ciphertext []byte, blockSize int) []byte {
    padding := blockSize - len(ciphertext)%blockSize
    padtext := bytes.Repeat([]byte{0}, padding)
    return append(ciphertext, padtext...)
}

func ZeroUnPadding(origData []byte) []byte {
    length := len(origData)
    unpadding := int(origData[length-1])
    return origData[:(length - unpadding)]
}

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 次
    unpadding := int(origData[length-1])
    return origData[:(length - unpadding)]
}

参考文档
AES和DES

相关文章

网友评论

      本文标题:(转载)AES和DES加密

      本文链接:https://www.haomeiwen.com/subject/zqeqtftx.html