Go: обзор пакета Crypto

Одним из достоинств языка Go является наличие множества встроенных библиотек, таких, как библиотеки для обработки изображений, работы с сетью, шифрования и прочего. Сегодня мы разберем некоторые моменты работы с пакетом crypto. Количество встроенных вариантов шифровния поражает - среди них есть следующие:

  • aes
  • des
  • dsa
  • ecdsa
  • hmac
  • md5
  • rc4
  • rsa
  • sha1
  • sha256
  • sha512
  • tls
  • x509

Мы всего лишь рассмотрим на примерах использование некоторых шифров.

AES

Начнем с шифра AES. Следующий код показывает, как зашифровать текст длиной в 16 байт sensitive1234567 с использованием ключа key3456789012345 (тоже длиной в 16 байт), а затем расшифровать заново.

Sample code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package main
import (
"crypto/aes"
"fmt"
)
func main() {
bc, err := aes.NewCipher([]byte("key3456789012345"))
if (err != nil) {
fmt.Println(err);
}
fmt.Printf("The block size is %d\n", bc.BlockSize())
var dst = make([]byte, 16)
var res = make([]byte, 16)
var src = []byte("sensitive1234567")
bc.Encrypt(dst, src)
bc.Decrypt(res, dst)
fmt.Println(string(dst))
fmt.Println(string(res))
}

DES

Использование данного шифра ничем не отличается от предыдущего примера (стоит только заметить, что шифр работает с блоками длины 8 байт):

Sample code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
...
import (
"crypto/des"
...
func main() {
bc, err := des.NewCipher([]byte("key98760"))
...
var dst = make([]byte, 8)
var res = make([]byte, 8)
var src = []byte("text9087")
...
bc.Encrypt(dst, src)
bc.Decrypt(res, dst)
...

SHA1

Кроме алгоритмов шифрования, пакет crypto содержит алгоритмы хеширования, например алгоритмы SHA:

Sample code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package main
import (
"crypto/sha1"
"fmt"
)
func main() {
s := "hello world" // Хешируемая строка
h := sha1.New() // Создаем обьект SHA1
h.Write([]byte(s)) // Записываем в него содержимое строки s
bs := h.Sum(nil) // Забираем значение хеша
fmt.Println(s)
fmt.Printf("%x\n", bs)
}

Заключение

Пусть я рассмотрел только три алгоритма пакета (даже не рассмотрел, а просто привел примеры кода), однако и так мы можем убедиться в простоте использования пакета. Он может оказаться весьма полезным в работе с конфеденциальными данными, потому использование данного пакета весьма предпочтительно при разработке банковских или веб-систем.

Ссылки: