golang中DES/ECB/PKCS5Padding的实现

原创 2016年08月29日 16:01:45

场景:google认为DES/ECB/PKCS5Padding ECB加密安全性低,故没有对方开放.但是我们以前的工程使用的DES/ECB/PKCS5Padding算法,并且已经入库了,所以只能自己实现该算法

import (
    "encoding/base64"
    "bytes"
    "encoding/binary"
    "crypto/des"
    "errors"
    "log"
)

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

func DesEncrypt(src, key []byte) ([]byte, error) {
    block, err := des.NewCipher(key)
    if err != nil {
        return nil, err
    }
    bs := block.BlockSize()
    src = PKCS5Padding(src, bs)
    if len(src) % bs != 0 {
        return nil, errors.New("Need a multiple of the blocksize")
    }
    out := make([]byte, len(src))
    dst := out
    for len(src) > 0 {
        block.Encrypt(dst, src[:bs])
        src = src[bs:]
        dst = dst[bs:]
    }
    return out, nil
}

func DesDecrypt(src, key []byte) ([]byte, error) {
    block, err := des.NewCipher(key)
    if err != nil {
        return nil, err
    }
    out := make([]byte, len(src))
    dst := out
    bs := block.BlockSize()
    if len(src) % bs != 0 {
        return nil, errors.New("crypto/cipher: input not full blocks")
    }
    for len(src) > 0 {
        block.Decrypt(dst, src[:bs])
        src = src[bs:]
        dst = dst[bs:]
    }
    out = PKCS5UnPadding(out)
    return out, nil
}

参考 https://gist.github.com/cuixin/10612934 通过他修改而来

另外java和golang byte数组转化也是一个坑 @see http://blog.csdn.net/hai046/article/details/52353963

版权声明:本文为博主原创文章,未经博主允许不得转载。

php中实现3DES算法(ECB加密模式PKCS5Padding填充)

讲道理,一提到3DES算法,首先想到的是要和java做交互了== 现在3DES已经渐渐被抛弃了,尤其是ECB加密模式使用的更少了,但是没办法,业务需要,合作方用的是他,你头再铁也不能怎样,那就扒扒文...

AES/ECB/PKCS5Padding C++实现

  • 2017年08月25日 14:16
  • 12KB
  • 下载

AES/ECB/PKCS5PADDING

  • 2016年05月27日 11:36
  • 88KB
  • 下载

AES For Delphi And Java, AES/ECB/PKCS5Padding(二)

上一篇文章里面,AES加密算法的测试用的加密密钥是1234567812345678,正好是128bit的,如果密钥不是128bit呢,该怎么填充? 先看以下代码: [java] v...

Qt AES算法ECB模式 PKCS5Padding 128bit

  • 2014年10月16日 20:08
  • 20KB
  • 下载

C++封装AES加密类,(ECB + BASE64 + pkcs5padding),直接操纵和返回字符串

前几天需要使用AES加密,其他语言都是现成的类库,new 个实例 + 传个参数 = 搞定! C++的也有现成的crypto++之类的库,不过太大了,一个库就40多M,没法接受,只能自己寻找资料自力更生...

node.js AES/ECB/PKCS5Padding 与其他语言的加密解密通用

node.js AES/ECB/PKCS5Padding 与其他语言的加密解密通用
  • shmnh
  • shmnh
  • 2015年09月07日 00:06
  • 1258

node.js AES/ECB/PKCS5Padding 与其他语言的加密解密通用

来自:http://yijiebuyi.com/blog/13e2ae33082ac12ba4946b033be04bb5.html 关于什么是AES? 需要自己goole了解一下,...

java和iOS的DES/EBC/PKCS5Padding

遇到的java代码如下: Cipher cipher=Cipher.getInstance("DES/EBC/PKCS5Padding");   以前写的代码,给的参数都是DES或D...
  • leafgw
  • leafgw
  • 2017年05月25日 00:27
  • 598

AES/ECB/PKCS5Padding/PKCS7Padding 128位密钥(带密钥补位功能)加密解密

今天客户说发解密算法过来,本来以为拿来的是代码直接用, 没想到就直接给了我个网站http://www.seacha.com/tools/aes.html 和他们用的算法模式+密钥。 以前还真没玩过AE...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:golang中DES/ECB/PKCS5Padding的实现
举报原因:
原因补充:

(最多只允许输入30个字)