使用golang+java实现基于ecb的3eds加解密

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))

}

时间: 2024-10-13 10:02:53

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

[掌眼]iOS / Android / java / node.js 通用的 AES256 加解密算法

example.m NSString *text = @"text"; NSString *key32 = @"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; NSData *data = [text dataUsingEncoding:NSUTF8StringEncoding]; NSString *encryptedData = [[data AES256EncryptWithKey:key32] base64EncodedStringWi

java 使用pem密钥进行RSA加解密

1.使用openssl生成私钥和公钥 openssl下载地址:http://www.openssl.org/source openssl生成私钥命令:  genrsa -out rsa_private_key.pem 1024 openssl生成公钥命令:  rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem 2.此时在openssl安装目录下的bin文件夹可以看到 rsa_private_key.pem 和 rsa_publi

java与IOS之间的RSA加解密

很简单的一个需求,ipad端给密码RSA加密,传到java后台,解密.RSA加密算法是基于一个密钥对的,分为公钥和私钥,一般情况公钥加密,私钥解密,但也可私钥加密,公钥解密.还可以验签,就是先用私钥对数据进行加密,然后对加密后的数据进行签名,得到一个签名值.然后再用公钥先验签,证明是对应私钥加密过的数据才解密.主要是为了防止来源不确定的数据.     根据上面的介绍,大家也都知道,RSA算法的关键就是密钥对,我和IOS的同事各自找了RSA的算法实现代码,都能正常根据密钥对加解密.问题是我们各自使

C++: 基于OpenSSL的AES256加解密测试

2018-07-12 暑假要求专业实习,要有周记和工作总结.之前老早就有过写博客的想法,因为可以让自己的学习生涯有迹可循.不过租的服务器即将到期,就不自己建站了.希望通过博客园这个平台记录下自己的成长吧.希望自己能坚持下去,也希望能留下一些对别人有用的东西. 第一篇内容是关于使用OpenSSL库对字符串和文件进行AES256加解密: 环境:   操作系统:windows 10 开发工具:Visual Studio 2015 关于OpenSSL 安装配置参考以下博客,传送门:https://www

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

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

Java、C#双语版配套AES加解密示例

这年头找个正经能用的东西那是真难,网上一搜索一大堆,正经能用的没几个,得,最后还是得靠自己,正巧遇上需要AES加解密的地方了,而且还是Java和C#间的相互加解密操作,这里做个备忘 这里采用的加解密使用base64转码方法,ECB模式,PKCS5Padding填充,密码必须是16位,否则会报错哈 模式:Java的ECB对应C#的System.Security.Cryptography.CipherMode.ECB 填充方法:Java的PKCS5Padding对应C#System.Security

全面解决.Net与Java互通时的RSA加解密问题,使用PEM格式的密钥文件

一.缘由 RSA是一种常用的非对称加密算法.所以有时需要在不用编程语言中分别使用RSA的加密.解密.例如用Java做后台服务端,用C#开发桌面的客户端软件时.由于 .Net.Java 的RSA类库存在很多细节区别,尤其是它们支持的密钥格式不同.导致容易出现“我加密的数据对方不能解密,对方加密的数据我不能解密,但是自身是可以正常加密解密”等情况.虽然网上已经有很多文章讨论 .Net与Java互通的RSA加解密,但是存在不够全面.需要第三方dll.方案复杂 等问题.于是我仔细研究了这一课题,得到了一

java socket 基于UDP/IP 协议

Java  socket 基于UDP/IP协议应用 服务器端:  1.创建DatagramSocket,指定端口号 2.创建DatagramPacket 3.接收客户端发送的数据 4.读取数据 客户端: 1.  定义发送信息: 服务器的IP 端口号  发送的内容 2.  创建DatagramPacket,包含将要发送的信息 3.  创建DatagramSocket 4.  发送数据 服务器端 import java.io.IOException; import java.net.Datagram

java socket 基于TCP/IP 协议

Java socket 基于TCP/IP 协议应用 多线程服务器原理: 1.          服务器端创建serversocket并绑定要监听的端口号 ,循环调用serversoket 的accept()方法,等待客户端的连接请求 2.          客户端创建一个socket绑定服务器端的IP地址和服务器监听的端口号并请求和服务器端连接 3.          服务器端接收到客户端的请求后,创建一个socket与客户端建立专线连接 4.          建立连接的两个socket在一个