1. 程式人生 > >Go實戰--go中使用base64加密(The way to go)

Go實戰--go中使用base64加密(The way to go)

生命不止,繼續 Go go go !!!

base64加密你一點也不會陌生,Base64是網路上最常見的用於傳輸8Bit位元組程式碼的編碼方式之一,大家可以檢視RFC2045~RFC2049,上面有MIME的詳細規範。Base64編碼可用於在HTTP環境下傳遞較長的標識資訊。

首先介紹介紹一下老本行,C++中是如何進行base64加密解密的,直接上程式碼了:
base64.h

#include <string>

#ifndef _BASE64_H_
#define _BASE64_H_

 __declspec(dllexport)  std::string base64_encode(unsigned
char const*, unsigned int len); __declspec(dllexport) std::string base64_decode(std::string const& s); #endif

base64.cc

#include "base64.h"
#include <iostream>

static const std::string base64_chars = 
             "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
             "abcdefghijklmnopqrstuvwxyz"
"0123456789+/"; static inline bool is_base64(unsigned char c) { return (isalnum(c) || (c == '+') || (c == '/')); } std::string base64_encode(unsigned char const* bytes_to_encode, unsigned int in_len) { std::string ret; int i = 0, j = 0; unsigned char char_array_3[3], char_array_4[4
]; while (in_len--) { char_array_3[i++] = *(bytes_to_encode++); if (i == 3) { char_array_4[0] = (char_array_3[0] & 0xfc) >> 2; char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4); char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6); char_array_4[3] = char_array_3[2] & 0x3f; for(i = 0; (i <4) ; i++) ret += base64_chars[char_array_4[i]]; i = 0; } } if (i) { for(j = i; j < 3; j++) char_array_3[j] = '\0'; char_array_4[0] = (char_array_3[0] & 0xfc) >> 2; char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4); char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6); char_array_4[3] = char_array_3[2] & 0x3f; for (j = 0; (j < i + 1); j++) ret += base64_chars[char_array_4[j]]; while((i++ < 3)) ret += '='; } return ret; } std::string base64_decode(std::string const& encoded_string) { int in_len = encoded_string.size(); int i = 0, j = 0, in_ = 0; unsigned char char_array_4[4], char_array_3[3]; std::string ret; while (in_len-- && ( encoded_string[in_] != '=') && is_base64(encoded_string[in_])) { char_array_4[i++] = encoded_string[in_]; in_++; if (i ==4) { for (i = 0; i <4; i++) char_array_4[i] = base64_chars.find(char_array_4[i]); char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4); char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2); char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3]; for (i = 0; (i < 3); i++) ret += char_array_3[i]; i = 0; } } if (i) { for (j = i; j <4; j++) char_array_4[j] = 0; for (j = 0; j <4; j++) char_array_4[j] = base64_chars.find(char_array_4[j]); char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4); char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2); char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3]; for (j = 0; (j < i - 1); j++) ret += char_array_3[j]; } return ret; }

下面就進行介紹在golang中如何進行base64加密。

encoding/base64
Package base64 implements base64 encoding as specified by RFC 4648.

StdEncoding
StdEncoding is the standard base64 encoding, as defined in RFC 4648.

NewDecoder

func NewDecoder(enc *Encoding, r io.Reader) io.Reader

NewDecoder constructs a new base64 stream decoder.

EncodeToString

func (enc *Encoding) EncodeToString(src []byte) string

EncodeToString returns the base64 encoding of src.

應用:

package main

import (
    "encoding/base64"
    "fmt"
)

func main() {
    s := "heal the world, make it a better place"

    encodeStd := "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
    s64 := base64.NewEncoding(encodeStd).EncodeToString([]byte(s))
    fmt.Println("base64.NewEncoding(encodeStd).EncodeToString")
    fmt.Println(len(s))
    fmt.Println(len(s64))
    fmt.Println(s)
    fmt.Println(s64)

    s64_std := base64.StdEncoding.EncodeToString([]byte(s))
    fmt.Println("base64.StdEncoding.EncodeToString")
    fmt.Println(len(s))
    fmt.Println(len(s64_std))
    fmt.Println(s)
    fmt.Println(s64_std)
}

輸出結果:
base64.NewEncoding(encodeStd).EncodeToString
38
52
heal the world, make it a better place
aGVhbCB0aGUgd29ybGQsIG1ha2UgaXQgYSBiZXR0ZXIgcGxhY2U=

base64.StdEncoding.EncodeToString
38
52
heal the world, make it a better place
aGVhbCB0aGUgd29ybGQsIG1ha2UgaXQgYSBiZXR0ZXIgcGxhY2U=

這裡寫圖片描述