1. 程式人生 > 實用技巧 >一次一密,DES

一次一密,DES

提示:文章寫完後,目錄可以自動生成,如何生成可參考右邊的幫助文件

加密


前言

個人學習整理筆記,希望能對後來者有所幫助。


提示:以下是本篇文章正文內容,下面案例可供參考

一、一次一密(One-time password)

一個序列密碼稱為一次一密必須滿足以下條件:

  1. 通過真隨機數生成器得到金鑰序列s0,s1,s2,…
  2. 只有合法的通訊方才知道金鑰序列;
  3. 每個金鑰序列位si僅適用一次。這意味著每個明文位都需要一個金鑰位,因此,一次一密的金鑰長度必須和明文長度一樣

一次一密是無條件安全的。

例項:假設傳送方要傳送“short"這個單詞給接收方。

傳送方:

  1. 使用ASCII編碼來轉換 “short”這個詞,轉換後會得到下面這一串二進位制資訊:
    0111001101101000011011110111001001110100

  2. 接下來你需要一個和上面二進位制串長度完全一致的金鑰,如:
    0110010101101010001110010010011101100100

  3. 我們將這兩組字串進行XOR 運算,得到:
    0001011000000010010101100101010100010000
    傳送方將這串資料傳送給接收方

接收方:

接收方得到資料後將其與金鑰進行XOR運算,得到傳送方的資料,再利用ascii編碼即可得到正確的資訊。

二、分組密碼(Block cipher)

1.DES

DES(Data Encryption Standard,資料加密標準)是一種使用56位金鑰對64位長分組進行加密的密碼。它是一種對稱密碼,即加密過程和解密過程使用相同的金鑰。DES對明文中的每個分組的加密過程都包含16輪,且每輪操作完全相同,每輪採用的子金鑰不同,並且所有子金鑰ki都是從主金鑰k中推到出來的。

DES加密過程:

  1. 64位金鑰經過子金鑰產生演算法產生出16個子金鑰:K1,K2,…,K16,分別供第一次,第二次,…,第十六次加密使用。

以下為子金鑰產生流程圖:

在這裡插入圖片描述

子金鑰產生需經過置換選擇1、迴圈左移、置換選擇2等變換,產生出16個48位長的子金鑰。

(1)置換選擇1
64位的金鑰為8個位元組,每個位元組的前七位是真正的金鑰位,第8位為奇偶校驗位,因此DES真正金鑰位56位。

置換選擇1的作用:從64位中去除8個奇偶校驗位;剩餘56位打亂重排,且將前28位作為C0,後28位作為D0。
置換選擇1
上圖表示置換選擇1結束後,C0、D0的值是由原金鑰中的哪幾位構成。

(2)置換選擇2

將Ci和Di合併成一個56位的中間資料,置換選擇2從中選擇一個48位的子金鑰Ki。
在這裡插入圖片描述

2.16輪迭代
在這裡插入圖片描述
(1)初始置換IP

初始置換的作用是將64位明文打亂重排,並分成左右兩部分L0和R0,每部分32位。

初始置換IP
(2)加密部分

上一輪的Ri將作為下一輪的Li+1,而Li則通過加密運算成為下一輪的Ri+1。

加密函式f:

  • 首先將輸入分成8個4位的分組

  • 通過E-盒將4位的分組擴充套件成6位的分組,此時得到48位的輸入長度。E-盒

  • 將得到48位與輪金鑰Ki進行XOR操作,並將8個6位長的分組送入8個S-盒中,得到8個4位長的分組,即得到了32位的輸出。
    -(S-盒可以將6位的輸入對映為4位的輸出,按照6位中首尾兩位組成的二進位制位行,中間四位組成的二進位制位列,從S盒中進行查詢,得到4位輸出)
    例:100101,首尾兩位為11,則表示數字3,則第4行,中間四位0010,則表示數字2,則為第3列(行列均從0開始計數)

  • 32位的輸出進行P置換f函式內的P置換
    最後得到的32位輸出則為下一輪的Ri+1

注意:最後一輪得到的Ri和Li不進行交換

(3)逆初始置換IP-1

逆初始置換是初始置換IP的逆置換,它把十六次加密迭代的結果打亂重排,形成64位密文。
逆初始置換
以上便是DES的加密過程。

DES解密

由於DES的運算時對合運算,所以加密和解密可用同一個運算,只是子金鑰使用順序不同。
把64位密文當做明文輸入,而且第一次解密迭代使用子金鑰K16,第二次解密迭代使用子金鑰K15,…,第十六次解密迭代使用子金鑰K1,最後輸出的就是64位明文。

解密過程可用如下數學公式表示:
在這裡插入圖片描述


總結

本文主要介紹了一次一密的概念和DES演算法。