• 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
    }
    
    
  • 相关阅读:
    Github 简明教程--GitHub这么火,测试员你不学学吗?
    IT行业,尤其是软件测试,怎么才能月薪突破2万?
    linux 下cmake 编译 ,调用,调试 poco 1.6.0 小记
    ffmpeg(2.6) rockplayer android 下编译 小记.
    完成端口
    C++四种强制转换
    方法区(Method Area)基础知识
    逃逸分析
    堆空间参数设置小结
    堆中的线程私有缓存区域TLAB(Thread Local Allocation Buffer)
  • 原文地址:https://www.cnblogs.com/cqvoip/p/8078950.html
Copyright © 2020-2023  润新知