http://www.100hack.com/2014/04/14/golang%E4%B8%AD%E7%9A%84des%E5%8A%A0%E5%AF%86ecb%E6%A8%A1%E5%BC%8F/

henry(454213807)  0:26:14
继续下午问的 ECB 问题.
在 go 的 issues 里找到
https://code.google.com/p/go/issues/detail?id=5597
有人为标准库写好了补丁. 但是项目管理者拒绝了. 另外这个补丁的地址还在
https://codereview.appspot.com/7860047/
还有完整的例子.
我直接拷贝下来, 跑了一下, 和 java 的一致

Golang中的DES加密ECB模式

Golang其实已经实现了ECB模式,但库却不提供,看有人提交了ECB的封装,因为DES的ECB模式是故意不放出来的,也是不安全的,所以就没有合并到Go主干中,可实际中我们又不用那么“安全”,就写了个简单的封装。

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374

package main

import (

"bytes"

"crypto/des"

"errors"

)

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 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 DesEncrypt(src, key []byte) ([]byte, error) {

block, err := des.NewCipher(key)

if err != nil {

return nil, err

}

bs := block.BlockSize()

src = ZeroPadding(src, bs)

// 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 = ZeroUnPadding(out)

// out = PKCS5UnPadding(out)

return out, nil

}

view rawdes.go hosted with ❤ by GitHub

123456789101112131415161718192021222324

package main

import (

"fmt"

"testing"

)

func TestDesEncrypt(t *testing.T) {

key := []byte("5e8487e6")

origtext := []byte("hello world123563332")

erytext, err := DesEncrypt(origtext, key)

if err != nil {

t.Fatal(err)

}

fmt.Printf("%v\n", erytext)

destext, err2 := DesDecrypt(erytext, key)

if err2 != nil {

t.Fatal(err2)

}

fmt.Println(string(destext))

fmt.Println(len(origtext), len(string(destext)))

fmt.Println(string(origtext) == string(destext))

}

使用golang+java实现基于ecb的3eds加解密的更多相关文章

  1. java与IOS之间的RSA加解密

    很简单的一个需求,ipad端给密码RSA加密,传到java后台,解密.RSA加密算法是基于一个密钥对的,分为公钥和私钥,一般情况公钥加密,私钥解密,但也可私钥加密,公钥解密.还可以验签,就是先用私钥对 ...

  2. Java实现RSA密钥对并在加解密、加签验签中应用的实例

    一.项目结构 二.代码具体实现 1.密钥对生成的两种方式:一种生成公钥私文件,一种生成公钥私串 KeyPairGenUtil.java package com.wangjinxiang.genkey. ...

  3. java和erlang之间的DES加解密

    app登录,登录的密码要用DES加密,服务器是用erlang,客户端要同时支持多平台(Android.iOS).首先,Java端的DES加密的实现方式, 少说废话了,直接上代码,如下: public ...

  4. Java拓展教程:文件DES加解密

    Java拓展教程:文件加解密 Java中的加密解密技术 加密技术根据一般可以分为对称加密技术和非对称加密技术.对称加密技术属于传统的加密技术,它的加密和解密的密钥是相同的,它的优点是:运算速度快,加密 ...

  5. AES ECB PKCS5/PKCS7 加解密 python实现 支持中文

    目录 ECB模式介绍 pkcs5padding和pkcs7padding的区别 python实现 注意事项 ECB模式介绍 电码本模式(Electronic Codebook Book (ECB) 这 ...

  6. java实现工程配置文件敏感字段加解密

    以下引自他人博客: 1. 需求背景我们在开发应用时,需要连接数据库,一般把数据库信息放在一个属性配置文件中,比如***.properties,具体的内容 #mysql的配置文件jdbc.url=jdb ...

  7. 基于FPGA的AES加解密IP

    Programmable AES Encryption/ Decryption IP 可编程AES加解密IP 可编程AES加解密IP提供了加解密算法功能,兼容美国国家标准与技术研究院(NIST)发布的 ...

  8. golang 3des/ecb/cbc/pkcs5 加解密

    本人新手,参考文档: http://blog.studygolang.com/2013/01/go%E5%8A%A0%E5%AF%86%E8%A7%A3%E5%AF%86%E4%B9%8Bdes/ h ...

  9. 对Java配置文件中敏感信息进行加解密的工具类

    在 JavaEE 配置文件中,例如 XML 或者 properties 文件,由于某些敏感信息不希望普通人员看见,则可以采用加密的方式存储,程序读取后进行解密. 常见的如: 数据库用户密码,短信平台用 ...

随机推荐

  1. 洛谷P2728 纺车的轮子 Spinning Wheels

     P2728 纺车的轮子 Spinning Wheels 29通过 66提交 题目提供者该用户不存在 标签USACO 难度普及/提高- 提交  讨论  题解 最新讨论 暂时没有讨论 题目背景 一架纺车 ...

  2. 洛谷P1206 [USACO1.2]回文平方数 Palindromic Squares

    P1206 [USACO1.2]回文平方数 Palindromic Squares 271通过 501提交 题目提供者该用户不存在 标签USACO 难度普及- 提交  讨论  题解 最新讨论 暂时没有 ...

  3. 延迟jquery,ready事件触发的时间

    $.holdReady(true);//holdReady必须在ready()方法调用之前来调用,来延迟ready()方法的执行 $(document).ready(function(){ conso ...

  4. JS常用的设计模式(9)——策略模式

    策略模式的意义是定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换.一个小例子就能让我们一目了然. 回忆下jquery里的animate方法. $( div ).animate( {&quo ...

  5. hdu2053

    查找1-n中能整除n的数的个数. 如果是偶数的话,结果为0 奇数的话,结果为1 #include <stdio.h> int main(){ int i,cnt,n; while(~sca ...

  6. 在vs2005中使用SVN进行版本管理

    1.软件准备 VisualSVN-Server-2.5.10.msi SVN服务端 WindowsXP-KB942288-v3-x86.exe XP中安装TortoiseSVNSVN1.8必须 Tor ...

  7. 【改进版】C++小程序中一个cout输出语句背后的堆栈知识

    最开始写这篇文章的时候,凭着自己对汇编的一点理解就堆出了这些内容,经 egmkang的指点,才发觉自己是井底之蛙,花了半天的功夫,去学习顺序点等内容.针对上次写的程序,我决定添一些内容,把程序2后面的 ...

  8. ios英语口语800句应用源码

    前几天突发奇想做了个很水的应用,名字叫chinese 800(汉语口语800句),现在让别人传上去了(正在传). 今天又改了一下变成了英语口语800句.加了广告条 ui 没有优化,我随便整的两个图片, ...

  9. linux修改登陆后进入的默认目录

    如将root登陆后进入的路径由/root改为/opt/FriendlyARM/linux/u-boot-mini6410修改/etc/pssswd 修改行 root:x:0:0:root:/root: ...

  10. DoNet屌丝学Android(一)——Android开发准备工作 & No HelloWord & (真机)调试

    先乱扯淡一下吧,本人一.net屌丝,手持Android 4.2.2手机,Win7 x64本本,闲来无聊学习一下Android的开发,至于要开发啥玩意目前没有什么想法,就是想学学,搞不好是三分热度也有可 ...