本人新手,参考文档:

http://blog.studygolang.com/2013/01/go加密解密之des/

http://blog.csdn.net/scybs/article/details/38279159

  1. // DES、3DES加解密示例,用于生产环境请修改代码使之健壮
  2. package main
  3. import (
  4. "bytes"
  5. "crypto/cipher"
  6. "crypto/des"
  7. "encoding/base64"
  8. "errors"
  9. "fmt"
  10. )
  11. func main() {
  12. test3Des()
  13. }
  14. func test3Des() {
  15. key, err := base64.StdEncoding.DecodeString("b93e24738d364ad38047a97d6a8ad63c")
  16. result, err := TripleDesECBEncrypt([]byte("一直都在poiuy123"), key)
  17. if err != nil {
  18. panic(err)
  19. }
  20. fmt.Println(base64.StdEncoding.EncodeToString(result))
  21. origData, err := TripleDesECBDecrypt(result, key)
  22. if err != nil {
  23. panic(err)
  24. }
  25. fmt.Println(string(origData))
  26. }
  27. // 3DES加密
  28. func TripleDesCBCEncrypt(origData, key []byte) ([]byte, error) {
  29. block, err := des.NewTripleDESCipher(key)
  30. if err != nil {
  31. return nil, err
  32. }
  33. origData = PKCS5Padding(origData, block.BlockSize())
  34. // origData = ZeroPadding(origData, block.BlockSize())
  35. blockMode := cipher.NewCBCEncrypter(block, key[:8])
  36. crypted := make([]byte, len(origData))
  37. blockMode.CryptBlocks(crypted, origData)
  38. return crypted, nil
  39. }
  40. // 3DES解密
  41. func TripleDesCBCDecrypt(crypted, key []byte) ([]byte, error) {
  42. block, err := des.NewTripleDESCipher(key)
  43. if err != nil {
  44. return nil, err
  45. }
  46. blockMode := cipher.NewCBCDecrypter(block, key[:8])
  47. origData := make([]byte, len(crypted))
  48. // origData := crypted
  49. blockMode.CryptBlocks(origData, crypted)
  50. origData = PKCS5UnPadding(origData)
  51. // origData = ZeroUnPadding(origData)
  52. return origData, nil
  53. }
  54. func PKCS5Padding(ciphertext []byte, blockSize int) []byte {
  55. padding := blockSize - len(ciphertext)%blockSize
  56. padtext := bytes.Repeat([]byte{byte(padding)}, padding)
  57. return append(ciphertext, padtext...)
  58. }
  59. func PKCS5UnPadding(origData []byte) []byte {
  60. length := len(origData)
  61. // 去掉最后一个字节 unpadding 次
  62. unpadding := int(origData[length-1])
  63. return origData[:(length - unpadding)]
  64. }
  65. func TripleDesECBEncrypt(origData, key []byte) ([]byte, error) {
  66. block, err := des.NewTripleDESCipher(key)
  67. if err != nil {
  68. return nil, err
  69. }
  70. bs := block.BlockSize()
  71. origData = PKCS5Padding(origData, bs)
  72. if len(origData)%bs != 0 {
  73. return nil, errors.New("Need a multiple of the blocksize")
  74. }
  75. out := make([]byte, len(origData))
  76. dst := out
  77. for len(origData) > 0 {
  78. block.Encrypt(dst, origData[:bs])
  79. origData = origData[bs:]
  80. dst = dst[bs:]
  81. }
  82. return out, nil
  83. }
  84. func TripleDesECBDecrypt(crypted, key []byte) ([]byte, error) {
  85. block, err := des.NewTripleDESCipher(key)
  86. if err != nil {
  87. return nil, err
  88. }
  89. bs := block.BlockSize()
  90. if len(crypted)%bs != 0 {
  91. return nil, errors.New("crypto/cipher: input not full blocks")
  92. }
  93. out := make([]byte, len(crypted))
  94. dst := out
  95. for len(crypted) > 0 {
  96. block.Decrypt(dst, crypted[:bs])
  97. crypted = crypted[bs:]
  98. dst = dst[bs:]
  99. }
  100. out = PKCS5UnPadding(out)
  101. return out, nil
  102. }

