go语言教程哪里有?Go从入门到精通系列视频4.1 对称加密算法

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 运行结果

猜你喜欢

转载自blog.csdn.net/qfguankefeng/article/details/89028884