詳解Base64加密解密過程

一、Base64加密解密的簡介

Base64是一種基於64個可打印字符來表示二進制數據的表示方法,主要應用於電子郵件、網頁傳輸、音樂播放器等多媒體文件的傳輸和保存.由於Base64加密的結果字符都是字母和數字,所以可以通過任意渠道傳輸,不容易被屏蔽,相比其他加密算法具有更好的通用性和可移植性,支持中文,不用考慮編碼問題。

二、Base64加密的原理

Base64是一種將二進制數據轉換成ASCII字符的編碼方式,基於Base64編碼的密文,是通過對原文進行可逆操作得到的。Base64編碼會將每3個8位位元組轉換成4個可打印字符,因此Base64編碼後的密文長度會比原文長度多出1/3左右。

三、Base64編碼的算法實現

unsigned char *base64Encrypt(unsigned char *input, int length)
{
    const char pictureTable[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";//定義64位碼字符
    unsigned char *current = input;
    unsigned char *output;
    int i = 0;
    output = (unsigned char*)malloc(length*4/3+4);
    while (length > 2)//每次操作三個位元組(即3*8=24位),操作後輸出4個(4*6=24位)位元組的可打字符。
    {
        output[i++] = pictureTable[current[0] >> 2];
        output[i++] = pictureTable[((current[0] & 0x03) <> 4)];
        output[i++] = pictureTable[((current[1] & 0x0f) <> 6)];
        output[i++] = pictureTable[current[2] & 0x3f];
        current += 3;
        length -= 3;
    }
    if (length != 0)
    {
        output[i++] = pictureTable[current[0] >> 2];
        if (length > 1)
        {
            output[i++] = pictureTable[((current[0] & 0x03) <> 4)];
            output[i++] = pictureTable[(current[1] & 0x0f) << 2];
            output[i++] = '=';
        }
        else
        {
            output[i++] = pictureTable[(current[0] & 0x03) << 4];
            output[i++] = '=';
            output[i++] = '=';
        }
    }
    output[i] = '\0';
    return output;
}

Base64編碼算法是基於ASCII字符的編碼表,通過一定規則去匹配ASCII碼中的字符,並將數字和字母編碼成相應的字符(如「0」對應編碼表的「Q」),最終將輸入字符串轉換成以可打印字符表示的新字符串。

四、Base64解碼的算法實現

unsigned char *base64Decrypt(unsigned char *input, int length)
{
    const char reverseTable[] = { // 解密表
        'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H',
        'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P',
        'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X',
        'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f',
        'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n',
        'o', 'p', 'q', 'r', 's', 't', 'u', 'v',
        'w', 'x', 'y', 'z', '0', '1', '2', '3',
        '4', '5', '6', '7', '8', '9', '+', '/',
    };
    unsigned char *current = input;
    int ch, i = 0, j = 0, k;
    unsigned char *output;
    output = (unsigned char*)malloc(length*3/4+4);
    while ((ch = *current++) != '\0' && length-- > 0)
    {
        if (ch == '=')//Base64編碼填充名為「=」
        {
            break;
        }
        if (ch == ' ')
        {
            continue;
        }
        j++;
        k = ch;
        if (j % 4 == 1)
        {
            output[i] = k <> 4;
            output[i] = (k & 0x0f) <>2;
            output[i] = (k & 0x03) << 6;
        }
        else
        {
            output[i++] |= k;
        }
    }
    output[i] = '\0';
    return output;
}

Base64解碼算法是將輸入的密文轉換回原始的二進制形式。解密過程中針對輸入的每4位進行分組,然後按照Base64編碼表進行反查表操作,找出對應的十進制值,最終還原出二進制數據。

五、Base64加密解密的使用實例

#include 
#include 
#include 
#include "encrypt.h"
#define BUFFER_SIZE 1024

int main()
{
    unsigned char bufferEncrypt[BUFFER_SIZE], bufferDecrypt[BUFFER_SIZE];     
    printf("Please input the string needed to be encrypted:\n");//輸入需要加密的字符串
    fgets(bufferEncrypt, BUFFER_SIZE, stdin);
    bufferEncrypt[strlen(bufferEncrypt)-1] = '\0';
    printf("Before Encrypted: %s\n", bufferEncrypt);
    unsigned char *ciphertext = base64Encrypt(bufferEncrypt, strlen(bufferEncrypt));
    printf("After Encrypted: %s\n", ciphertext);//輸出加密後的字符串
    printf("---------------------------------------------------------\n");
    printf("Please input the string needed to be decrypted:\n");//輸入需要解密的字符串
    fgets(bufferDecrypt, BUFFER_SIZE, stdin);
    bufferDecrypt[strlen(bufferDecrypt)-1] = '\0';
    printf("Before Decrypted: %s\n", bufferDecrypt);
    unsigned char *plaintext = base64Decrypt(bufferDecrypt, strlen(bufferDecrypt));
    printf("After Decrypted: %s\n", plaintext);//輸出解密後的字符串
    return 0;
}

六、Base64加密解密的相關安全問題

儘管Base64加密具有更好的通用性和可移植性,但它也存在一些安全性弱點。首先,由於Base64加密具有眾所周知的算法,所以逆向破解一般十分容易。其次,由於Base64編碼後的字符串長度與原始的二進制數據長度相比增加了約1/3,從而也增加了數據傳輸的帶寬和時間開銷。

但如果對需要傳輸的實際數據進行再加密或哈希等安全處理操作並結合Base64加密技術綜合使用,可以增強數據的安全性,減少泄密的可能性,實現更加安全的數據傳輸。

原創文章,作者:CHPMT,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/370768.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
CHPMT的頭像CHPMT
上一篇 2025-04-22 01:14
下一篇 2025-04-22 01:14

相關推薦

  • Java Bean加載過程

    Java Bean加載過程涉及到類加載器、反射機制和Java虛擬機的執行過程。在本文中,將從這三個方面詳細闡述Java Bean加載的過程。 一、類加載器 類加載器是Java虛擬機…

    編程 2025-04-29
  • AES加密解密算法的C語言實現

    AES(Advanced Encryption Standard)是一種對稱加密算法,可用於對數據進行加密和解密。在本篇文章中,我們將介紹C語言中如何實現AES算法,並對實現過程進…

    編程 2025-04-29
  • 如何使用Python執行Shell命令並獲取執行過程信息

    本文將介紹如何使用Python執行Shell命令並獲取執行過程信息。我們將從以下幾個方面進行闡述: 一、執行Shell命令 Python內置的subprocess模塊可以方便地執行…

    編程 2025-04-28
  • Python調用C代碼過程用法介紹

    本文將從多個方面詳細闡述Python調用C代碼的過程,包括相關的知識點、實例代碼以及注意事項等內容。 一、概述 Python作為一門高級語言,在很多情況下不能滿足開發人員的需求。此…

    編程 2025-04-27
  • Python自動搶購代碼實現過程

    本文將詳細介紹使用Python實現自動搶購的代碼實現過程。 一、安裝selenium庫 Selenium是一個自動化測試框架,可以在瀏覽器中模擬用戶操作,可以用來實現自動搶購。 首…

    編程 2025-04-27
  • Linux sync詳解

    一、sync概述 sync是Linux中一個非常重要的命令,它可以將文件系統緩存中的內容,強制寫入磁盤中。在執行sync之前,所有的文件系統更新將不會立即寫入磁盤,而是先緩存在內存…

    編程 2025-04-25
  • 神經網絡代碼詳解

    神經網絡作為一種人工智能技術,被廣泛應用於語音識別、圖像識別、自然語言處理等領域。而神經網絡的模型編寫,離不開代碼。本文將從多個方面詳細闡述神經網絡模型編寫的代碼技術。 一、神經網…

    編程 2025-04-25
  • Linux修改文件名命令詳解

    在Linux系統中,修改文件名是一個很常見的操作。Linux提供了多種方式來修改文件名,這篇文章將介紹Linux修改文件名的詳細操作。 一、mv命令 mv命令是Linux下的常用命…

    編程 2025-04-25
  • Python輸入輸出詳解

    一、文件讀寫 Python中文件的讀寫操作是必不可少的基本技能之一。讀寫文件分別使用open()函數中的’r’和’w’參數,讀取文件…

    編程 2025-04-25
  • nginx與apache應用開發詳解

    一、概述 nginx和apache都是常見的web服務器。nginx是一個高性能的反向代理web服務器,將負載均衡和緩存集成在了一起,可以動靜分離。apache是一個可擴展的web…

    編程 2025-04-25

發表回復

登錄後才能評論