Go語言中的加解密利器:go-crypto庫全解析

左诗右码發表於2024-11-25

在軟體開發中,資料安全和隱私保護越來越受到重視。Go 語言以其簡潔高效的特性,成為了許多開發者的首選。然而,在實際專案中使用加解密時,還是需要在標準庫的基礎上做一些封裝。go-crypto 庫應運而生,它是一個專為 Golang 設計的加密解密工具庫,提供了 AES 和 RSA 等多種加密演算法的支援。

本文將從安裝、特性、基本與高階功能,以及實際應用場景等多個角度,全面介紹這個庫。

go-crypto 庫簡介

go-crypto 是一個為 Golang 設計的加密解密工具庫,它實現了多種常用的加密演算法,包括 AES 和 RSA 等。透過這個庫,開發者可以輕鬆地在 Go 語言專案中實現資料的加密和解密,保障資料傳輸和儲存的安全性。

安裝

要在你的 Go 專案中使用 go-crypto,首先需要透過 go get 命令安裝:

go get -u github.com/pudongping/go-crypto

特性

go-crypto 庫提供了以下特性:

  1. AES加解密方法:支援電碼本模式(ECB)、密碼分組連結模式(CBC)、計算器模式(CTR)、密碼反饋模式(CFB)和輸出反饋模式(OFB)。
  2. RSA加解密方法:支援 RSA 加密和解密。

接下來,我就分別以 Go 和 PHP 加解密分別來演示其用法。

AES 加解密

CBC 模式

CBC 模式是密碼分組連結模式,它透過將前一個塊的加密結果與當前塊的明文進行 XOR 操作,增加了加密資料的安全性。以下是使用 go-crypto 庫進行 AES-CBC 加密和解密的示例:

Go加密,PHP解密(AES-128-CBC)

go 加密

package main

import (
    "fmt"
    "github.com/pudongping/go-crypto"
)

func main() {
    plaintext := "hello world! My name is Alex Pu"
    key := "1234567890123456" // 金鑰位元組長度必須為16個位元組

    ciphertext, err := go_crypto.AESCBCEncrypt(plaintext, key)
    if err != nil {
        fmt.Println("出錯啦!", err)
    }
    fmt.Println(ciphertext)
}

PHP 解密

<?php
$key = '1234567890123456';
$iv = mb_substr($key, 0, 16);
$s = 'BRK08I0OYOoFwhgIBT1qjFywFkLADdeLQfVZM7CPKJ8=';

$str = base64_decode($s);
$decrypted = openssl_decrypt($str, 'AES-128-CBC', $key, OPENSSL_RAW_DATA, $iv);
if (!$decrypted) {
    echo '解密失敗' . PHP_EOL;
} else {
    echo($decrypted) . PHP_EOL;
}
?>

php 加密,go 解密(AES-128-CBC)

PHP 加密


$string = 'hello world! alex';
$key = '1234567890123456';
$iv = mb_substr($key, 0, 16);

$encrypted = openssl_encrypt($string, 'AES-128-CBC', $key, OPENSSL_RAW_DATA, $iv);
$s = base64_encode($encrypted);

// output is: YAZkDJYi7e9O09TRNvUf+6sFMlI8AQvZ5GVU+xJIuOc=
echo $s . PHP_EOL;

Go 解密

import "github.com/pudongping/go-crypto"

func main() {
    ciphertext := "YAZkDJYi7e9O09TRNvUf+6sFMlI8AQvZ5GVU+xJIuOc="
    key := "1234567890123456"
    
    plaintext, err := go_crypto.AESCBCDecrypt(ciphertext, key)
    if err != nil {
        fmt.Println("出錯啦!", err)
    }
    
    // output is: 解密 ==>  hello world! alex
    fmt.Println("解密 ==> ", plaintext)
}

ECB 模式

ECB 模式是電碼本模式,它是最簡單的加密模式,但安全性較低,通常不推薦使用。以下是使用 go-crypto 庫進行 AES-ECB 加密和解密的示例:

Go加密,PHP解密(AES-128-ECB)

go 加密

package main

import (
    "fmt"
    "github.com/pudongping/go-crypto"
)

func main() {
    plaintext := "hello world! My name is Alex Pu"
    key := "1234567890123456" // 金鑰位元組長度必須為16個位元組

    ciphertext, err := go_crypto.AESECBEncrypt(plaintext, key)
    if err != nil {
        fmt.Println("出錯啦!", err)
    }
    fmt.Println(ciphertext)
}

php 解密

<?php
$key = '1234567890123456';
$s = 'sRFeHhndretZFZE9/7WdGuGw1QYl8l/IlI1XEtpVzxI=';

$str = base64_decode($s);
$decrypted = openssl_decrypt($str, 'AES-128-ECB', $key, OPENSSL_RAW_DATA);
if (!$decrypted) {
    echo '解密失敗' . PHP_EOL;
} else {
    echo($decrypted) . PHP_EOL;
}
?>

RSA 加解密

go-crypto 庫還提供了 RSA 加密和解密的功能。以下是使用 go-crypto 庫進行 RSA 加密和解密的示例:

package main

import (
    "fmt"
    "github.com/pudongping/go-crypto"
)

func main() {
    privateKey := []byte(`-----BEGIN RSA PRIVATE KEY-----
...
-----END RSA PRIVATE KEY-----`)

    publicKey := []byte(`-----BEGIN PUBLIC KEY-----
...
-----END PUBLIC KEY-----`)

    plaintext := "hello world"
    fmt.Println("原文 ==> ", plaintext)
    ciphertext, err := go_crypto.RSAEncrypt(publicKey, []byte(plaintext))
    if err != nil {
        fmt.Println(err)
        return
    }

    plaintext1, err := go_crypto.RSADecrypt(privateKey, ciphertext)
    fmt.Println("解密 ==> ", string(plaintext1))
    if err != nil {
        fmt.Println(err)
        return
    }
}

應用場景

假設你正在開發一個需要安全通訊的分散式系統,go-crypto 庫可以用於加密敏感資料,如使用者資訊、支付資訊等,確保資料在傳輸過程中的安全性。透過使用 AES 加密,你可以保護資料不被未授權訪問,而 RSA 加密則可以用於安全地傳輸金鑰。

結語

go-crypto 庫為 Go 語言開發者提供了一個強大而靈活的加密解密工具。透過本文的詳細介紹,希望你能深入理解並掌握 go-crypto 的使用方法,為你的專案增加一層安全保障。在實際開發中,合理利用加密技術,可以顯著提高系統的安全性和可靠性。

相關文章