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#下可以正常解密!!!