2013-06-27 80 views
0

我試圖用AES/ECB/PKCS7Padding創建加密和解密函數。使用AES加密和解密PKCS7Padding失敗

private static byte[] INITIALIZATION_VECTOR = new byte[] { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }; 
public static String encrypt(String token) { 
    Cipher cipher = null; 
    SecretKey key = null; 
    String tokenAsHex = null; 
    byte[] encryptedToken = null; 
    byte[] sksKey = "6iOmT2V6mnd0".getBytes(); // SecretKeySpec key. 

    try { 
     key = new SecretKeySpec(sksKey, "AES"); 
     AlgorithmParameterSpec paramSpec = new IvParameterSpec(INITIALIZATION_VECTOR); 
     cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); 
     cipher.init(Cipher.ENCRYPT_MODE, key, paramSpec); 
     encryptedToken = cipher.doFinal(token.getBytes("UTF-8")); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    return Base64.encodeBase64String(encryptedToken); 
} 

public static String decrypt(String token) { 
    Cipher cipher = null; 
    SecretKey key = null; 
    byte[] decryptedToken = null; 
    byte[] sksKey = "6iOmT2V6mnd0".getBytes(); // SecretKeySpec key. 
    try { 
     key = new SecretKeySpec(sksKey, "AES");    
     AlgorithmParameterSpec paramSpec = new IvParameterSpec(INITIALIZATION_VECTOR); 
     cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); 
     cipher.init(Cipher.DECRYPT_MODE, key, paramSpec); 
     decryptedToken = cipher.doFinal(Base64.decodeBase64(token)); 
    } catch(Exception e){ 
     e.printStackTrace();  
    } 
    if (decryptedToken == null) { 
     System.out.println("Unable to decrypt the following token: " + token); 
    } 
    return new String(decryptedToken); 
} 

我編輯了我的程序。

現在,dycryption似乎工作,但它只適用於PKCS5Padding,當我嘗試使用PKCS7Padding它說它找不到提供者,它怎麼可能?

+0

請使用類似谷歌的keyczar庫來代替。它更易於使用,並且更有可能獲得安全的代碼。 –

+0

PKCS#5和PKCS#7填充實際上是相同的。有些系統使用一個名稱,而其他系統使用另一個名稱。在你的情況下,默認提供者使用'PKCS5'名稱。基本上,不要擔心。 – rossum

回答

2

你有幾個錯誤:

  1. 密文不轉換爲字符串 - 這很可能是有損耗的轉換。相反,將其保存爲字節數組或將其轉換爲十六進制或base64。

  2. 您需要存儲解密期間使用的IV。目前您只需將其扔掉(在您的enc方法中)。一種常見的技術是將密文與您的IV(可能用分隔符分隔)作爲前綴。

  3. 從解密的字節創建字符串時,應該指定一個字符集。

這可能不是一個詳盡的列表,但它肯定足以導致您的主要問題。修復這些問題,然後讓我們知道您是否仍然看到錯誤(並且在您的問題中發佈錯誤)。

此外,返回字符串"error"是糟糕的設計。在Java中,使用異常來指示出現了問題。

+0

修復了大部分問題,但是當我嘗試使用PKCS7Padding時,它說它無法找到提供程序,您知道爲什麼嗎? – susparsy

+0

@susparsy大多數供應商稱之爲'PKCS5Padding'。它基本上是[同樣的東西](http://en.wikipedia.org/wiki/Padding_%28cryptography%29#PKCS7)。 –