2012年6月24日 星期日

AES算法 JAVA同C++互解(AES) .

關於加解密JAVA一般使用的JCE,關於C++可以實現AES加解密的開源項目就多的數不勝數的。
理論上上算法一樣,對稱密鑰一樣就能夠互相識別了。
相信很多人開始想法都同我一樣,起初我JAVA用JCE,C++使用openssl。
結果發現加密出的密文完全不相同。
出現問題就要解決
了解了一下JCE:

      
JCE中AES支持五中模式:CBC,CFB,ECB,OFB,PCBC;支持三種填充:NoPadding,PKCS5Padding,ISO10126Padding。不支持SSL3Padding。不支持“NONE”模式。
好原來有模式和填充一說。
在OPENSSL中直接有一個CBC加解密函數。填充沒找到,試過後發現C++加密出的內容比JAVA的要長出一截,前面的內容是完全一樣的。
這應該就出現在填充上。

      
本來以為找到問題關鍵就應該很容易解決的。結果發現OPENSSL的填充是固定實現的,而我所需要解密的java端代碼不能改動。

      
一條路走不通咱就換條路。最後發現有一個開源項目Botan什麼都有而且同JCE十分相似並且滿足我要求垮平台,好就是它了。




附:

算法/模式/填充16字節加密後數據長度不滿16字節加密後長度AES/CBC/NoPadding 16 不支持AES/CBC/PKCS5Padding 32 16AES/CBC/ISO10126Padding 32 16AES/CFB/NoPadding 16 原始數據長度AES/CFB/PKCS5Padding 32 16AES/CFB/ISO10126Padding 32 16AES/ECB/NoPadding 16 不支持AES/ECB/PKCS5Padding 32 16AES/ECB/ISO10126Padding 32 16AES/OFB/NoPadding 16 原始數據長度AES/OFB/PKCS5Padding 32 16AES/OFB/ISO10126Padding 32 16AES/PCBC/NoPadding 16 不支持AES/PCBC/PKCS5Padding 32 16AES/PCBC/ISO10126Padding 32 16可以看到,在原始數據長度為16的整數倍時,假如原始數據長度等於16*n,則使用NoPadding時加密後數據長度等於16*n,其它情況下加密數據長度等於16*(n+1 )。在不足16的整數倍的情況下,假如原始數據長度等於16*n+m[其中m小於16],除了NoPadding填充之外的任何方式,加密數據長度都等於16*(n+1); NoPadding填充情況下,CBC、ECB和PCBC三種模式是不支持的,CFB、OFB兩種模式下則加密數據長度等於原始數據長度。

沒有留言:

張貼留言