利用RSA對前後端加密的探索

假程式設計師發表於2019-02-16

RSA-JS-PHP

專案地址rsa-js-php

前後端互動時為了保證資訊保安可使用RSA方式加密資訊,在資料量大的時候可採用DES+RSA結合方式。DEMO演示地址

一點歷史

1976年以前,所有的加密方法都是同一種模式:
(1)甲方選擇某一種加密規則,對資訊進行加密;
(2)乙方使用同一種規則,對資訊進行解密。由於加密和解密使用同樣規則(簡稱”金鑰”),這被稱為”對稱加密演算法”(Symmetric-key algorithm)。
這種加密模式有一個最大弱點:甲方必須把加密規則告訴乙方,否則無法解密。儲存和傳遞金鑰,就成了最頭疼的問題。
1977年,三位數學家Rivest、Shamir 和 Adleman 設計了一種演算法,可以實現非對稱加密。這種演算法用他們三個人的名字命名,叫做RSA演算法。從那時直到現在,RSA演算法一直是最廣為使用的”非對稱加密演算法”。毫不誇張地說,只要有計算機網路的地方,就有RSA演算法。

演算法原理

  • RSA演算法的主要原理是利用了數論中質數的巧妙關係即尤拉定理,要實現RSA演算法需找到三個具有特定關係的值,在此命名為n e d;
  • 假設有兩個值互為質數的正整數p和q,(為了便於運算演示,取的值比較小,通常情況下是取的非常大的值,值越大破解的難度越大),p=5 q=17 即 p和q的乘積為n=5×17=85;
  • 計算得出n的尤拉函式φ(n)=(p-1)(q-1)=64,在區間(1,64)中隨機選擇一個數e=13,,需保證e和φ(n)為互質關係;
  • 計算e對於φ(n)的模反元素d,得出d=5;至此,已經得到了三個具有特定關係的值 n=85 e=13 d=5,設公鑰為(n,e),私鑰即為(n,d);
  • 假設使用者傳送數字3到服務端,通過RSA加密的過程為:m=(3^13) mod 85=63,mod為求模,得到密文63;
  • 服務端收到密文m=63,解密過程為 s=(63^5) mod 85=3,最終得出原文為3;
  • 加解密關係為 m=(s^e) mod n,s=(m^d) mod n;私鑰與公鑰可互相使用,只需要保護一個不被洩露即可;
  • 於是私鑰洩露就意味著RSA加密失去意義;

使用方式

請確保PHP的openssl擴充套件開啟,且保證php在環境變數中,如果是windows需新增環境變數:名 OPENSSL_CONF,值 D:httpphpextrassslopenssl.cnf(根據openssl.cnf目錄而定);

  • 生成新的公私鑰檔案在專案根目錄命令列執行:
php rsa.php new
  • 保護好私鑰,確保私鑰不被暴露在web可訪問目錄下;
  • 將生成的rsa_pubkey.js引入值web專案中,具體請執行DEMO演示即可;
  • rsa.class.php的使用:
// 初始化引數,設定公鑰與私鑰的路徑
rsa::$prikey = `src/key/private.pem`;
rsa::$pubkey = `src/key/public.pem`;

// JavaScript指令碼生成位置,用於重新生成公私鑰
rsa::$script = `rsa_pubkey.js`;

// $model = 1 公鑰加密,私鑰解密:公開公鑰,儲存私鑰
// $model = 2 私鑰加密,公鑰解密:公開私鑰,儲存公鑰
rsa::$model = 1;

// RSA加密
rsa::encrypt($data);

// RSA解密
rsa::decrypt($data);

// RSA簽名
rsa::sign($data);

// RSA驗籤
rsa::verify($data, $sign);

js加密來源於開源專案jsencrypt

本文出自個人部落格 最好的安排 轉載請註明出處!

相關文章