博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
go语言教程哪里有?Go从入门到精通系列视频4.1 对称加密算法
阅读量:6120 次
发布时间:2019-06-21

本文共 8390 字,大约阅读时间需要 27 分钟。

4.1.1 核心代码

DES的加密案例,如下例所示。

例1-1 DES

1 package main

2 import (

3 "bytes"

4 "crypto/cipher"

5 "crypto/des"

6 "encoding/base64"

7 "fmt"

8 )

9 func main(){

10 key := []byte("00000000") //秘钥只占8个字节

11 arr := "千锋教育"

12 fmt.Println("------------DES加密解密字节数组")

13 fmt.Println("加密前:",arr)

14 resultArr, _ := DesEncrypt([]byte(arr), key)

15 fmt.Printf("加密后:%x\n", resultArr)

16 resultArr, _ = DesDecrypt(resultArr, key)

17 fmt.Println("解密后:", string(resultArr))

18 fmt.Println("------------DES加密解密字符串")

19 cipherText, _ := DesEncryptString(arr, key)

20 fmt.Println("加密后:" , cipherText)

21 originalText, _ := DesDecryptString(cipherText, key)

22 fmt.Println("解密后:", originalText)

23

24 }

25 //DES加密字节数组,返回字节数组

26 func DesEncrypt(originalBytes, key []byte) ([]byte, error) {

27 block, err := des.NewCipher(key)

28 if err != nil {

29 return nil, err

30 }

31 originalBytes = PKCS5Padding(originalBytes, block.BlockSize())

32 blockMode := cipher.NewCBCEncrypter(block, key)

33 cipherArr := make([]byte, len(originalBytes))

34 blockMode.CryptBlocks(cipherArr, originalBytes)

35 return cipherArr, nil

36 }

37 //DES解密字节数组,返回字节数组

38 func DesDecrypt(cipherBytes, key []byte) ([]byte, error) {

39 block, err := des.NewCipher(key)

40 if err != nil {

41 return nil, err

42 }

43 blockMode := cipher.NewCBCDecrypter(block, key)

44 originalText := make([]byte, len(cipherBytes))

45 blockMode.CryptBlocks(originalText, cipherBytes)

46 originalText = PKCS5UnPadding(originalText)

47 return originalText, nil

48 }

49 //DES加密文本,返回加密后文本

50 func DesEncryptString(originalText string, key []byte) (string, error) {

51 cipherArr, err := DesEncrypt([]byte(originalText), key)

52 if err != nil {

53 return "", err

54 }

55 base64str := base64.StdEncoding.EncodeToString(cipherArr)

56 return base64str, nil

57 }

58 //对加密文本进行DES解密,返回解密后明文

59 func DesDecryptString(cipherText string, key []byte) (string, error) {

60 cipherArr, _ := base64.StdEncoding.DecodeString(cipherText)

61 cipherArr, err := DesDecrypt(cipherArr, key)

62 if err != nil {

63 return "", err

64 }

65 return string(cipherArr), nil

66 }

67 func PKCS5Padding(ciphertext []byte, blockSize int) []byte {

68 padding := blockSize - len(ciphertext)%blockSize

69 padtext := bytes.Repeat([]byte{byte(padding)}, padding)

70 return append(ciphertext, padtext...)

71 }

72 func PKCS5UnPadding(origData []byte) []byte {

73 length := len(origData)

74 // 去掉最后一个字节 unpadding 次

75 unpadding := int(origData[length-1])

76 return origData[:(length - unpadding)]

77 }

运行结果如图所示。

图4.1 运行结果

3DES加密解密的案例,如下所示。

例1-2 3DES

1 package main

2 import (

3 "bytes"

4 "crypto/cipher"

5 "crypto/des"

6 "encoding/base64"

7 "fmt"

8 )

9 func main() {

10 key := []byte("abcdefghijklmnopqrstuvwx") //秘钥占24个字节

11 fmt.Println("------------3DES加密解密字节数组")

12 str := "我爱Go语言"

13 result, _ := TripleDesEncrypt([]byte(str), key)

14 fmt.Printf("加密后:%x\n", result)

15 origData, _ := TripleDesDecrypt(result, key)

16 fmt.Println("解密后:", string(origData))

17 fmt.Println("------------3DES加密解密字符串")

18 cipherText, _ := TripleDesEncrypt2Str(str, key)

19 fmt.Println("加密后:", cipherText)

20 originalText, _ := TripleDesDecrypt2Str(cipherText, key)

21 fmt.Println("解密后:", originalText)

22 }

23 // 3DES加密字节数组,返回字节数组

24 func TripleDesEncrypt(originalBytes, key []byte) ([]byte, error) {

25 block, err := des.NewTripleDESCipher(key)

26 if err != nil {

27 return nil, err

28 }

29 originalBytes = PKCS5Padding(originalBytes, block.BlockSize())

30 // originalBytes = ZeroPadding(originalBytes, block.BlockSize())

31 blockMode := cipher.NewCBCEncrypter(block, key[:8])

32 cipherArr := make([]byte, len(originalBytes))

33 blockMode.CryptBlocks(cipherArr, originalBytes)

34 return cipherArr, nil

35 }

36 // 3DES解密字节数组,返回字节数组

37 func TripleDesDecrypt(cipherBytes, key []byte) ([]byte, error) {

38 block, err := des.NewTripleDESCipher(key)

39 if err != nil {

40 return nil, err

41 }

42 blockMode := cipher.NewCBCDecrypter(block, key[:8])

43 originalArr := make([]byte, len(cipherBytes))

44 blockMode.CryptBlocks(originalArr, cipherBytes)

45 originalArr = PKCS5UnPadding(originalArr)

46 // origData = ZeroUnPadding(origData)

47 return originalArr, nil

48 }

49 // 3DES加密字符串,返回base64处理后字符串

50 func TripleDesEncrypt2Str(originalText string, key []byte) (string, error) {

51 block, err := des.NewTripleDESCipher(key)

52 if err != nil {

53 return "", err

54 }

55 originalData := PKCS5Padding([]byte(originalText), block.BlockSize())

56 // originalData = ZeroPadding(originalData, block.BlockSize())

57 blockMode := cipher.NewCBCEncrypter(block, key[:8])

58 cipherArr := make([]byte, len(originalData))

59 blockMode.CryptBlocks(cipherArr, originalData)

60 cipherText := base64.StdEncoding.EncodeToString(cipherArr)

61 return cipherText, nil

62 }

63 // 3DES解密base64处理后的加密字符串,返回明文字符串

64 func TripleDesDecrypt2Str(cipherText string, key []byte) (string, error) {

65 cipherArr, _ := base64.StdEncoding.DecodeString(cipherText)

66 block, err := des.NewTripleDESCipher(key)

67 if err != nil {

68 return "", err

69 }

70 blockMode := cipher.NewCBCDecrypter(block, key[:8])

71 originalArr := make([]byte, len(cipherArr))

72 blockMode.CryptBlocks(originalArr, cipherArr)

73 originalArr = PKCS5UnPadding(originalArr)

74 // origData = ZeroUnPadding(origData)

75 return string(originalArr), nil

76 }

77 func PKCS5Padding(ciphertext []byte, blockSize int) []byte {

78 padding := blockSize - len(ciphertext)%blockSize

79 padtext := bytes.Repeat([]byte{byte(padding)}, padding)

80 return append(ciphertext, padtext...)

81 }

82 func PKCS5UnPadding(origData []byte) []byte {

83 length := len(origData)

84 // 去掉最后一个字节 unpadding 次

85 unpadding := int(origData[length-1])

86 return origData[:(length - unpadding)]

87 }

运行结果如图所示。

图4.2 运行结果

AES加密解密的案例,如例所示。

例1-3 AES

1 package main

2 import (

3 "bytes"

4 "crypto/aes"

5 "crypto/cipher"

6 "encoding/base64"

7 "fmt"

8 )

