zoukankan      html  css  js  c++  java
  • golang 3des/ecb/cbc/pkcs5 加解密

    本人新手,参考文档:

    http://blog.studygolang.com/2013/01/go加密解密之des/

    http://blog.csdn.net/scybs/article/details/38279159

    // DES、3DES加解密示例,用于生产环境请修改代码使之健壮
    package main
    
    import (
    	"bytes"
    	"crypto/cipher"
    	"crypto/des"
    	"encoding/base64"
    	"errors"
    	"fmt"
    )
    
    func main() {
    	test3Des()
    }
    
    func test3Des() {
    	key, err := base64.StdEncoding.DecodeString("b93e24738d364ad38047a97d6a8ad63c")
    	result, err := TripleDesECBEncrypt([]byte("一直都在poiuy123"), key)
    	if err != nil {
    		panic(err)
    	}
    	fmt.Println(base64.StdEncoding.EncodeToString(result))
    	origData, err := TripleDesECBDecrypt(result, key)
    	if err != nil {
    		panic(err)
    	}
    	fmt.Println(string(origData))
    }
    
    // 3DES加密
    func TripleDesCBCEncrypt(origData, key []byte) ([]byte, error) {
    	block, err := des.NewTripleDESCipher(key)
    	if err != nil {
    		return nil, err
    	}
    	origData = PKCS5Padding(origData, block.BlockSize())
    	// origData = ZeroPadding(origData, block.BlockSize())
    	blockMode := cipher.NewCBCEncrypter(block, key[:8])
    	crypted := make([]byte, len(origData))
    	blockMode.CryptBlocks(crypted, origData)
    	return crypted, nil
    }
    
    // 3DES解密
    func TripleDesCBCDecrypt(crypted, key []byte) ([]byte, error) {
    	block, err := des.NewTripleDESCipher(key)
    	if err != nil {
    		return nil, err
    	}
    	blockMode := cipher.NewCBCDecrypter(block, key[:8])
    	origData := make([]byte, len(crypted))
    	// origData := crypted
    	blockMode.CryptBlocks(origData, crypted)
    	origData = PKCS5UnPadding(origData)
    	// origData = ZeroUnPadding(origData)
    	return origData, nil
    }
    
    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)]
    }
    
    func TripleDesECBEncrypt(origData, key []byte) ([]byte, error) {
    	block, err := des.NewTripleDESCipher(key)
    	if err != nil {
    		return nil, err
    	}
    	bs := block.BlockSize()
    	origData = PKCS5Padding(origData, bs)
    	if len(origData)%bs != 0 {
    		return nil, errors.New("Need a multiple of the blocksize")
    	}
    	out := make([]byte, len(origData))
    	dst := out
    	for len(origData) > 0 {
    		block.Encrypt(dst, origData[:bs])
    		origData = origData[bs:]
    		dst = dst[bs:]
    	}
    	return out, nil
    }
    
    func TripleDesECBDecrypt(crypted, key []byte) ([]byte, error) {
    	block, err := des.NewTripleDESCipher(key)
    	if err != nil {
    		return nil, err
    	}
    	bs := block.BlockSize()
    	if len(crypted)%bs != 0 {
    		return nil, errors.New("crypto/cipher: input not full blocks")
    	}
    	out := make([]byte, len(crypted))
    	dst := out
    	for len(crypted) > 0 {
    		block.Decrypt(dst, crypted[:bs])
    		crypted = crypted[bs:]
    		dst = dst[bs:]
    	}
    	out = PKCS5UnPadding(out)
    	return out, nil
    }
    
    
  • 相关阅读:
    SQL Server ->> 生成代码把表字段从NULL改为NOT NULL
    Hadoop ->> MapReduce编程模型
    SQL Server ->> 建立linked server到Azure SQL Server
    SQL Server ->> 存储过程sp_rename重命名数据对象
    SQL Server ->> CLR存储过程枚举目录文件并返回结果集
    SQL Server ->> 查看SQL Server备份历史
    SQL Server ->> 生成时间类型的Partition Function和Partition Scheme代码
    SQL Server ->> CLR编程问题汇总
    Hadoop ->> Name node/Data node和Job tracker/Task tracker的区别
    Hadoop ->> Hadoop是什么?
  • 原文地址:https://www.cnblogs.com/cqvoip/p/8078950.html
Copyright © 2011-2022 走看看