问题场景:

业务需要对接接口, 采用DES加密方式加密, 于是google一下go的DES加密方式,
go的DES的默认隐藏了ECB模式, 因为go认为ECB不安全, 所以不建议使用,就隐藏了,
然而接口却需要采用ECB模式(吐槽写文档的人, 并没有写明使用了ECB模式,
这让我耗费了大量的时间来猜测他的加密模式)

ECB

  • 概念
    ECB(电子密本方式)就是将数据按照8个字节一段进行DES加密或解密得到一段8个字节的密文或者明文,最后一段不足8个字节,按照需求补足8个字节进行计算,之后按照顺序将计算所得的数据连在一起即可,各段数据之间互不影响。
  • 特点
  1. 简单,有利于并行计算,误差不会被传送;
  2. 不能隐藏明文的模式;在密文中出现明文消息的重复
  3. 可能对明文进行主动攻击;加密消息块相互独立成为被攻击的弱点

CBC

  • 概念
    CBC(密文分组链接方式)有向量的概念, 它的实现机制使加密的各段数据之间有了联系。
  • 加密步骤:
  1. 首先将数据按照8个字节一组进行分组得到D1D2......Dn(若数据不是8的整数倍,用指定的PADDING数据补位)
  2. 第一组数据D1与初始化向量I异或后的结果进行DES加密得到第一组密文C1(初始化向量I为全零)
  3. 第二组数据D2与第一组的加密结果C1异或以后的结果进行DES加密,得到第二组密文C2
  4. 之后的数据以此类推,得到Cn
  5. 按顺序连为C1C2C3......Cn即为加密结果。
  • 解密是加密的逆过程:
  1. 首先将数据按照8个字节一组进行分组得到C1C2C3......Cn
  2. 将第一组数据进行解密后与初始化向量I进行异或得到第一组明文D1(注意:一定是先解密再异或)
  3. 将第二组数据C2进行解密后与第一组密文数据进行异或得到第二组数据D2
  4. 之后依此类推,得到Dn
  5. 按顺序连为D1D2D3......Dn即为解密结果。
  • 特点
  1. 不容易主动攻击,安全性好于ECB,适合传输长度长的报文,是SSL、IPSec的标准。
    每个密文块依赖于所有的信息明文消息中一个改变会影响所有密文块
  2. 发送方和接收方都需要知道初始化向量
  3. 加密过程是串行的,无法被并行化(在解密时,从两个邻接的密文块中即可得到一个平文块。因此,解密过程可以被并行化。

码
//ECB加密
func EncryptDES_ECB(src, key string) string {data := []byte(src)keyByte := []byte(key)block, err := des.NewCipher(keyByte)if err != nil {panic(err)    }bs := block.BlockSize()//对明文数据进行补码data = PKCS5Padding(data, bs)if len(data)%bs != 0 {panic("Need a multiple of the blocksize")}out := make([]byte, len(data))dst := outfor len(data) > 0 {//对明文按照blocksize进行分块加密//必要时可以使用go关键字进行并行加密block.Encrypt(dst, data[:bs])data = data[bs:]dst = dst[bs:]}return fmt.Sprintf("%X", out)
}//ECB解密
func DecryptDES_ECB(src, key string) string {data, err := hex.DecodeString(src)if err != nil {panic(err)}keyByte := []byte(key)block, err := des.NewCipher(keyByte)if err != nil {panic(err)}bs := block.BlockSize()if len(data)%bs != 0 {panic("crypto/cipher: input not full blocks")}out := make([]byte, len(data))dst := outfor len(data) > 0 {block.Decrypt(dst, data[:bs])data = data[bs:]dst = dst[bs:]}out = PKCS5UnPadding(out)return string(out)
}//CBC加密
func EncryptDES_CBC(src, key string) string {data := []byte(src)keyByte := []byte(key)block, err := des.NewCipher(keyByte )if err != nil {panic(err)}data = PKCS5Padding(data , block.BlockSize())//获取CBC加密模式iv := keyByte //用密钥作为向量(不建议这样使用)mode := cipher.NewCBCEncrypter(block, iv)out := make([]byte, len(data))mode .CryptBlocks(out, data)return fmt.Sprintf("%X", out)
}//CBC解密
func DecryptDES_CBC(src, key string) string {keyByte := []byte(key)data, err := hex.DecodeString(src)if err != nil {panic(err)}block, err := des.NewCipher(keyByte)if err != nil {panic(err)}iv := keyByte //用密钥作为向量(不建议这样使用)mode := cipher.NewCBCDecrypter(block, iv)plaintext := make([]byte, len(data))mode.CryptBlocks(plaintext, data)plaintext = PKCS5UnPadding(plaintext)return string(plaintext)
}//明文补码算法
func PKCS5Padding(ciphertext []byte, blockSize int) []byte {padding := blockSize - len(ciphertext)%blockSizepadtext := 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)]
}

  

转自https://my.oschina.net/imhuayi/blog/1541840

转载于:https://www.cnblogs.com/leescre/p/10500808.html

Go语言的DES加密(CBC模式, ECB模式) ---- 与java加密互通(转)相关推荐

  1. AES加密解密(ECB模式)

    高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准.这个标准用来替代原先的DES, ...

  2. java des ecb_java版DES加密解密(ECB模式)已测试。可以正常使用。 | 学步园

    package com.fhk.Decrypt; import java.security.Key; import javax.crypto.Cipher; import javax.crypto.s ...

  3. 3DES、DES的CBC、ECB

    DES算法的两种模式ECB和CBC问题以及更加安全的算法--3DES算法. 一.数据补位 DES数据加解密就是将数据按照8个字节一段进行DES加密或解密得到一段8个字节的密文或者明文,最后一段不足8个 ...

  4. python调用库函数用ecb模式加密图片_python 实现AES加密解密(ECB模式,配合base64)...

    import base64 from Crypto.Cipher import AES ''' 采用AES对称加密算法 ''' # str不是32的倍数那就补足为16的倍数 def add_to_32 ...

  5. 对称加密算法之分组加密的六种工作模式(ECB、CBC、PCBC、CFB、OFB、CTR)

    加密一般分为对称加密(Symmetric Key Encryption)和非对称加密(Asymmetric Key Encryption).对称加密又分为分组加密和序列密码. (1)分组加密,也叫块加 ...

  6. 密码学专题 密钥生成|分组加密的模式 ECB|CBC|CFB|OFB

    密钥生成 如何安全地生成密钥.即如何生成可信任的密钥,保证用户得到的密钥是安全的, 生成密钥的机器或程序是可信的. 如何生成安全的密钥.安全的密钥没有统一准确的定义,但一般来说是指密钥抗 猜测和抗穷举 ...

  7. 信息安全工程师笔记-加密模式ECB、CBC、CFB、OFB、CTR

    简述 DES和AES都属于分组密码,它们只能加密固定长度的明文.如果需要加密任意长度的明文,就需要对分组密码进行迭代,而 分组密码的迭代方法就称为分组密码"模式". 分组密码有很多 ...

  8. 分组加密模式 ECB CBC OFB CFB ,分组加密填充

    目录 分组加密模式 ECB模式 CBC模式 CFB/OFB都可以作为流加密 CFB模式 OFB模式 分组加密的填充 PKCS7 分组加密模式 多个分组加密互相之间如何关联 ECB模式 每个分组之间单独 ...

  9. 加密模式ECB、CBC、CFB、OFB、CTR

    简述 DES和AES都属于分组密码,它们只能加密固定长度的明文.如果需要加密任意长度的明文,就需要对分组密码进行迭代,而 分组密码的迭代方法就称为分组密码"模式". 分组密码有很多 ...

最新文章

  1. 让html:error只显示第一条错误信息
  2. python数学计算例子_Python OpenCV实例:直方图计算(数学公式简单实现)
  3. UA MATH567 高维统计IV Lipschitz组合9 矩阵函数、半正定序与迹不等式
  4. 翻译: Oralce官方文档-- Data Blocks, Extents, and Segments
  5. python script 95% interval
  6. 【简明表】MATLAB + 矩阵运算
  7. wxWidgets:wxTipProvider概述
  8. ubuntu 开启ssh_CS学习笔记 | 22、通过SSH开通通道
  9. win10查看端口占用
  10. echart 导出保存图片
  11. 循环下标_【转】【Python效率】五种Pandas循环方法效率对比
  12. java jndi jboss_jboss结合spring中如何配置jndi
  13. 评估数据库存储引擎的黄金三角
  14. mysql 嵌套_MySQL嵌套查询实例详解
  15. 微信公众号文章 html,微信公众号文章爬取
  16. Java回调函数实例
  17. 【Web前端】怎样用记事本写一个简单的网页-html
  18. http 连接池 java_HttpClient 连接池管理
  19. Python 实验二 tkinter 版小学数学口算题生成器设计与实现
  20. hdu2476 字符串A-字符串-B

热门文章

  1. 用python实现自动填数生成表格v2.0
  2. java用重载实现获取元素的数据类型
  3. JavaScript 技术篇-js通过xpath获取dom节点,js校验xpath唯一性
  4. 调试笔记--jlink 变量转实时波形小技巧
  5. x VDC(x=3、5、6、8、12、24、48)继电器的引脚连接方式
  6. CTFshow php特性 web130
  7. OpenCV中图像窗口的鼠标事件
  8. 第四周实践项目3单链表:逆置、连接与递增判断(包含三个程序)
  9. flipdim--按指定维数翻转矩阵
  10. rank--求矩阵的秩