2010-09-13 153 views
4

我在我的android應用程序上生成了一對RSA密鑰。RSA和AES解密和加密問題

我從網絡服務接收 - AES密鑰,使用我的RSA公鑰 加密 - 使用AES密鑰編碼的字符串。

所以我必須做到以下幾點: - 解密AES密鑰 - 用獲得的AES密鑰解密字符串。

要生成的RSA密鑰我所做的:

keyGen = KeyPairGenerator.getInstance("RSA"); 
    keyGen.initialize(size); 
    keypair = keyGen.genKeyPair(); 
    privateKey = keypair.getPrivate(); 
    publicKey = keypair.getPublic(); 

在RSA解密我用:

public static byte[] decryptRSA(PrivateKey key, byte[] text) throws Exception 
     { 
      byte[] dectyptedText = null; 

      Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding"); 
      cipher.init(Cipher.DECRYPT_MODE, key); 
      dectyptedText = cipher.doFinal(text); 
      return dectyptedText; 
     } 

在AES解密我用:

public static byte[] decryptAES(byte[] key, byte[] text) throws Exception { 
      SecretKeySpec skeySpec = new SecretKeySpec(key, "AES"); 
      Cipher cipher = Cipher.getInstance("AES/ECB/PKCS1Padding"); 
      cipher.init(Cipher.DECRYPT_MODE, skeySpec); 
      byte[] decrypted = cipher.doFinal(text); 
      return decrypted; 
     } 

所以,在我的代碼,以獲得解密的AES密鑰I do

byte[] decryptedAESKey = sm.decryptRSA(key, Base64.decode(ReceivedBase64EncryptedAESKey)); 
byte[] decryptedString = sm.decryptAES(decryptedAESKey, Base64.decode(ReceivedEncryptedAESString)); 

最後,我得到一個null爲decryptedString。 我在做什麼錯?

回答

2

那麼,事情是,解密的關鍵是8個字節長,我不得不讓16個字節是兼容的AES 128位

所以,我做了一個方法將其轉換回

private static byte[] GetKey(byte[] suggestedKey) 
     { 
      byte[] kRaw = suggestedKey; 
      ArrayList<Byte> kList = new ArrayList<Byte>(); 

      for (int i = 0; i < 128; i += 8) 
      { 
       kList.add(kRaw[(i/8) % kRaw.length]); 
      } 

      byte[] byteArray = new byte[kList.size()]; 
      for(int i = 0; i<kList.size(); i++){ 
      byteArray[i] = kList.get(i); 
      } 
      return byteArray; 
     } 

而且改寫解密方法:

public static byte[] decryptAES(byte[] key, byte[] text) throws Exception { 

      SecretKeySpec skeySpec = new SecretKeySpec(GetKey(key), "AES"); 

      Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding","BC"); 

      byte [] iv = new byte[cipher.getBlockSize()]; 
      for(int i=0;i<iv.length;i++)iv[i] = 0; 
      IvParameterSpec ivSpec = new IvParameterSpec(iv); 
      cipher.init(Cipher.DECRYPT_MODE, skeySpec, ivSpec); 

      byte[] decrypted = cipher.doFinal(text); 
      return decrypted; 
     } 
0

我不知道你使用的是什麼語言或庫(看起來像Java?),但有些真的東西一般嘗試:

  1. 你獲取的加密字符串,好嗎?檢查ReceivedEncryptedAESString的長度和Base64.decode的輸出以檢查它們是否正常。
  2. AES解密不能失敗,所以它必須是庫初始化中的一個問題。在構建步驟和init步驟之後檢查cipher的值/狀態。
  3. 嘗試一個更簡單的測試用例:忽略RSA加密,並嘗試使用您的Cipher對象解密某些內容。
+0

我使用的Android,其包含的庫。 1.看起來不錯,例如我收到ReceivedEncryptedAESString = qjYcPCHkFpbTjntDCpXCGabSY5DFH ...並且解密的AES密鑰看起來像:[121,98,51,100,108,112,118,107,118,97] – Alin 2010-09-13 15:50:35

+0

2.問題似乎是在cipher.init(Cipher.DECRYPT_MODE,skeySpec);因爲它引發一個異常:InvalidKeyException:密鑰長度不是128/192/256位。也許我做RSA解密是錯誤的? – Alin 2010-09-13 16:00:55

+1

關鍵數組有多長?它可能太短(小於128位),需要某種填充,或者它太長,需要截斷。 AES僅在這三種密鑰長度上定義。由於這是從Web服務中檢索的字符串,因此您需要找出錯誤長度的原因。也許從Web服務的消息被截斷? – Amoss 2010-09-15 17:54:48