Base64是網路上最常見的用於傳輸8Bit位元組碼的編碼方式之一,Base64就是一種基於64個可列印字元來表示二進制數據的方法。
1,Base64使用US-ASCII子集的64個字元,即大小寫的26個英文字母,0-9,+,/。
2,編碼總是基於3個字元,每個字元用8位二進製表示,因此一共24位,再分為4四組,每組6位,表示一個Base64的值。
3,Base64值為0就是A,為27的就是b。這樣,每3個字元產生4位的Base64字元。如果被加密的字元串每3個一組,還剩1或2個字元,使用特殊字元"="補齊Base64的4字。
(1)base128演算法擴展閱讀:
應用
Base64編碼可用於在HTTP環境下傳遞較長的標識信息。例如,在Java Persistence系統Hibernate中,就採用了Base64來將一個較長的一個標識符(一般為128-bit的UUID)編碼為一個字元串,用作HTTP表單和HTTP GET URL中的參數。
在其他應用程序中,也常常需要把二進制數據編碼為適合放在URL(包括隱藏表單域)中的形式。此時,採用Base64編碼不僅比較簡短,同時也具有不可讀性,即所編碼的數據不會被人用肉眼所直接看到。
然而,標準的Base64並不適合直接放在URL里傳輸,因為URL編碼器會把標准Base64中的「/」和「+」字元變為形如「%XX」的形式,而這些「%」號在存入資料庫時還需要再進行轉換。
因為ANSI SQL中已將「%」號用作通配符。
為解決此問題,可採用一種用於URL的改進Base64編碼,它不僅在末尾去掉填充的'='號,並將標准Base64中的「+」和「/」分別改成了「-」和「_」。
這樣就免去了在URL編解碼和資料庫存儲時所要作的轉換,避免了編碼信息長度在此過程中的增加,並統一了資料庫、表單等處對象標識符的格式。
另有一種用於正則表達式的改進Base64變種,它將「+」和「/」改成了「!」和「-」,因為「+」,「/」以及前面在IRCu中用到的「[」和「]」在正則表達式中都可能具有特殊含義。
此外還有一些變種,它們將「+/」改為「_-」或「._」(用作編程語言中的標識符名稱)或「.-」(用於XML中的Nmtoken)甚至「_:」(用於XML中的Name)。
❷ 2.哈希加密 & base64加密
一、哈希HASH
哈希(散列)函數 MD5 SHA1/256/512 HMAC
Hash的特點:
1.演算法是公開的
2.對相同數據運算,得到的結果是一樣的
3.對不同數據運算,如MD5得到的結果是128位,32個字元的十六進製表示,沒法逆運算
1.MD5加密
MD5加密的特點:
不可逆運算
對不同的數據加密的結果是定長的32位字元(不管文件多大都一樣)
對相同的數據加密,得到的結果是一樣的(也就是復制)。
抗修改性 : 信息「指紋」,對原數據進行任何改動,哪怕只修改一個位元組,所得到的 MD5 值都有很大區別.
弱抗碰撞 : 已知原數據和其 MD5 值,想找到一個具有相同 MD5 值的數據(即偽造數據)是非常困難的.
強抗碰撞: 想找到兩個不同數據,使他們具有相同的 MD5 值,是非常困難的
MD5 應用:
一致性驗證:MD5將整個文件當做一個大文本信息,通過不可逆的字元串變換演算法,產生一個唯一的MD5信息摘要,就像每個人都有自己獨一無二的指紋,MD5對任何文件產生一個獨一無二的數字指紋。
那麼問題來了,你覺得這個MD5加密安全嗎?其實是不安全的,不信的話可以到這個網站試試:md5破解網站。可以說嗖地一下就破解了你的MD5加密!
2.SHA加密
安全哈希演算法(Secure Hash Algorithm)主要適用於數字簽名標准(Digital Signature Standard DSS)裡面定義的數字簽名演算法(Digital Signature Algorithm DSA)。對於長度小於2^64位的消息,SHA1會產生一個160位的消息摘要。當接收到消息的時候,這個消息摘要可以用來驗證數據的完整性。在傳輸的過程中,數據很可能會發生變化,那麼這時候就會產生不同的消息摘要。當讓除了SHA1還有SHA256以及SHA512等。
二、base64加密
1.Base64說明
描述:Base64可以成為密碼學的基石,非常重要。
特點:可以將任意的二進制數據進行Base64編碼
結果:所有的數據都能被編碼為並只用65個字元就能表示的文本文件。
65字元:A~Z a~z 0~9 + / =
對文件進行base64編碼後文件數據的變化:編碼後的數據~=編碼前數據的4/3,會大1/3左右。
2.命令行進行Base64編碼和解碼
編碼:base64 123.png -o 123.txt
解碼:base64 123.txt -o test.png -D
2.Base64編碼原理
1)將所有字元轉化為ASCII碼;
2)將ASCII碼轉化為8位二進制;
3)將二進制3個歸成一組(不足3個在後邊補0)共24位,再拆分成4組,每組6位;
4)統一在6位二進制前補兩個0湊足8位;
5)將補0後的二進制轉為十進制;
6)從Base64編碼表獲取十進制對應的Base64編碼;
處理過程說明:
a.轉換的時候,將三個byte的數據,先後放入一個24bit的緩沖區中,先來的byte占高位。
b.數據不足3byte的話,於緩沖區中剩下的bit用0補足。然後,每次取出6個bit,按照其值選擇查表選擇對應的字元作為編碼後的輸出。
c.不斷進行,直到全部輸入數據轉換完成。
❸ 密碼學知識精粹
① 替換法
替換法很好理解,就是用固定的信息將原文替換成無法直接閱讀的密文信息。例如將 b 替換成 w ,e 替換成p ,這樣bee 單詞就變換成了wpp,不知道替換規則的人就無法閱讀出原文的含義。
替換法有單表替換和多表替換兩種形式。
② 移位法
移位法就是將原文中的所有字母都在字母表上向後(或向前)按照一個固定數目進行偏移後得出密文,典型的移位法應用有 「 愷撒密碼 」。
例如約定好向後移動2位(abcde - cdefg),這樣 bee 單詞就變換成了dgg。
古典密碼破解方式--頻率分析法
古典密碼的安全性受到了威脅,外加使用便利性較低,到了工業化時代,近現代密碼被廣泛應用。
恩尼格瑪機
恩尼格瑪機是二戰時期納粹德國使用的加密機器,其使用的加密方式本質上還是移位和替代,後被英國破譯,參與破譯的人員有被稱為計算機科學之父、人工智慧之父的圖靈。
① 散列函數加密(消息摘要,數字摘要)
散列函數,也見雜湊函數、摘要函數或哈希函數,可將任意長度的消息經過運算,變成固定長度數值,常見的有MD5、SHA-1、SHA256,多應用在文件校驗,數字簽名中。
MD5 可以將任意長度的原文生成一個128位(16位元組)的哈希值
SHA-1可以將任意長度的原文生成一個160位(20位元組)的哈希值
特點:消息摘要(Message Digest)又稱為數字摘要(Digital Digest)
它是一個唯一對應一個消息或文本的固定長度的值,它由一個單向Hash加密函數對消息進行作用而產生
使用數字摘要生成的值是不可以篡改的,為了保證文件或者值的安全
MD5演算法 : 摘要結果16個位元組, 轉16進制後32個位元組
SHA1演算法 : 摘要結果20個位元組, 轉16進制後40個位元組
SHA256演算法 : 摘要結果32個位元組, 轉16進制後64個位元組
SHA512演算法 : 摘要結果64個位元組, 轉16進制後128個位元組
② 對稱加密
對稱密碼應用了相同的加密密鑰和解密密鑰。對稱密碼分為:序列密碼(流密碼),分組密碼(塊密碼)兩種。流密碼是對信息流中的每一個元素(一個字母或一個比特)作為基本的處理單元進行加密,塊密碼是先對信息流分塊,再對每一塊分別加密。
例如原文為1234567890,流加密即先對1進行加密,再對2進行加密,再對3進行加密……最後拼接成密文;塊加密先分成不同的塊,如1234成塊,5678成塊,90XX(XX為補位數字)成塊,再分別對不同塊進行加密,最後拼接成密文。前文提到的古典密碼學加密方法,都屬於流加密。
示例
我們現在有一個原文3要發送給B
設置密鑰為108, 3 * 108 = 324, 將324作為密文發送給B
B拿到密文324後, 使用324/108 = 3 得到原文
常見加密演算法
DES : Data Encryption Standard,即數據加密標准,是一種使用密鑰加密的塊演算法,1977年被美國聯邦政府的國家標准局確定為聯邦資料處理標准(FIPS),並授權在非密級政府通信中使用,隨後該演算法在國際上廣泛流傳開來。
AES : Advanced Encryption Standard, 高級加密標准 .在密碼學中又稱Rijndael加密法,是美國聯邦政府採用的一種區塊加密標准。這個標准用來替代原先的DES,已經被多方分析且廣為全世界所使用。
特點
加密速度快, 可以加密大文件
密文可逆, 一旦密鑰文件泄漏, 就會導致數據暴露
加密後編碼表找不到對應字元, 出現亂碼,故一般結合Base64使用
加密模式
ECB : Electronic codebook, 電子密碼本. 需要加密的消息按照塊密碼的塊大小被分為數個塊,並對每個塊進行獨立加密
優點 : 可以並行處理數據
缺點 : 同樣的原文生成同樣的密文, 不能很好的保護數據
CBC : Cipher-block chaining, 密碼塊鏈接. 每個明文塊先與前一個密文塊進行異或後,再進行加密。在這種方法中,每個密文塊都依賴於它前面的所有明文塊
優點 : 同樣的原文生成的密文不一樣
缺點 : 串列處理數據
填充模式:當需要按塊處理的數據, 數據長度不符合塊處理需求時, 按照一定的方法填充滿塊長的規則
NoPadding不填充.
對應的AES加密類似,但是如果使用的是AES加密,那麼密鑰必須是16個位元組。
加密模式和填充模式:
AES/CBC/NoPadding (128)
AES/CBC/PKCS5Padding (128)
AES/ECB/NoPadding (128)
AES/ECB/PKCS5Padding (128)
DES/CBC/NoPadding (56)
DES/CBC/PKCS5Padding (56)
DES/ECB/NoPadding (56)
DES/ECB/PKCS5Padding (56)
DESede/CBC/NoPadding (168)
DESede/CBC/PKCS5Padding (168)
DESede/ECB/NoPadding (168)
DESede/ECB/PKCS5Padding (168)
RSA/ECB/PKCS1Padding (1024, 2048)
RSA/ECB/OAEPWithSHA-1AndMGF1Padding (1024, 2048)
RSA/ECB/OAEPWithSHA-256AndMGF1Padding (1024, 2048)
PS: Base64是網路上最常見的用於傳輸8Bit位元組碼的可讀性編碼演算法之一
可讀性編碼演算法不是為了保護數據的安全性,而是為了可讀性
可讀性編碼不改變信息內容,只改變信息內容的表現形式
所謂Base64,即是說在編碼過程中使用了64種字元:大寫A到Z、小寫a到z、數字0到9、「+」和「/」
Base64 演算法原理:base64 是 3個位元組為一組,一個位元組 8位,一共 就是24位 ,然後,把3個位元組轉成4組,每組6位(3 * 8 = 4 * 6 = 24),每組缺少的2位會在高位進行補0 ,這樣做的好處在於 base取的是後面6位而去掉高2位 ,那麼base64的取值就可以控制在0-63位了,所以就叫base64,111 111 = 32 + 16 + 8 + 4 + 2 + 1 =
toString()與new String ()用法區別
③ 非對稱加密
非對稱密碼有兩支密鑰,公鑰(publickey)和私鑰(privatekey),加密和解密運算使用的密鑰不同。用公鑰對原文進行加密後,需要由私鑰進行解密;用私鑰對原文進行加密後(此時一般稱為簽名),需要由公鑰進行解密(此時一般稱為驗簽)。公鑰可以公開的,大家使用公鑰對信息進行加密,再發送給私鑰的持有者,私鑰持有者使用私鑰對信息進行解密,獲得信息原文。因為私鑰只有單一人持有,因此不用擔心被他人解密獲取信息原文。
特點:
加密和解密使用不同的密鑰
如果使用私鑰加密, 只能使用公鑰解密
如果使用公鑰加密, 只能使用私鑰解密
處理數據的速度較慢, 因為安全級別高
常見演算法:RSA,ECC
數字簽名
數字簽名的主要作用就是保證了數據的有效性(驗證是誰發的)和完整性(證明信息沒有被篡改),是非對稱加密和消息摘要的應用
keytool工具使用
keytool工具路徑:C:\Program Files\Java\jre1.8.0_91\bin
--- END
❹ 如何調用openssl 的加解密演算法 進行base64 aes-128
提供個加密函數代碼:
#define MAX_ENCRYPT_LEN 1024
void MyEncrypt(const unsigned char *sMsg, int cbMsg, unsigned char *sEncryptMsg, int &cbEncryptMsg)
{
OpenSSL_add_all_algorithms();
//產生會話密鑰
unsigned char SessionKey[16];
RAND_bytes(SessionKey,16);
//加密
EVP_CIPHER_CTX ctx;
EVP_CIPHER_CTX_init(&ctx);
if(EVP_EncryptInit_ex(&ctx,EVP_get_cipherbynid(NID_aes_128_ecb),NULL,SessionKey,NULL))
{
int offseti=0;
int offseto=0;
int offsett=0;
for(;;)
{
if(cbMsg-offseti<=MAX_ENCRYPT_LEN)
{
EVP_EncryptUpdate(&ctx, sEncryptMsg+offseto, &offsett, sMsg+offseti, cbMsg-offseti);
offseto+=offsett;
break;
}
else
{
EVP_EncryptUpdate(&ctx, sEncryptMsg+offseto, &offsett, sMsg+offseti, MAX_SIGN_MSG);
offseti+=MAX_SIGN_MSG;
offseto+=offsett;
}
}
EVP_EncryptFinal_ex(&ctx, sEncryptMsg+offseto, &offsett);
offseto+=offsett;
cbEncryptMsg=offseto;
}
EVP_CIPHER_CTX_cleanup(&ctx);
}
參數解釋:
const unsigned char *sMsg 需要解密的明文
int cbMsg 明文長度
unsigned char *sEncryptMsg 輸出密文
int &cbEncryptMsg 密文長度
好了,這個函數剛寫的,驗證了一下,是沒有問題的
解密與這個比較類似
❺ 密碼學基礎(二):對稱加密
加密和解密使用相同的秘鑰稱為對稱加密。
DES:已經淘汰
3DES:相對於DES有所加強,但是仍然存在較大風險
AES:全新的對稱加密演算法。
特點決定使用場景,對稱加密擁有如下特點:
速度快,可用於頻率很高的加密場景。
使用同一個秘鑰進行加密和解密。
可選按照128、192、256位為一組的加密方式,加密後的輸出值為所選分組位數的倍數。密鑰的長度不同,推薦加密輪數也不同,加密強度也更強。
例如:
AES加密結果的長度由原字元串長度決定:一個字元為1byte=4bit,一個字元串為n+1byte,因為最後一位為'