【Java小工匠】密碼學--base64編碼
1、Base64 概述
1.1 什麼是Base64編碼
可以將任意的位元組陣列資料,通過演算法,生成只有(大小寫英文、數字、+、/)(一共64個字元)內容表示的字串資料。即將任意的內容轉換為可見的字串形式。
1.2、Base64 編碼表
1.3、Base64 演算法由來
以前傳送郵件只支援可見字元的傳送。由此,需要有一個方法將不可見的字元轉換為可見的字元,便產生了Base64編碼演算法。
1.4、Base64 與 加密關係
(1)Base 64不是加密演算法,是一種編碼解碼演算法,通過Base64編碼的資料,可以解碼回來。
(2) 如果把Base64 一定要把Base64 理解為加密演算法的話,Base64 是公佈金鑰的加密演算法。加密原則:公佈演算法,但是不公佈金鑰
2、Base64 編碼演算法
2.1 編碼規則
(1)將資料按照 3個位元組一組的形式進行處理,每三個位元組在編碼之後被轉換為4個位元組。(即:如果一個資料有6個位元組,可編碼後將包含6/3*4=8個位元組)
(2)當資料的長度無法滿足3的倍數的情況下,最後的資料需要進行填充操作,即補“=” ,這裡“=”是填充字元,不要理解為第65個字元
2.2 編碼過程
(1) 將原始資料3個一組,按位進行分割為 每6位一個位元組的形式,進行轉換,形成新的4個位元組。這四個位元組才通過Base64編碼表進行對映,形成最後實際的Base64編碼結果。
(2)如果原始資料最後無法湊成3個位元組,則補填充,以“=”作為替換,代表沒有資料。
3、Base64 演算法應用
(1) Base64 JSON 二進位制資料
伺服器給客戶端在JSON中傳遞二進位制資料
(2) Base64 圖片編碼
部分小圖片使用Base64進行儲存。
(3)Base64 在URL中的應用
Base64 在URL編碼應用時,由於'+' 和 '-' 會被瀏覽器進行轉義,因此使用'-','_' 替換,在common codec的實現用,有將提供相應的方法。
(4)Base64編碼字元顯示回車換行
Base64編碼,內容非常多時,common codec實現中,可以在生成Base64字串是,長多超過指定字串(預設76個字串)在生成的Base64字串中加入換行符(預設'\r\n')
4、演算法實現
4.1 JDK 實現
package lzf.cipher.jdk;
import java.util.Base64;
/**
* @author Java小工匠
*/
public class JdkBase64Utils {
// base64 編碼
public static String base64Encoder(byte[] bytes) {
return Base64.getEncoder().encodeToString(bytes);
}
// base64 解碼
public static byte[] base64Decode(byte[] src) {
return Base64.getDecoder().decode(src);
}
// base64 解碼
public static String base64DecodeToStr(byte[] src) {
return new String(base64Decode(src));
}
public static void main(String[] args) {
String base64 = base64Encoder("java小工匠".getBytes());
System.out.println("編碼:" + base64);
String str = base64DecodeToStr(base64.getBytes());
System.out.println("解碼:" + str);
}
}
4.2 CC 實現
package lzf.cipher.cc;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.codec.binary.StringUtils;
/**
* @author Java小工匠
*/
public class CCBase64Utils {
// base64 編碼
public static String base64Encoder(byte[] bytes) {
return Base64.encodeBase64String(bytes);
}
// base64 解碼
public static byte[] base64Decode(byte[] src) {
return Base64.decodeBase64(src);
}
// base64 解碼
public static String base64DecodeToStr(byte[] src) {
return new String(base64Decode(src));
}
// CC base64編碼,編碼長度超過76個字元,新增\r\n 字元進行換行
public static String base64EncodeToChunkedStr(byte[] data) {
byte[] bytes = Base64.encodeBase64(data, true);
return StringUtils.newStringUsAscii(bytes);
}
// 使用'-' 和 '_' 下劃線替換Base64 編碼中的 '+' 和 '/',解決 URL傳輸問題
public static String base64EncodeToURLSafeString(byte[] data) {
return Base64.encodeBase64URLSafeString(data);
}
public static void main(String[] args) {
String base64 = base64Encoder("java小工匠".getBytes());
System.out.println("編碼:" + base64);
String str = base64DecodeToStr(base64.getBytes());
System.out.println("解碼:" + str);
String strNewLine = "如果base64超過76個字元,Base64編碼就會產生換行,預設新增\r\n符號!";
String ccBase64Chunked = base64EncodeToChunkedStr(strNewLine.getBytes());
System.out.println(ccBase64Chunked);
System.out.println("========================");
String strUrl = "URLBase64編碼,使用'-'和'_'替換'+'和'/'";
String ccBBase64Url = base64EncodeToURLSafeString(strUrl.getBytes());
System.out.println(ccBBase64Url);
}
}
4.3 BC 實現
package lzf.cipher.bc;
import org.bouncycastle.util.encoders.Base64;
/**
* @author Java小工匠
*/
public class BCBase64Utils {
// base64 編碼
public static String base64Encoder(byte[] bytes) {
return Base64.toBase64String(bytes);
}
// base64 解碼
public static byte[] base64Decode(byte[] src) {
return Base64.decode(src);
}
// base64 解碼
public static String base64DecodeToStr(byte[] src) {
return new String(base64Decode(src));
}
public static void main(String[] args) {
String base64 = base64Encoder("java小工匠".getBytes());
System.out.println("編碼:" + base64);
String str = base64DecodeToStr(base64.getBytes());
System.out.println("解碼:" + str);
}
}
如果讀完覺得有收穫的話,歡迎點贊、關注、加公眾號【小工匠技術圈】
個人公眾號,歡迎關注,查閱更多精彩歷史!
相關文章
- 【Java小工匠聊密碼學】–對稱加密–概述Java密碼學加密
- Java之Base64編碼解析Java
- Java 8中的Base64編碼和解碼Java
- Java Base64編碼使用介紹Java
- Base64編碼
- android Java BASE64編碼和解碼一:基礎AndroidJava
- Base64 編碼解碼原理
- 【字元編碼】字元編碼 && Base64編碼演算法字元演算法
- base64 編碼原理
- 從原理上搞定編碼-- Base64編碼
- Go ARM64 Base64編碼優化小記Go優化
- Base64編碼與解碼程式碼例項
- 計算機編碼規則之:Base64編碼計算機
- 【字元編碼系列】Base64編碼原理以及實現字元
- java base64編碼 加密和解密(切記注意亂碼問題)Java加密解密
- [譯] 學習 Spring Security(六):密碼編碼Spring密碼
- netty系列之:java中的base64編碼器NettyJava
- 用JS進行Base64編碼、解碼JS
- CryptoAPI 對資料Base64編碼解碼API
- Rust中字串的base64編碼與解碼Rust字串
- PHP安全的URL字串base64編碼和解碼PHP字串
- C#實現Base64編碼與解碼
- JS 簡單實現UTF-8編碼,Base64編碼JS
- Python 工匠:編寫條件分支程式碼的技巧Python
- rust實戰系列-base64編碼Rust
- Base64編碼知識詳解
- base64編碼原理和函式函式
- Base64編碼的全面介紹
- Base64系列第二篇 python中使用Base64編碼解碼Python
- 當微信小程式遇上TensorFlow:接收base64編碼影象資料微信小程式
- 應用密碼學——古典密碼密碼學
- 密碼學密碼學
- 《密碼學系列》|| 密碼學中的流密碼是怎麼回事?密碼學
- Base64自定義編碼表及破解
- base64編碼的原理及實現
- 深入瞭解圖片Base64編碼
- 應用密碼學 - 公鑰密碼密碼學
- 應用密碼學——分組密碼密碼學