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. 多线程(三)GCD

    一.GCD GCD:Grand Central Dispatch,宏大的中央调度!!!是苹果为多核的并行运算提出的解决方案,会自动合理地利用更多的CPU内核(比如双核.四核), GCD的底层依然是用线 ...

  2. Facebook 的系统架构(转)

    来源:http://www.quora.com/What-is-Facebooks-architecture(由Micha?l Figuière回答) 根据我现有的阅读和谈话,我所理解的今天Faceb ...

  3. python 标准库获取网络信息

    c语言ioctl定义的常量 /usr/include/x86_64-linux-gnu/bits/ioctls.h /* Copyright (C) 1996-2015 Free Software F ...

  4. javascript ES5 Object对象

    原文:http://javascript.ruanyifeng.com/stdlib/object.html 目录 概述 Object对象的方法 Object() Object.keys(),Obje ...

  5. javaSE第二十五天

    第二十五天    399 1:如何让Netbeans的东西Eclipse能访问.    399 2:GUI(了解)    399 (1)用户图形界面    399 (2)两个包:    399 (3) ...

  6. 查看cics 运行状态

     查看cics 运行状态cicscp -v status all 

  7. Ubuntu 14.04 – How to install xrdp in Ubuntu 14.04

    http://c-nergy.be/blog/?p=5305 Hello World, Ubuntu 14.04 has been released on April 17th 2014 and we ...

  8. 通过jquery 获取文本框的聚焦和失焦方法

    我还是喜欢用jquery来实现,不管页面中多少个输入框需要实现聚焦,失焦,都公有,我常用的方法是: 遍历该页面中的input框,获取输入框中的val值,当该输入框聚焦的时候跟存放的oldValue值进 ...

  9. 通过 XML HTTP 把文本文件载入 HTML 元素

    新建一个.aspx文件 <%@ Page Language="C#" AutoEventWireup="true" CodeFile="01-通 ...

  10. sql,插入最大值加1

    insert into aa (id,name) values((select case when max(id) is null then 1 else max(id)+1 end from aa) ...