2011-02-04 55 views
1

我用DES算法來加密/解密我的文字。它與拉丁文本完美結合。J2ME文本加密 - javax.crypto.IllegalBlockSizeException

但是,當我啓動加密/解密文本西里爾,解密一個被示出爲????? ????????在我TextField形式和控制檯。我該如何解決它?

Joachim Sauer advice後,我改變了對inputBytes = textToEnrypt.getBytes();inputBytes = textToEnrypt.getBytes("UTF-8");我現在有javax.crypto.IllegalBlockSizeException。幫幫我吧,求你......

package crypting; 

import javax.crypto.Cipher; 
import javax.crypto.spec.SecretKeySpec; 
import javax.microedition.midlet.*; 

public class Encryptor extends MIDlet { 

    String buffer; 

    public void startApp() { 
     String keyString = "testtest"; 
//  encrypt("Text for encrypting", keyString); 
     encrypt("Привет", keyString); 
     decrypt(buffer, keyString); 
    } 

    public void pauseApp() { 
    } 

    public void destroyApp(boolean unconditional) { 
    } 

    public void encrypt(String textToEnrypt, String keyString) { 
     Cipher cipher; 
     try { 
      cipher = Cipher.getInstance("DES"); 
     } catch (Exception ex) { 
      System.out.println(ex.toString()); 
      return; 
     } 

     byte[] keyData = keyString.getBytes(); 
     SecretKeySpec key = new SecretKeySpec(keyData, 0, keyData.length, "DES"); 

     try { 
      cipher.init(Cipher.ENCRYPT_MODE, key); 
     } catch (Exception ex) { 
      System.out.println(ex.toString()); 
      return; 
     } 

     int cypheredBytes = 0; 

     byte[] inputBytes; 
     try { 
      inputBytes = textToEnrypt.getBytes("UTF-8"); 
//   inputBytes = textToEnrypt.getBytes(); 
     } catch (Exception ex) { 
      System.out.println(ex.toString()); 
      return; 
     } 

     byte[] outputBytes = new byte[100]; 

     try { 
      cypheredBytes = cipher.doFinal(inputBytes, 0, inputBytes.length, 
        outputBytes, 0); 
     } catch (Exception ex) { 
      System.out.println(ex.toString()); 
      return; 
     } 

     String str = new String(outputBytes, 0, cypheredBytes); 
     buffer = str; 
     System.out.println("Encrypted string = " + str); 
    } 


    public void decrypt(String textToDecrypt, String keyString) { 
     Cipher cipher; 
     try { 
      cipher = Cipher.getInstance("DES"); 
     } catch (Exception ex) { 
      System.out.println(ex.toString()); 
      return; 
     } 

     byte[] keyData = keyString.getBytes(); 
     SecretKeySpec key = new SecretKeySpec(keyData, 0, keyData.length, "DES"); 

     try { 
      cipher.init(Cipher.DECRYPT_MODE, key); 
     } catch (Exception ex) { 
      System.out.println("2. " + ex.toString()); 
      return; 
     } 

     int cypheredBytes = 0; 

     byte[] inputBytes; 
     try { 
      inputBytes = textToDecrypt.getBytes("UTF-8"); 
//   inputBytes = textToDecrypt.getBytes(); 
     } catch (Exception ex) { 
      System.out.println("3. " + ex.toString()); 
      return; 
     } 

     byte[] outputBytes = new byte[100]; 

     try { 
      cypheredBytes = cipher.doFinal(inputBytes, 0, inputBytes.length, 
        outputBytes, 0); 
     } catch (Exception ex) { 
      System.out.println("4. " + ex.toString()); 
      return; 
     } 

     String str = new String(outputBytes, 0, cypheredBytes); 
     System.out.println("Decrypted string = " + str); 
    } 
} 

回答

2

我能夠使其與以下更改工作。

改變返回類型加密方法,從voidbyte[]

static public byte[] encrypt(String textToEnrypt, String keyString) 
    throws Exception 
{ 
    //at the end 
    //write this down: 
    byte[] newResponse = new byte[cypheredBytes]; 
    for(int i=0;i < cypheredBytes;i++) 
    { 
     newResponse[i] = outputBytes[i]; 
    } 
    return newResponse; 
} 

相反的:

String str = new String(outputBytes, 0, cypheredBytes); 
buffer = str; 
System.out.println("Encrypted string = " + str); 
2

我的猜測(我不能做更多的沒有你顯示出一些代碼)是你使用getBytes()不帶參數並構造byte[]String不帶參數以及。這意味着使用平臺默認編碼,如果不能代表西里爾文字符,那麼這就是你得到的。

這是更好地使用UTF-8兩個轉換,這樣就可以代表所有的Unicode字符。

+0

謝謝您的回答!但現在我有另一個問題 - javax.crypto.IllegalBlockSizeException。我在主題中描述了它。 – JastinBall 2011-02-04 10:34:17

1

的一個問題是你的加密方法行

String str = new String(outputBytes, 0, cypheredBytes); 

。您不能使用String作爲二進制數據的容器。加密數據不應該轉換爲字符串,除非它是一個要求,然後您需要使用適當的編解碼器,如base64。

2

DES使用64位(8字節)的塊大小。您必須確保您要加密的數據是8個字節的倍數,即用零字節或任何其他字符填充以確保數據正確。否則,你會得到一個IllegalBlockSizeException。你需要做到這一點,你的字符串轉換爲UTF-8之後,當然....