<dl id="3wz6h"></dl><li id="3wz6h"></li>

      1. <dl id="3wz6h"></dl>

      2. <dl id="3wz6h"><ins id="3wz6h"></ins></dl>

            <dl id="3wz6h"></dl>

            <dl id="3wz6h"><ins id="3wz6h"></ins></dl>
            1. 
              
              <output id="3wz6h"><ins id="3wz6h"><nobr id="3wz6h"></nobr></ins></output>

              <li id="3wz6h"><ins id="3wz6h"></ins></li>
              
              

            2. <output id="3wz6h"><ins id="3wz6h"><nobr id="3wz6h"></nobr></ins></output>
              首頁»安全»XOR 加密簡介

              XOR 加密簡介

              來源:阮一峰 發布時間:2018-08-22 閱讀次數:

              本文介紹一種簡單高效、非常安全的加密方法:XOR 加密。

              一、 XOR 運算

              邏輯運算之中,除了 ANDOR,還有一種 XOR 運算,中文稱為"異或運算"。

              它的定義是:兩個值相同時,返回false,否則返回true。也就是說,XOR可以用來判斷兩個值是否不同。

              true XOR true // false
              false XOR false // false
              true XOR false // true
              true XOR false // true
              

              JavaScript 語言的二進制運算,有一個專門的 XOR 運算符,寫作^。

              1 ^ 1 // 0
              0 ^ 0 // 0
              1 ^ 0 // 1
              0 ^ 1 // 1
              

              上面代碼中,如果兩個二進制位相同,就返回0,表示false;否則返回1,表示true。

              二、 XOR 的應用

              XOR 運算有一個很奇妙的特點:如果對一個值連續做兩次 XOR,會返回這個值本身。

              // 第一次 XOR
              1010 ^ 1111 // 0101
              
              // 第二次 XOR
              0101 ^ 1111 // 1010
              

              上面代碼中,原始值是1010,再任意選擇一個值(上例是1111),做兩次 XOR,最后總是會得到原始值1010。這在數學上是很容易證明的。

              三、加密應用

              XOR 的這個特點,使得它可以用于信息的加密。

              message XOR key // cipherText
              cipherText XOR key // message
              

              上面代碼中,原始信息是message,密鑰是key,第一次 XOR 會得到加密文本cipherText。對方拿到以后,再用key做一次 XOR 運算,就會還原得到message。

              四、完美保密性

              二戰期間,各國為了電報加密,對密碼學進行了大量的研究和實踐,其中就包括 XOR 加密。

              戰后,美國數學家香農(Claude Shannon)將他的研究成果公開發表,證明了只要滿足兩個條件,XOR 加密是無法破解的。

              • key的長度大于等于message
              • key必須是一次性的,且每次都要隨機產生

              理由很簡單,如果每次的key都是隨機的,那么產生的CipherText具有所有可能的值,而且是均勻分布,無法從CipherText看出message的任何特征。也就是說,它具有最大的"信息熵",因此完全不可能破解。這被稱為 XOR 的"完美保密性"(perfect secrecy)。

              滿足上面兩個條件的key,叫做 one-time pad(縮寫為OTP),意思是"一次性密碼本",因為以前這樣的key都是印刷成密碼本,每次使用的時候,必須從其中挑選key。

              五、實例:哈希加密

              下面的例子使用 XOR,對用戶的登陸密碼進行加密。實際運行效果看這里

              第一步,用戶設置登陸密碼的時候,算出這個密碼的哈希,這里使用的是 MD5 算法,也可以采用其他哈希算法。

              const message = md5(password);
              

              第二步,生成一個隨機的 key。

              // 生成一個隨機整數,范圍是 [min, max]
              function getRandomInt(min, max) {
                return Math.floor(Math.random() * (max - min + 1)) + min;
              }
              
              // 生成一個隨機的十六進制的值,在 0 ~ f 之間 
              function getHex() {
                let n = 0;
                for (let i = 4; i > 0; i--) {
                  n = (getRandomInt(0, 1) << (i - 1)) + n;
                }
                return n.toString(16);
              }
              
              // 生成一個32位的十六進制值,用作一次性 Key
              function getOTP() {
                const arr = [];
                for (let i = 0; i < 32; i++) {
                  arr.push(getHex());
                }
                return arr.join('');
              }
              

              上面代碼中,生成的key是32位的十六進制值,對應 MD5 產生的128位的二進制哈希。

              第三步,進行 XOR 運算,求出加密后的message。

              function getXOR(message, key) {
                const arr = [];
                for (let i = 0; i < 32; i++) {
                  const  m = parseInt(message.substr(i, 1), 16);
                  const k = parseInt(key.substr(i, 1), 16);
                  arr.push((m ^ k).toString(16));
                }
                return arr.join('');
              }
              

              使用這種方法保存用戶的登陸密碼,即使加密文本泄露,只要一次性的密鑰(key)沒有泄露,對方也無法破解。

              (完)

              QQ群:WEB開發者官方群(515171538),驗證消息:10000
              微信群:加小編微信 849023636 邀請您加入,驗證消息:10000
              提示:更多精彩內容關注微信公眾號:全棧開發者中心(fsder-com)
              網友評論(共0條評論) 正在載入評論......
              理智評論文明上網,拒絕惡意謾罵 發表評論 / 共0條評論
              登錄會員中心
              云南十一选往期