tft每日頭條

 > 生活

 > 加密算法對稱和非對稱

加密算法對稱和非對稱

生活 更新时间:2025-02-09 13:44:42

在互聯網如此發達的年代,信息的安全也變得越來越重要,我們也使用了各式各樣的加密手段來保護數據的安全,但是各種加密算法你真的了解它麼?他們的原理又是什麼呢?常見的加密分為對稱加密、非對稱加密還有散列算法(嚴格來說,散列不算加密),這篇文章我們來了解一下對稱加密

傳遞甜甜蜜蜜小紙條

穿越到初中的你,憑借着程序員"高貴"的氣息成功地和一個小女生"勾搭"上了。然而在那個不是誰都有手機的年代,上課的時候想和她傳遞信息,貌似隻能寫在紙上,然後借助同學之手,慢慢傳遞。最關鍵的是,萬一某個同學好奇心太重偷偷看到你們的"甜甜蜜蜜",你也許會不太爽吧?作為一個從未來穿越回來的程序員,你立馬在周末的時候買了兩本班上誰都沒有的大字典(康熙字典),從此你倆的小紙條上出現的是如下的内容:

123:5 564:3 11:8 665:2 123:3 456:6 789:2...

123(代表頁碼):5(代表行)

從此之後,妹子再也不理你了(查字典太TM麻煩!)。。。當然藏頭詩也可以看做一種加密手段,前提是:你會寫詩。。。

對稱加密

對稱加密簡單來說就是使用同一密鑰加密和解密内容,雙方使用的密鑰必須是相同的(其他任何人都不知道),這樣才能保證内容的安全(正如上面的傳遞小紙條)。常見的對稱加密算法有DES、3DES、AES、Blowfish等,它們的複雜程度也各不相等。那麼在計算機中如何做到類似上面小紙條的加密手段呢?

ASCII編碼

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,對稱加密的精髓就在這裡!

PHP實現一個最簡單的對稱加密算法

//這是我們的加密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) "大家好,歡迎關注假裝是個程序員!"

上面的加密和解密其實是完全一樣的算法,我這裡隻是為了演示,重複了一遍。就這樣我們輕輕松松就把我們的數據加密了,那麼文件可以通過這種方式加密嗎?當然可以,畢竟計算機裡面儲存的都是比特位,我下面給做一個簡單的例子看一下。

加密一張圖片

加密算法對稱和非對稱(加密算法之對稱加密)1

這個是加密前的圖片

加密算法對稱和非對稱(加密算法之對稱加密)2

這張圖用來做加密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、AES等算法

這幾天看了一下DES和3DES的算法原理(原理看似挺簡單),但是對應的算法實現沒有看太明白,之後如有突破,會單獨寫篇文章分享。還有一點就是,請慎重使用那些不公開的加密算法,畢竟這些公開算法相對經得起考驗。前兩天在公司的代碼庫中看到一段加密函數,看似寫得很高深,仔細讀了一下,發現加密後的内容幾乎不攻自破。。。

,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关生活资讯推荐

热门生活资讯推荐

网友关注

Copyright 2023-2025 - www.tftnews.com All Rights Reserved