golang 3des/ecb/cbc/pkcs5 加解密的更多相关文章

  1. openssl:AES CBC PKCS5 加解密 (C/GOLANG)

    #include <openssl/aes.h> /* AES_CBC_PKCS5_Encrypt * 入参: * src:明文 * srcLen:明文长度 * key:密钥 长度只能是1 ...

  2. AES CBC/CTR 加解密原理

    So, lets look at how CBC works first. The following picture shows the encryption when using CBC (in ...

  3. Java 使用AES/CBC/PKCS7Padding 加解密字符串

    介于java 不支持PKCS7Padding,只支持PKCS5Padding 但是PKCS7Padding 和 PKCS5Padding 没有什么区别要实现在java端用PKCS7Padding填充, ...

  4. python 实现 AES CBC模式加解密

    AES加密方式有五种:ECB, CBC, CTR, CFB, OFB 从安全性角度推荐CBC加密方法,本文介绍了CBC,ECB两种加密方法的python实现 python 在 Windows下使用AE ...

  5. 使用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 ...

  6. JAVA AES CBC PKCS5Padding加解密

    package com.hzxc.groupactivity.util; /** * Created by hdwang on 2019/1/17. */ import org.slf4j.Logge ...

  7. python 实现 DES CBC模式加解密

    # -*- coding=utf-8-*- from Crypto.Cipher import DES import base64 """ des cbc加密算法 pad ...

  8. c++ 基于wincrypt的DES CBC模式加解密

    des.h #pragma once #include <windows.h> #include <atlstr.h> #include <wincrypt.h> ...

  9. 手机号的 AES/CBC/PKCS7Padding 加解密

    前言:接口中上次的手机号码和密码是传入的加密的,模拟自动化的时候也需要先对数据进行加密 1.各种语言实现 网上已经各种语言实现好的AES加密,可以点击查看:http://outofmemory.cn/ ...

随机推荐

  1. JavaScript 上万条数据 导出Excel文件 页面卡死

    最近项目要js实现将数据导出excel文件,网上很多插件实现~~那个开心呀,谁知道后面数据量达到上万条时出问题:浏览器不仅卡死,导出的excel文件一直提示网络失败.... debug调试发现var  ...

  2. Win10系列:VC++媒体播放控制4

    (7)音量控制 MediaElement控件具有一个Volume属性,通过设置此属性的值可以改变视频音量的大小.接下来介绍如何实现视频的音量控制,首先打开MainPage.xaml文件,并在Grid元 ...

  3. printf以%d形式输出浮点数的问题

    若运行时从键盘上输入9876543210l,则下面程序的输出结果是 int main(){ int a;float b,c; scanf("%2d%3f%4f",&a,&a ...

  4. File 和 导出jar包

    1.File import java.io.File; import java.io.IOException; public class FileTest { public static void m ...

  5. Docker使用jenkins部署java项目到远程linux(三)

    实现功能:从本地提交代码到gogs上,本地的代码会被检测一遍 如果检测通过才能commit成功 然后可以继续执行push命令 .push后在gogs上使用web钩子自动推送到jenkins触发构建,j ...

  6. vue-5-列表渲染

    一个数组的v-for<ul id="example-1"> <li v-for="item in items"> {{ item.mes ...

  7. windows7环境下java jdk的配置

    第一步: 肯定是先下载好java jdk啦~~ 网址在这里:http://www.oracle.com/technetwork/java/javase/downloads/index.html 打开这 ...

  8. LeetCode难度与出现频率

    转载自:LeetCode Question Difficulty Distribution               1 Two Sum 2 5 array sort         set Two ...

  9. 菜鸟翻译:国外的一个关于.net core的学习系列 第一天(安装并运行.NET core 到windox系统里面)

    原文地址: Day 1 - Installing and Running .NET Core on a Windows Box 免责声明:我不是.NET Core 的团队成员.我使用的工具是公开可用的 ...

  10. Centos7部署kubernetes-ETCD集群(三)

    1.下载etcd软件包 wget https://github.com/coreos/etcd/releases/download/v3.2.18/etcd-v3.2.18-linux-amd64.t ...