1. 程式人生 > >AES-128 ECB 加密有感

AES-128 ECB 加密有感

最近要搞一個加密。很是蛋疼。

原本微控制器和上位機發送資料就是非常簡單的。

這個專案相當複雜。每次資料命令都差不多1K,一次資料都要1K以上。是通過GPRS傳送的。

這些難纏的問題再前一階段已經解決了。

現在老師,還讓我們做AES加密。是對我們做控制的人來說還確實有點難度啊 。

寫的詳單詳細。

我再囉嗦一下,我對AES的心得。

其實AES就是對16byte(128bit)資料進行加密的過程。說白了就是把128位通過一系列的變化變成另一個128資料。

這裡主要用到2個關鍵的東西。金鑰(key)這個是絕對不能省的。key要先擴張,然後進行10次的行列變化,與資料進行抑或操作。最終才能得到加密後的資料。

此位還有一個東西是非常讓我困惑的,就是初始向量(IV)。這個地方自己當時也納悶了很久,不知道怎麼樣。其實說真的,還真可以不用他。用她只是可以把加密變得更難破解。

那我就來具體說一下怎麼用。

呵呵 廢話有點多了。

u8 data[16]={ 0x00,0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b,0x0c, 0x0d, 0x0e, 0x0f};

u8IV[16]={ 0x30, 0x31, 0x32, 0x33,
  0x34, 0x35, 0x36, 0x37,
  0x38, 0x39, 0x61, 0x62,
  0xd63, 0x64, 0x65,0x66};

其實只要把

 for(i=0;i<16;i++)
 {
  data[i]=data[i]^IV[i];
 }

然後再把data作為新的資料加密就OK了。

當然你也可以不用他。

那麼如果資料不是16的倍數改怎麼辦呢。這裡我們就用到的資料擴張

AES支援支援幾種填充:NoPadding,PKCS5Padding,ISO10126Padding,PaddingMode.Zeros;PaddingMode.PKCS7;

這裡要說明一下PKCS5Padding和PKCS7Padding是一樣的。

我也再說一下PKCS7 就是資料少幾個就填充幾個。

比如資料{1,2,3,4,5,6,7,8,9,10}

少了6個

那麼就填充6個6(注意是0x06,而不是字元6,字元6實際上是0x36)

{1,2,3,4,5,6,7,8,9,10,6,6,6,6,6,6}

注意一定要是16個數據(1個數據是8位,這樣就是128位)這樣才能進行AES加密。

切記。

PaddingMode.Zeros

這個填充方式,個人比較喜歡。就是在後面補充0.

無論缺多少就補多少個0。

再提醒一下就是如果剛滿16個,那就要在補充稱16個位元組。一定要比原先的多。(每種補充都要滿足這樣。這裡非常容易被忽略).

也就是說如果{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}

PaddingMode.Zeros模式

就要補充稱{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}

PKCS7Padding模式就要{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16}.這樣再代入加密演算法才是最正直的AES。

祝大家好運

這是C#寫的。大家可以參考下。

這2個地方都非常好。

總之遇到困難,覺得不能退縮。要一步一步往前走,相信前途一定會是光明的。

我就是這樣從一點也不知道然後在把C,和C#的加密解密方法給統一對應起來。C#都是整合的,引用非常簡單。C裡面就必須徹底搞清楚,才能用C加密的東西在C#下可以正常解密!!!