注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

being23

写给未来的自己

 
 
 

日志

 
 
关于我

真正的坚定,就是找到力量去做自己喜欢的事情,并为之努力,这样才会觉得生活是幸福的。

网易考拉推荐

加密方法性能测试  

2015-04-02 15:54:36|  分类: work@oppo |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

说明

zero填充,CBC模式,使用aes128,xxtea,des,3des四种加密方法加解密近1G大小的文件,在开发机上执行了4遍,得到下面四组数据

结论

  1. 加解密吞吐量:aes>xxtea>des>3des。其中,aes的吞吐量高于其他算法1-2个数量级;xxtea的加密吞吐量远高于des,接近8倍,解密吞吐量接近
  2. 文件大小加密前后转换率:四种方法加密后文件大小无差异;加密后文件大小与原文件大小差异可以忽略
加密方法性能测试 - 柒.smilence - being23
 

平均

加密算法加密吞吐量M/s加密耗时s解密吞吐量M/s解密耗时s加密前文件大小M加密后文件大小M
des11.73105.8711.76105.6311841184
3des3.72340.023.97312.6211841184
xxtea81.8015.1913.9589.8311841184
aes361.923.43374.293.3211841184

第一组

加密算法加密吞吐量M/s加密耗时s解密吞吐量M/s解密耗时s加密前文件大小M加密后文件大小M
des11.73105.9111.76105.5811841184
3des3.98312.373.97312.7911841184
xxtea82.8114.9914.2787.0111841184
aes363.773.41373.403.3211841184

第二组

加密算法加密吞吐量M/s加密耗时s解密吞吐量M/s解密耗时s加密前文件大小M加密后文件大小M
des11.73105.8911.77105.5311841184
3des2.93423.333.97312.5011841184
xxtea79.1715.6811.83104.9711841184
aes362.663.42376.303.3011841184

第三组

加密算法加密吞吐量M/s加密耗时s解密吞吐量M/s解密耗时s加密前文件大小M加密后文件大小M
des11.73105.8411.76105.5811841184
3des3.98312.033.97312.5311841184
xxtea82.5415.0414.6085.0611841184
aes358.323.46373.793.3211841184

第四组

加密算法加密吞吐量M/s加密耗时s解密吞吐量M/s解密耗时s加密前文件大小M加密后文件大小M
des11.74105.8211.74105.8211841184
3des3.98312.323.97312.6611841184
xxtea82.6615.0215.1082.2511841184
aes362.913.42373.683.3211841184

测试代码

package main

import (
        "bytes"
        "crypto/aes"
        "crypto/cipher"
        "crypto/des"
        "fmt"
        "github.com/xxtea/xxtea-go/xxtea"
        "io/ioutil"
        "os"
        "runtime"
        "time"
)

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 {
        return bytes.TrimFunc(origData,
                func(r rune) bool {
                        return r == rune(0)
                })
}

func checkError(err error) {
        if err != nil {
                fmt.Println("Error:", err)
        }
}

func getRunTime(fn func([]byte, []byte) []byte, data []byte, key []byte, method string, suffix string) ([]byte, float64) {
        start := time.Now()
        result := fn(data, key)
        end := time.Now()
        //fmt.Println(method, suffix, "cost:", end.Sub(start))
        return result, end.Sub(start).Seconds()
}

func desEncrypt(data, key []byte) []byte {
        block, err := des.NewCipher(key)
        checkError(err)

        data = zeroPadding(data, block.BlockSize())
        //初始向量使用key
        blockMode := cipher.NewCBCEncrypter(block, key)
        blockMode.CryptBlocks(data, data)
        return data
}

func desDecrypt(data, key []byte) []byte {
        block, err := des.NewCipher(key)
        checkError(err)

        blockMode := cipher.NewCBCDecrypter(block, key)
        blockMode.CryptBlocks(data, data)
        data = zeroUnPadding(data)
        return data
}

func tdesEncrypt(data, key []byte) []byte {
        block, err := des.NewTripleDESCipher(key)
        checkError(err)

        data = zeroPadding(data, block.BlockSize())
        blockMode := cipher.NewCBCEncrypter(block, key[:8])
        blockMode.CryptBlocks(data, data)
        return data
}

func tdesDecrypt(data, key []byte) []byte {
        block, err := des.NewTripleDESCipher(key)
        checkError(err)

        blockMode := cipher.NewCBCDecrypter(block, key[:8])
        blockMode.CryptBlocks(data, data)
        data = zeroUnPadding(data)
        return data
}

func aesEncrypt(data, key []byte) []byte {
        block, err := aes.NewCipher(key)
        checkError(err)

        data = zeroPadding(data, block.BlockSize())
        blockMode := cipher.NewCBCEncrypter(block, key)
        blockMode.CryptBlocks(data, data)
        return data
}

func aesDecrypt(data, key []byte) []byte {
        block, err := aes.NewCipher(key)
        checkError(err)

        blockMode := cipher.NewCBCDecrypter(block, key)
        blockMode.CryptBlocks(data, data)
        data = zeroUnPadding(data)
        return data
}

func xxteaEncrypt(data, key []byte) []byte {
        data = xxtea.Encrypt(data, key)
        return data
}

func xxteaDecrypt(data, key []byte) []byte {
        data = xxtea.Decrypt(data, key)
        return data
}

var (
        deskey   = []byte(`12345678`)
        tdeskey  = []byte(`123456781234567812345678`)
        aeskey   = []byte(`1234567812345678`)
        xxteakey = []byte(`1234567812345678`)
)

func main() {
        if len(os.Args) < 2 {
                fmt.Println("plz input filename of orignal data")
                os.Exit(-1)
        }
        start := time.Now()
        content, err := ioutil.ReadFile(os.Args[1])
        checkError(err)
        originalSize := len(content)
        fmt.Println("orignal file size = ", originalSize)
        fmt.Println("read file cost: ", time.Since(start))

        encryptFuncs := []func([]byte, []byte) []byte{tdesEncrypt, aesEncrypt, desEncrypt, xxteaEncrypt}
        decryptFuncs := []func([]byte, []byte) []byte{tdesDecrypt, aesDecrypt, desDecrypt, xxteaDecrypt}

        keys := [][]byte{tdeskey, aeskey, deskey, xxteakey}
        methods := []string{"3des", "aes", "des", "xxtea"}
        suffix := []string{"encrypt", "decrypt"}

        for i, encryptFunc := range encryptFuncs {
                data, cost := getRunTime(encryptFunc, content, keys[i], methods[i], suffix[0])
                //ioutil.WriteFile("/tmp/benchmark_"+methods[i]+"_"+suffix[0], data, 0666)
                encryptedSize := len(data)
                fmt.Printf("%s\t%s rate: %.2fM/s\t%f\t", methods[i], suffix[0], float64(originalSize)/cost/1000000, cost)

                //data, err = ioutil.ReadFile("/tmp/benchmark_" + methods[i] + "_" + suffix[0])
                checkError(err)
                data, cost = getRunTime(decryptFuncs[i], data, keys[i], methods[i], suffix[1])
                //ioutil.WriteFile("/tmp/benchmark_"+methods[i]+"_"+suffix[1], data, 0666)
                content = data
                fmt.Printf("\t%s rate:%.2fM/s\t%f\t%dM\t%dM\n", suffix[1], float64(encryptedSize)/cost/1000000, cost, originalSize/1024/1024, encryptedSize/1024/1024)
                runtime.GC()
        }
}
20150402@迈科龙
  评论这张
 
阅读(1151)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017