9 func main() {

10 // AES-128。key长度:16, 24, 32 bytes 对应 AES-128, AES-192, AES-256

11 key := []byte("1234567890abcdefghijklmnopqrstuv")

12 str := "区块链很有趣"

13 fmt.Println("------------AES加密解密字节数组")

14 resultArr, _ := AesEncrypt([]byte(str), key)

15 fmt.Printf("加密后:%x\n", resultArr)

16 resultArr, _ = AesDecrypt(resultArr, key)

17 fmt.Println("解密后:", string(resultArr))

18 fmt.Println("------------AES加密解密字符串")

19 cipherText, _ := AesEncryptString(str, key)

20 fmt.Println("加密后:", cipherText)

21 originalText, _ := AesDecryptString(cipherText, key)

22 fmt.Println("解密后:", originalText)

23 }

24 //AES加密字节数组,返回字节数组

25 func AesEncrypt(originalBytes, key []byte) ([]byte, error) {

26 block, err := aes.NewCipher(key)

27 if err != nil {

28 return nil, err

29 }

30 blockSize := block.BlockSize()

31 originalBytes = PKCS5Padding(originalBytes, blockSize)

32 blockMode := cipher.NewCBCEncrypter(block, key[:blockSize])

33 cipherBytes := make([]byte, len(originalBytes))

34 blockMode.CryptBlocks(cipherBytes, originalBytes)

35 return cipherBytes, nil

36 }

37 //AES解密字节数组,返回字节数组

38 func AesDecrypt(cipherBytes, key []byte) ([]byte, error) {

39 block, err := aes.NewCipher(key)

40 if err != nil {

41 return nil, err

42 }

43 blockSize := block.BlockSize()

44 blockMode := cipher.NewCBCDecrypter(block, key[:blockSize])

45 originalBytes := make([]byte, len(cipherBytes))

46 blockMode.CryptBlocks(originalBytes, cipherBytes)

47 originalBytes = PKCS5UnPadding(originalBytes)

48 return originalBytes, nil

49 }

50 //AES加密文本,返回对加密后字节数组进行base64处理后字符串

51 func AesEncryptString(originalText string, key []byte) (string, error) {

52 cipherBytes, err := AesEncrypt([]byte(originalText), key)

53 if err != nil {

54 return "", err

55 }

56 base64str := base64.StdEncoding.EncodeToString(cipherBytes)

57 return base64str, nil

58 }

59 //对Base64处理后的加密文本进行DES解密,返回解密后明文

60 func AesDecryptString(cipherText string, key []byte) (string, error) {

61 cipherBytes, _ := base64.StdEncoding.DecodeString(cipherText)

62 cipherBytes, err := AesDecrypt(cipherBytes, key)

63 if err != nil {

64 return "", err

65 }

66 return string(cipherBytes), nil

67 }

68 func PKCS5Padding(ciphertext []byte, blockSize int) []byte {

69 padding := blockSize - len(ciphertext)%blockSize

70 padtext := bytes.Repeat([]byte{byte(padding)}, padding)

71 return append(ciphertext, padtext...)

72 }

73 func PKCS5UnPadding(origData []byte) []byte {

74 length := len(origData)

75 // 去掉最后一个字节 unpadding 次

76 unpadding := int(origData[length-1])

77 return origData[:(length - unpadding)]

78 }

运行结果如图所示。

图4.3 运行结果

转载于:https://juejin.im/post/5ca5c8f1f265da30d8386c35

你可能感兴趣的文章
C++ 迭代器运算
查看>>
【支持iOS11】UITableView左滑删除自定义 - 实现多选项并使用自定义图片
查看>>
day6-if,while,for的快速掌握
查看>>
JavaWeb学习笔记(十四)--JSP语法
查看>>
【算法笔记】多线程斐波那契数列
查看>>
java8函数式编程实例
查看>>
jqgrid滚动条宽度/列显示不全问题
查看>>
在mac OS10.10下安装 cocoapods遇到的一些问题
查看>>
angularjs表达式中的HTML内容,如何不转义,直接表现为html元素
查看>>
css技巧
查看>>
Tyvj 1728 普通平衡树
查看>>
[Usaco2015 dec]Max Flow
查看>>
javascript性能优化
查看>>
多路归并排序之败者树
查看>>
java连接MySql数据库
查看>>
转:Vue keep-alive实践总结
查看>>
android studio修改新项目package名称
查看>>
深入python的set和dict
查看>>
C++ 11 lambda
查看>>
Hadoop2.5.0 搭建实录
查看>>