Java AES128 加密 和 iOS ,Android的同步(含代碼)

一:前言

AES是開發(fā)中常用的加密算法之一。然而由于前后端開發(fā)使用的語言不統(tǒng)一,導(dǎo)致經(jīng)常出現(xiàn)前端加密而后端不能解密的情況出現(xiàn)。然而無論什么語言系統(tǒng),AES的算法總是相同的, 因此導(dǎo)致結(jié)果不一致的原因在于加密設(shè)置的參數(shù)不一致。于是先來看看在兩個平臺使用AES加密時需要統(tǒng)一的幾個參數(shù)。

密鑰長度(Key Size)

加密模式(Cipher Mode)

填充方式(Padding)

初始向量(Initialization Vector)

密鑰長度

AES算法下,key的長度有三種:128、192和256 bits。由于歷史原因,JDK默認(rèn)只支持不大于128 bits的密鑰,而128 bits的key已能夠滿足商用安全需求。因此本例先使用AES-128。(Java使用大于128 bits的key方法在文末提及)

加密模式

AES屬于塊加密(Block Cipher),塊加密中有CBC、ECB、CTR、OFB、CFB等幾種工作模式。本例統(tǒng)一使用CBC模式。

填充方式

由于塊加密只能對特定長度的數(shù)據(jù)塊進行加密,因此CBC、ECB模式需要在最后一數(shù)據(jù)塊加密前進行數(shù)據(jù)填充。(CFB,OFB和CTR模式由于與key進行加密操作的是上一塊加密后的密文,因此不需要對最后一段明文進行填充)

在iOS SDK中提供了PKCS7Padding,而JDK則提供了PKCS5Padding。原則上PKCS5Padding限制了填充的Block Size為8 bytes,而Java實際上當(dāng)塊大于該值時,其PKCS5Padding與PKCS7Padding是相等的:每需要填充χ個字節(jié),填充的值就是χ。

初始向量

使用除ECB以外的其他加密模式均需要傳入一個初始向量,其大小與Block Size相等(AES的Block Size為128 bits),而兩個平臺的API文檔均指明當(dāng)不傳入初始向量時,系統(tǒng)將默認(rèn)使用一個全0的初始向量。

有了上述的基礎(chǔ)之后,可以開始分別在兩個平臺進行實現(xiàn)了。

本文 參考文檔:AES是開發(fā)中常用的加密算法之一。然而由于前后端開發(fā)使用的語言不統(tǒng)一,導(dǎo)致經(jīng)常出現(xiàn)前端加密而后端不能解密的情況出現(xiàn)。然而無論什么語言系統(tǒng),AES的算法總是相同的, 因此導(dǎo)致結(jié)果不一致的原因在于加密設(shè)置的參數(shù)不一致。于是先來看看在兩個平臺使用AES加密時需要統(tǒng)一的幾個參數(shù)。

密鑰長度(Key Size)

加密模式(Cipher Mode)

填充方式(Padding)

初始向量(Initialization Vector)

密鑰長度

AES算法下,key的長度有三種:128、192和256 bits。由于歷史原因,JDK默認(rèn)只支持不大于128 bits的密鑰,而128 bits的key已能夠滿足商用安全需求。因此本例先使用AES-128。(Java使用大于128 bits的key方法在文末提及)

加密模式

AES屬于塊加密(Block Cipher),塊加密中有CBC、ECB、CTR、OFB、CFB等幾種工作模式。本例統(tǒng)一使用CBC模式。

填充方式

由于塊加密只能對特定長度的數(shù)據(jù)塊進行加密,因此CBC、ECB模式需要在最后一數(shù)據(jù)塊加密前進行數(shù)據(jù)填充。(CFB,OFB和CTR模式由于與key進行加密操作的是上一塊加密后的密文,因此不需要對最后一段明文進行填充)

在iOS SDK中提供了PKCS7Padding,而JDK則提供了PKCS5Padding。原則上PKCS5Padding限制了填充的Block Size為8 bytes,而Java實際上當(dāng)塊大于該值時,其PKCS5Padding與PKCS7Padding是相等的:每需要填充χ個字節(jié),填充的值就是χ。

初始向量

使用除ECB以外的其他加密模式均需要傳入一個初始向量,其大小與Block Size相等(AES的Block Size為128 bits),而兩個平臺的API文檔均指明當(dāng)不傳入初始向量時,系統(tǒng)將默認(rèn)使用一個全0的初始向量。

有了上述的基礎(chǔ)之后,可以開始分別在兩個平臺進行實現(xiàn)了。

但是實際開發(fā)中,很有可能 我們兩端使用的參數(shù) 等的不一致 導(dǎo)致兩端沒法同步。

編譯工具 Java 端Eclipse, iOS 端: Xcode

完成后看到如下圖效果


iOSAES128加解密測試效果圖


Java_AES128加解密測試效果圖


從圖中可以看出 對同一串字符串的 加密和解密 保持了一直性。

Java 代碼下載地址:?GitJava地址

iOS 代碼下載地址 Objective-C :?iOS DEMO 下載地址

參考文檔:?http://blog.csdn.net/LLy_Alex/article/details/52350314

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • AES是開發(fā)中常用的加密算法之一。然而由于前后端開發(fā)使用的語言不統(tǒng)一,導(dǎo)致經(jīng)常出現(xiàn)前端加密而后端不能解密的情況出現(xiàn)...
    WelkinXie閱讀 27,336評論 35 86
  • AES是開發(fā)中常用的加密算法之一。然而由于前后端開發(fā)環(huán)境差異,導(dǎo)致出現(xiàn)前端加密而后端不能解密的情況出現(xiàn)。然而無論什...
    醉臥欄桿聽雨聲閱讀 2,830評論 3 3
  • 序 本文主要小結(jié)一下java里頭的AES以及RSA加解密。 AES 使用AES加密時需要幾個參數(shù): 密鑰長度(Ke...
    go4it閱讀 889評論 0 0
  • 這篇文章主要講述在Mobile BI(移動商務(wù)智能)開發(fā)過程中,在網(wǎng)絡(luò)通信、數(shù)據(jù)存儲、登錄驗證這幾個方面涉及的加密...
    雨_樹閱讀 3,039評論 0 6
  • 我是個享樂主義吧 工資目前夠用 沒啥追求 又覺得自己時間寶貴 追求自由 有點自恃清高吧 不愿浪費時間 也不愿和三教...
    角落蜷縮閱讀 485評論 0 0

友情鏈接更多精彩內(nèi)容