摘要:常見的對稱加密算法有等,它們的復雜程度也各不相等。還有一點就是,請慎重使用那些不公開的加密算法,畢竟這些公開算法相對經得起考驗。
傳遞甜甜蜜蜜小紙條在互聯網如此發達的年代,信息的安全也變得越來越重要,我們也使用了各式各樣的加密手段來保護數據的安全,但是各種加密算法你真的了解它么?他們的原理又是什么呢?
常見的加密分為對稱加密、非對稱加密還有散列算法(嚴格來說,散列不算加密),這篇文章我們來了解一下對稱加密
穿越到初中的你,憑借著程序員"高貴"的氣息成功的和一個小女生"勾搭"上了。
然而在那個不是誰都有手機的年代,上課的時候想和她傳遞信息,貌似只能寫在紙上,然后借助同學之手,慢慢傳遞。最關鍵的是,萬一某個同學好奇心太重偷偷看到你們的"甜甜蜜蜜",你也許會不太爽吧?
作為一個從未來穿越回來的程序員,你立馬在周末的時候買了兩本班上誰都沒有的大字典(康熙字典),從此你倆的小紙條上出現的是如下的內容:
123:5 564:3 11:8 665:2 123:3 456:6 789:2...
123(代表頁碼):5(代表行)
從此之后,妹子再也不理你了(查字典太TM麻煩!)。。。
當然藏頭詩也可以看做一種加密手段,前提是:你會寫詩。。。
對稱加密簡單來說就是使用同一密鑰加密和解密內容,雙方使用的密鑰必須是相同的(其他任何人都不知道),這樣才能保證內容的安全(正如上面的傳遞小紙條)。
常見的對稱加密算法有DES、3DES、AES、Blowfish等,它們的復雜程度也各不相等。
那么在計算機中如何做到類似上面小紙條的加密手段呢?
ASCII大家應該都熟悉,通過7位或者8位來表示一個字符,比如65表示字符A,66表示字符B,對應的二進制形式為:
字符 | 二進制形式 |
---|---|
A | 01000001 |
B | 01000010 |
0 ^ 0 = 0; 0 ^ 1 = 1; 1 ^ 0 = 1; 1 ^ 1 = 0;
相同異或等于0,不同為1,然后我們把^和=對換一下:
0 = 0 ^ 0; 0 = 1 ^ 1; 1 = 0 ^ 1; 1 = 1 ^ 0;
依然成立,為了更形象的說明,我們把上面的等式假設為:A ^ B = C
我們只要把結果C與B進行異或運算就會得到結果A,對稱加密的精髓就在這里!
//這是我們的加密key $key = "[Lvn[o]6e{y=q#82]G.]rDzv.j"; $keyLen = strlen($key); //準備加密的內容 $string = "大家好,歡迎關注假裝是個程序員!"; //被加密的內容長度 $stringLen = strlen($string); //如果加密key沒有內容長,那么我們不斷重復key,直到大于等于被加密內容(當然在實際使用中,這不是個好方法) if($keyLen < $stringLen) { $key = str_pad($key, $stringLen, $key); } $content = ""; //每個字節與對應的key做異或運算 for($i = 0; $i < $stringLen; $i++) { $content .= chr(ord($string[$i]) ^ ord($key[$i])); } //這個就是我們加密后的密文 var_dump($content); //輸出:string(48) "??ы????????????????????????????????????" //為了提高可讀性,一般會將加密后的字符通過base64編碼 var_dump(base64_encode($content)); //輸出:string(64) "vujRi/XZuJPYlMWxl4+a2uLJy9jBosney+vcpNXrvffy0t3RnpX6xoK9uNa2ss7F" //解密 $string = ""; for($i = 0; $i < $stringLen; $i++) { $string .= chr(ord($content[$i]) ^ ord($key[$i])); } var_dump($string); //輸出:string(48) "大家好,歡迎關注假裝是個程序員!"
上面的加密和解密其實是完全一樣的算法,我這里只是為了演示,重復了一遍。
就這樣我們輕輕松松就把我們的數據加密了,那么文件可以通過這種方式加密嗎?當然可以,畢竟計算機里面儲存的都是比特位,我下面給做一個簡單的例子看一下。
這個是加密前的圖片
這張圖用來做加密key
加密算法幾乎和上面一致:
$file = "/Users/zhjx922/Downloads/jiami.jpg"; $string = file_get_contents($file); //被加密內容長度 $stringLen = strlen($string); $file = "/Users/zhjx922/Downloads/jiami2.jpg"; $key = file_get_contents($file); //key長度 $keyLen = strlen($key); //如果加密key沒有內容長,那么我們不斷重復key,直到大于等于被加密內容(當然在實際使用中,這不是個好方法) if($keyLen < $stringLen) { $key = str_pad($key, $stringLen, $key); } $content = ""; for($i = 0; $i < $stringLen; $i++) { $content .= chr(ord($string[$i]) ^ ord($key[$i])); } file_put_contents("jiami_content.jpg", $content); $string = file_get_contents("jiami_content.jpg"); $content = ""; for($i = 0; $i < $stringLen; $i++) { $content .= chr(ord($string[$i]) ^ ord($key[$i])); } file_put_contents("jiami_yuantu.jpg", $content);
其中jiami_content.jpg為加密后的圖片,但是根本打不開,這也說明這不是一個好的加密方法(因為不太了解jpg格式是如何儲存的,如果你了解jpg的結構,調整算法,應該可以輸出一張和原圖完全不一樣的圖片)
而jiami_yuantu.jpg為解密后的圖片,可以打開,完全和原圖一樣。
這幾天看了一下DES和3DES的算法原理(原理看似挺簡單),但是對應的算法實現沒有看太明白,之后如有突破,會多帶帶寫篇文章分享。
還有一點就是,請慎重使用那些不公開的加密算法,畢竟這些公開算法相對經得起考驗。前兩天我在公司的代碼庫中看到一段加密函數,看似寫的很高深,仔細讀了一下,發現加密后的內容幾乎不攻自破。。。
歡迎關注我的公眾號,交流學習
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/11224.html
摘要:前言總括原文博客地址協議之數據加密過程詳解知乎專欄簡書專題前端進擊者知乎前端進擊者簡書博主博客地址的個人博客生活只要你聽過,不可能沒聽過協議吧,協議是一種安全協議。 前言 總括: 原文博客地址:SSL協議之數據加密過程詳解 知乎專欄&&簡書專題:前端進擊者(知乎)&&前端進擊者(簡書) 博主博客地址:Damonare的個人博客 生活 SSL 只要你聽過HTTPS,不可能沒聽過...
摘要:算法公鑰加密算法是年由羅納德李維斯特阿迪薩莫爾和倫納德阿德曼一起提出的。是目前最有影響力的公鑰加密算法,它能夠抵抗到目前為止已知的絕大多數密碼攻擊,已被推薦為公鑰數據加密標準。 上篇文章介紹了對稱加密的原理,但是它的最大問題就是加密和解密的密鑰是相同的,并且不能保證密鑰能安全的送到雙方手里,即使安全的送到雙方手里,免不了內部會有臥底的存在 非對稱加密 既然有對稱加密,那么自然會聯想到非...
摘要:假如黎曼猜想被證實,區塊鏈將毀滅近日,黎曼猜想四個字瘋狂刷屏。黎曼猜想由數學家波恩哈德黎曼于年提出。因此,黎曼猜想一旦被證明,則意味著素數之密被解開,算法也就將被攻破了。而大多數區塊鏈所用的加密算法不是,而是橢圓曲線加密算法。 瑪麗女王的密碼之生死命懸一線 showImg(https://segmentfault.com/img/bVbhD7s?w=740&h=876); 16世紀伊麗...
摘要:所謂對稱加密,就是加密和解密使用同一秘鑰,這也是這種加密算法最顯著的缺點之一。非對稱加密算法由于對稱加密在通信加密領域的缺陷,年和提出了非對稱加密的概念。非對稱加密,其主要缺點之一就是慢,適合加密少量數據。 1. 加密的目的 加密不同于密碼,加密是一個動作或者過程,其目的就是將一段明文信息(人類或機器可以直接讀懂的信息)變為一段看上去沒有任何意義的字符,必須通過事先約定的解密規則才能將...
閱讀 1399·2021-09-02 09:53
閱讀 2667·2021-07-29 13:50
閱讀 1715·2019-08-30 11:07
閱讀 1571·2019-08-30 11:00
閱讀 1450·2019-08-29 14:00
閱讀 1844·2019-08-29 12:52
閱讀 2560·2019-08-29 11:11
閱讀 3415·2019-08-26 12:23