美文网首页
(转载)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