單向加密 對稱加密 非對稱加密


單向加密:

    單向加密又稱為不可逆加密算法,在加密過程中不使用密鑰,明文由系統加密處理成密文,密文無法解密。一般適合於驗證,在驗證過程中,重新輸入明文,並經過同樣的加密算法處理,得到相同的密文並被系統重新認證。廣泛使用於口令加密。

  一:base64

    常見於郵件、http加密,截取http信息,你就會發現登錄操作的用戶名、密碼字段通過BASE64加密的。

    主要就是BASE64Encoder、BASE64Decoder兩個類

    BASE加密后產生的字節位數是8的倍數,如果不夠位數以=符號填充

   二:md5

     message-digest algorithm 5 

  三:Crypt加密:

    1.crypt()接受兩個參數,第一個為需要加密的字符串,第二個為鹽值(就是加密干擾值,如果沒有提供,則默認由PHP自動生成);返回散列后的字符串或一個少於 13 字符的字符串,后者為了區別鹽值。

    2.crypt()為單向加密,跟md5一樣。

  四:Sha1加密:

    

string sha1 ( string str[,boolraw_output = false ]

1.跟md5很像,不同的是sha1()默認情況下返回40個字符的散列值,傳入參數性質一樣,第一個為加密的字符串,第二個為raw_output的布爾值,默認為false,如果設置為true,sha1()則會返回原始的20 位原始格式報文摘要

2.sha1()也是單行加密,沒有逆向解密算法

   五:Urlencode加密:
    

string urlencode ( string $str )

1.一個參數,傳入要加密的字符串(通常應用於對URL的加密),

2.urlencode為雙向加密,可以用urldecode來加密(嚴格意義上來說,不算真正的加密)

3.返回字符串,此字符串中除了 -_. 之外的所有非字母數字字符都將被替換成百分號(%)后跟兩位十六進制數,空格則編碼為加號(+)。

  
 
 
  對稱加密:
 
    采用單鑰 密碼系統的加密方法,同一個 密鑰可以同時用作信息的加密和解密,這種加密方法稱為對稱加密,也稱為單密鑰加密。
  優缺點:

    對稱加密算法的優點是算法公開、計算量小、加密速度快、加密效率高。

    對稱加密算法的缺點是在數據傳送前,發送方和接收方必須商定好秘鑰,然后使雙方都能保存好秘鑰。其次如果一方的秘鑰被泄露,那么加密信息也就不安全了。另外,每對用戶每次使用對稱加密算法時,都需要使用其他人不知道的唯一秘鑰,這會使得收、發雙方所擁有的鑰匙數量巨大,密鑰管理成為雙方的負擔。

  非對稱加密:

  先說非對稱加密  .  直接理解為   2把鑰匙.  分別叫 公鑰  私鑰一把加密,另一把解密.   (每把都可用於加密,但是對應的那把才能解密)

  比如. 一間屋子,有2個門 ,對應2把不同的鑰匙. 規則是,前門進,后門出或是后門前,前門出. 
如果從前門進,只能使用前門鑰匙進.  出去的話從后門出,只能使用后門鑰匙.   
如果后門進,就得用后門鑰匙.出去走前門,只能用前門鑰匙出. 
那么PHP如何得到這兩把鑰匙呢,,,,php中,借助openssl實現.首先確定一下是否支持  phpinfo中 搜索 openssl 如果出現下圖說明成功支持,本文建議在linux下測試

在生成鑰匙之前先要了解一個概念   1個是鑰匙文件(里面是鑰匙字符串) . 1個是鑰匙對象.(專門用於各種操作,理解為實例化后使用)
生成文件 代碼如下

 1 <?php 
 2 //第一步,生成一把新鑰匙對象這是私鑰對象
 3 $key = openssl_pkey_new(); 
 4 //第二步,把生成的私鑰,保存成私鑰文件 
 5 openssl_pkey_export_to_file($key, './private.txt'); 
 6 //下面這句注視的意思是,從現有的私鑰文件,獲取到私鑰對象
 7 //$key = openssl_get_privatekey(file_get_contents( './private.txt'));
 8 //從私鑰中,獲取公鑰字符串  后面['key']的意思是從這個數組中直接獲取該鍵
 9 $key_detail = openssl_pkey_get_details($key)['key'];
10 //把公鑰字符串,保存成文件 
11 file_put_contents('./public.txt', $key_detail);
12 echo '完成';

刷新生成成功后.如圖

到此.鑰匙獲取完畢. 下一篇講加密
可以借助linux中的 ssh_keygen命令來生成 代碼如下

 1 ssh-keygen -t rsa -N '' -f ./key -q 

上面代碼中  
-t是指類型  rsa
-N ''不需要密碼
-f 指定生成的私鑰文件 是當前目錄下的key
-q 不需要廢話.直接生成

執行完后當前目錄 會生成一個key 和一個key.pub  這兩個文件 對應的也是公鑰和私鑰


注意  php源碼中這樣定義

1 enum php_openssl_key_type {
2         OPENSSL_KEYTYPE_RSA,
3         OPENSSL_KEYTYPE_DSA, 
4         OPENSSL_KEYTYPE_DH,
5         OPENSSL_KEYTYPE_DEFAULT = OPENSSL_KEYTYPE_RSA
6 };

可以看出.加密方式有rsa  dsa  dh   默認是rsa

 1 <?php 
 2 //第一步,取出私鑰。 
 3 $private_key=openssl_get_privatekey(file_get_contents('./private.txt'));
 4 //第二步,取出公鑰,2種方式 ,一種是從文件中取,如下
 5 //$public_key=openssl_get_publickey(file_get_contents('./public.txt'));
 6 //另一種是,從私鑰里面取 ,理論上內存中計算要比文件中獲取要快,兩種方法任選其一
 7 $public_key=openssl_get_publickey(openssl_pkey_get_details($private_key)['key']);
 8 //原字符串
 9 $origin_str='中英文Abc+123';
10 //使用公鑰k加密函數進行加密,第一個參數原文,第二個參數是結果。 第三個參數是 公鑰對象 (私鑰對象會報錯)
11 openssl_public_encrypt($origin_str, $crypted, $public_key); 
12 //var_dump($crypted是亂碼);
13 //使用公鑰加密后。只能使用私鑰解密函數進行解密,注意第三個參數是私鑰對象
14 openssl_private_decrypt($crypted, $decrypted, $private_key); 
15 //var_dump($decrypted)得到了原文 
16 //也可以 相反的操作。 私鑰加密,公鑰解密。如下
17 openssl_private_encrypt($origin_str, $crypted, $private_key);
18 openssl_public_decrypt($crypted, $result, $public_key);
19 //vardump($result)也是原文

一般實際應用中,其中一個頁面加密后.傳給另一個頁面密文.然后通過密文進行解密.然后得到結果. 

注意,公鑰加密,需要私鑰解密
或是 私鑰加密,公鑰解密.   
另外.公鑰函數只能使用公鑰對象. 私鑰相同.
還記得之前說過.私鑰中提取公鑰嗎?所以說.最好使用公鑰加密,以免傳送過程被攔截私鑰

 

 

自己的代碼:

 1 <?php
 2 //生成私鑰文件
 3 //$key=openssl_pkey_new();
 4 //openssl_pkey_export_to_file($key,'./1.txt');
 5 
 6 //從文件中提取
 7 //$key=openssl_get_privatekey(file_get_contents('./1.txt'));
 8 //$key_dets=openssl_pkey_get_details($key)['key'];
 9 //
10 //file_put_contents('./2.txt',$key_dets);
11 
12 
13 //第一步 提取私鑰
14 $privatekey=openssl_get_privatekey(file_get_contents('./1.txt'));
15 //第二步 取出公鑰 2種方法 一種文件中取
16 $putkey=openssl_get_publickey(file_get_contents('./5.txt'));
17 
18 //另一種從私鑰文件中取
19 //$putkey=openssl_get_publickey(openssl_pkey_get_details($privatekey)['key']);
20 //原字符串
21 //var_dump($privatekey,$putkey);
22 
23 $orign_str='中文';
24 openssl_public_encrypt($orign_str,$crypted,$putkey);
25 //var_dump($crypted);
26 openssl_private_decrypt($crypted,$decrypted,$privatekey);
27 var_dump($decrypted);
28 ?>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM