日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

XOR 加密简介

發(fā)布時間:2023/12/8 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 XOR 加密简介 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

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

一、 XOR 運算

邏輯運算之中,除了?AND?和?OR,還有一種?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 運算有一個很奇妙的特點:如果對一個值連續(xù)做兩次 XOR,會返回這個值本身。

  • ?
  • // 第一次 XOR

  • 1010 ^ 1111 // 0101

  • ?
  • // 第二次 XOR

  • 0101 ^ 1111 // 1010

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

    三、加密應用

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

  • ?
  • message XOR key // cipherText

  • cipherText XOR key // message

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

    四、完美保密性

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

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

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

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

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

    五、實例:哈希加密

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

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

  • ?
  • const message = md5(password);

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

  • ?
  • // 生成一個隨機整數(shù),范圍是 [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 產(chǎn)生的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)沒有泄露,對方也無法破解。

    (完)

    總結

    以上是生活随笔為你收集整理的XOR 加密简介的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。