1. package main
  2.  
  3. import (
  4. "bytes"
  5. //"crypto/aes"
  6. "crypto/cipher"
  7. "crypto/des"
  8. "fmt"
  9. )
  10.  
  11. //cipher包实现了多个标准的用于包装底层块加密算法的加密算法实现。
  12.  
  13. /*
  14. DES的操作
  15. 加解密实现思路
  16. 加密-CBC分组模式
  17. 1.创建并返回一个使用DES算法的cipher.Block接口
  18. .秘钥长度为64bit,即64/8 = 8字节(byte)
  19. 2.对最后一个明文分组进行数据填充
  20. .DES是以64比特的明文(比特序列)为一个单位来进行加密的
  21. .最后一组不够64bit,则需要进行数据填充
  22. 3.创建一个密码分组为链接模式的,底层使用DES加密的BlockMode接口
  23. 4.加密连续的数据块
  24.  
  25. 解密
  26. 1.创建并返回一个使用DES算法的cipher.Block接口
  27. 2.创建一个密码分组为链接模式的,底层使用DES解密的BlockMode接口
  28. 3.数据块解密
  29. 4.去掉最后一组的填充数据
  30. */
  31.  
  32. //使用des进行对称加密
  33.  
  34. func paddingText(src []byte, blockSize int) []byte {
  35. //1.截取加密代码 段数
  36. fmt.Println("加密之前的数据", src)
  37. padding := blockSize - len(src)%blockSize
  38. //2.无余数
  39. if padding == 0 {
  40. padText := bytes.Repeat([]byte{byte(blockSize)}, blockSize)
  41. src = append(src, padText...)
  42. } else { //else 一定直接要添加到该右括号的后面,不能令起一行
  43. //3.有余数
  44. padText := bytes.Repeat([]byte{byte(padding)}, padding)
  45. src = append(src, padText...)
  46. }
  47. //4.添加余数
  48. //src = append(src, padText...)
  49. return src
  50.  
  51. }
  52. func unPaddingText(src []byte) []byte {
  53. //1.取出最后一个元素
  54. lasteum := int(src[len(src)-1])
  55. //2.删除和最后一个元素相等长的字节
  56. newText := src[:len(src)-lasteum]
  57. return newText
  58. }
  59.  
  60. func encryptDES(src, key []byte) []byte {
  61. //1.创建并返回一个使用DES算法的cipher.Block接口
  62. /*
  63. func NewCipher(key []byte) (cipher.Block, error)
  64. 创建并返回一个使用DES算法的cipher.Block接口。
  65. */
  66. block, err := des.NewCipher(key)
  67. if err != nil {
  68. fmt.Println(err)
  69. }
  70. //2.对最后一个明文分组进行数据填充
  71. src = paddingText(src, block.BlockSize())
  72.  
  73. //3.创建一个密码分组为链接模式的,底层使用DES加密的BlockMode接口
  74. //iv := make([]byte,block.BlockSize())
  75. iv := []byte("aaaabbbb")
  76. /*
  77. func NewCBCEncrypter(b Block, iv []byte) BlockMode
  78. 返回一个密码分组链接模式的、底层用b加密的BlockMode接口,初始向量iv的长度必须等于b的块尺寸。
  79. */
  80. blockMode := cipher.NewCBCEncrypter(block, iv)
  81. /*
  82. type BlockMode interface {
  83. // 返回加密字节块的大小
  84. BlockSize() int
  85. // 加密或解密连续的数据块,src的尺寸必须是块大小的整数倍,src和dst可指向同一内存地址
  86. CryptBlocks(dst, src []byte)
  87. }
  88. */
  89. //4.加密连续的数据块
  90. dst := make([]byte, len(src))
  91. blockMode.CryptBlocks(dst, src)
  92.  
  93. return dst
  94. }
  95.  
  96. func decryptDES(src, key []byte) []byte {
  97. //1.创建并返回一个使用DES算法的cipher.Block接口
  98. Block, err := des.NewCipher(key)
  99. if err != nil {
  100. panic(err)
  101. }
  102. //2.创建一个密码分组为链接模式的,底层使用DES解密的BlockMode接口
  103. //iv := make([]byte,Block.BlockSize())
  104. iv := []byte("aaaabbbb")
  105. //func NewCBCDecrypter(b Block, iv []byte) BlockMode
  106. //返回一个密码分组链接模式的、底层用b解密的BlockMode接口,初始向量iv必须和加密时使用的iv相同。
  107. blockMode := cipher.NewCBCDecrypter(Block, iv)
  108. //3.数据块解密
  109. //dst := make([]byte,len(src))
  110. //blockMode.CryptBlocks(dst,src)
  111. blockMode.CryptBlocks(src, src)
  112. //4.去掉最后一组的填充数据
  113. newText := unPaddingText(src)
  114. return newText
  115. }
  116.  
  117. func main() {
  118. fmt.Println("====DES加解密====")
  119. src := []byte("少壮不努力,老大徒伤悲")
  120. key := []byte("12345678")
  121. str := encryptDES(src, key)
  122. str = decryptDES(str, key)
  123.  
  124. fmt.Println("解密之后的数据", str)
  125. }
    /*

加密之前的数据 [229 176 145 229 163 174 228 184 141 229 138 170 229 138 155 44 232

        128 129 229 164 167 229 190 146 228 188 164 230 130 178]

解密之后的数据 [229 176 145 229 163 174 228 184 141 229 138 170 229 138 155 44 232

        128 129 229 164 167 229 190 146 228 188 164 230 130 178]

*/

go加密算法:CBC对称加密(一)--DES的更多相关文章

  1. go加密算法:CBC对称加密(一)--3DES/AES

    其实对称加密中的:DES\3DES\AES 采取的加解密步骤一致,只是小的细节不太一样.大家多看看就能写出来了 // rsao1.go package main import ( "byte ...

  2. 加密算法(对称加密)AES、DES (非对称加密)RSA、DSA

    目前主流的加密方式有:(对称加密)AES.DES        (非对称加密)RSA.DSA

  3. pyDes 实现 Python 版的 DES 对称加密/解密--转

    https://my.oschina.net/leejun2005/blog/586451 手头有个 Java 版的 DES 加密/解密程序,最近想着将其 Python 重构下,方便后续脚本解析,捣鼓 ...

  4. .net 对称加密DESCryptoServiceProvider

    1.生成密钥以加密和解密数据 DESCryptoServiceProvider 基于一种对称加密算法.对称加密需要密钥和初始化矢量 (IV) 来加密数据.要解密该数据,您必须拥有此同一密钥和 IV.您 ...

  5. 在php中使用对称加密DES3,开发银行卡绑定,实名验证……

    对称加密:对称加密是一种数据加密算法,对一组数据的加密和解密都使用一样的密钥(key),可以有效保护金融数据,常见的对称加密有DES,3DES,AES.RC2.RC4.RC5. DES3: 对DES算 ...

  6. https 结合使用 对称加密和非对称加密

    (一)对称加密(Symmetric Cryptography) ---共享密钥加密 对称加密是最快速.最简单的一种加密方式,加密(encryption)与解密(decryption)用的是同样的密钥( ...

  7. .NET中的DES对称加密

    DES是一种对称加密(Data Encryption Standard)算法,于1977年得到美国政府的正式许可,是一种用56位密钥来加密64位数据的方法.一般密码长度为8个字节,其中56位加密密钥, ...

  8. Java和.NET使用DES对称加密的区别

    Java和.NET的系统类库里都有封装DES对称加密的实现方式,但是对外暴露的接口却各不相同,甚至有时会让自己难以解决其中的问题,比如Java加密后的结果在.NET中解密不出来等,由于最近项目有跨Ja ...

  9. 对称加密----AES和DES加密、解密

    目前主流的加密方式有:(对称加密)AES.DES        (非对称加密)RSA.DSA 调用AES/DES加密算法包最精要的就是下面两句话: Cipher cipher = Cipher.get ...

随机推荐

  1. centos系统移植

    今天将一个服务器上面的硬盘拆掉放到安装到另外一个服务器上面,硬盘里已经安装系统为centos6.0. 服务器 为dell的1850,好吧,在今天我还有幸搞这种“屎”前的服务器还是很幸运的! 硬盘换了之 ...

  2. DevExpress源码编译总结 z

    本篇文章内容包括基础知识(GAC.程序集强签名.友元程序集).编译过程.注册GAC.添加工具箱.多语言支持.运行时和设计时调试 源码地址 链接:http://pan.baidu.com/s/1eQm1 ...

  3. 【Leetcode】【Hard】Reverse Nodes in k-Group

    Given a linked list, reverse the nodes of a linked list k at a time and return its modified list. If ...

  4. 【Leetcode】【Medium】Minimum Path Sum

    Given a m x n grid filled with non-negative numbers, find a path from top left to bottom right which ...

  5. python接口自动化4-绕过验证码登录(cookie) (转载)

    前言 有些登录的接口会有验证码:短信验证码,图形验证码等,这种登录的话验证码参数可以从后台获取的(或者查数据库最直接). 获取不到也没关系,可以通过添加cookie的方式绕过验证码. 一.抓登录coo ...

  6. java virtualVM远程配置方法

    在/etc/hosts中设置主机名和ip的对应关系   ip为用java virtualVM链接服务器的ip 如:      10.175.0.191 host-ai #rmiregistry不知道干 ...

  7. python实现读取类别频数数据画水平条形图

    1.数据分组-->频数分布表 环境配置: import pandas as pd import numpy as np import matplotlib.pyplot as plt 按照你设定 ...

  8. delegate 和 event

    delegate 和 event 观察者模式 这里面综合了几本书的资料. 需求 有这么个项目: 需求是这样的: 一个气象站, 有三个传感器(温度, 湿度, 气压), 有一个WeatherData对象, ...

  9. [原]Android打包之Eclipse打多渠道包

    Android自动打包流程详细图: 步骤一和步骤二参考:[原]Android打包之Eclipse打包 步骤三:编写build.xml <?xml version="1.0" ...

  10. MongoDB索引管理

    一.创建索引 创建索引使用db.collectionName.ensureIndex(...)方法进行创建: 语法: >db.COLLECTION_NAME.ensureIndex({KEY:1 ...