go語言教程哪裏有?Go從入門到精通系列視頻4.1 對稱加密算法


4.1.1 核心代碼

DES的加密案例,以下例所示。數組

例1-1 DESapp

1 package main區塊鏈

2 import (加密

3 "bytes"code

4 "crypto/cipher"cdn

5 "crypto/des"blog

6 "encoding/base64"ip

7 "fmt"ci

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 運行結果

相關文章
相關標籤/搜索