ssh-

Форк
0
/
crypt.go 
90 строк · 1.9 Кб
1
package crypt
2

3
import (
4
	"bytes"
5
	"crypto/aes"
6
	"crypto/cipher"
7
	"crypto/rand"
8
	"encoding/base64"
9
	"errors"
10
	"io"
11
	"strings"
12
)
13

14
func addBase64Padding(value string) string {
15
	m := len(value) % 4
16
	if m != 0 {
17
		value += strings.Repeat("=", 4-m)
18
	}
19

20
	return value
21
}
22

23
func removeBase64Padding(value string) string {
24
	return strings.Replace(value, "=", "", -1)
25
}
26

27
func Pad(src []byte) []byte {
28
	padding := aes.BlockSize - len(src)%aes.BlockSize
29
	padtext := bytes.Repeat([]byte{byte(padding)}, padding)
30
	return append(src, padtext...)
31
}
32

33
func Unpad(src []byte) ([]byte, error) {
34
	length := len(src)
35
	unpadding := int(src[length-1])
36

37
	if unpadding > length {
38
		return nil, errors.New("unpad error. This could happen when incorrect encryption key is used")
39
	}
40

41
	return src[:(length - unpadding)], nil
42
}
43

44
func encrypt(key []byte, text string) (string, error) {
45
	block, err := aes.NewCipher(key)
46
	if err != nil {
47
		return "", err
48
	}
49

50
	msg := Pad([]byte(text))
51
	ciphertext := make([]byte, aes.BlockSize+len(msg))
52
	iv := ciphertext[:aes.BlockSize]
53
	if _, err := io.ReadFull(rand.Reader, iv); err != nil {
54
		return "", err
55
	}
56

57
	cfb := cipher.NewCFBEncrypter(block, iv)
58
	cfb.XORKeyStream(ciphertext[aes.BlockSize:], []byte(msg))
59
	finalMsg := removeBase64Padding(base64.URLEncoding.EncodeToString(ciphertext))
60
	return finalMsg, nil
61
}
62

63
func decrypt(key []byte, text string) (string, error) {
64
	block, err := aes.NewCipher(key)
65
	if err != nil {
66
		return "", err
67
	}
68

69
	decodedMsg, err := base64.URLEncoding.DecodeString(addBase64Padding(text))
70
	if err != nil {
71
		return "", err
72
	}
73

74
	if (len(decodedMsg) % aes.BlockSize) != 0 {
75
		return "", errors.New("blocksize must be multipe of decoded message length")
76
	}
77

78
	iv := decodedMsg[:aes.BlockSize]
79
	msg := decodedMsg[aes.BlockSize:]
80

81
	cfb := cipher.NewCFBDecrypter(block, iv)
82
	cfb.XORKeyStream(msg, msg)
83

84
	unpadMsg, err := Unpad(msg)
85
	if err != nil {
86
		return "", err
87
	}
88

89
	return string(unpadMsg), nil
90
}
91

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.