2013年8月6日星期二

javax.crypto.IllegalBlockSizeException: last block incomplete indecryption

 
   Problem  
 
   recently decided to implement an Android AES encryption and decryption functions, but decrypted when reported abnormal.  
 
   javax.crypto.IllegalBlockSizeException: last block incomplete in decryption  
 
   org.bouncycastle.jce.provider.JCEBlockCipher.engineDoFinal (JCEBlockCipher.java: 711) at javax.crypto.Cipher.doFinal (Cipher.java: 100 )  
 
   estimation problem is the transmission time because the encoding data loss  
 
   Solution  
 
   the AES encrypted ciphertext then the whole base64 encryption, decoding base64 decrypt them first and then into the AES decryption, so we can guarantee acceptance correctness of the data and not missing.  
 
   but which comes with android but Base64 encryption and decryption error. (Do not know why)  
 
   then google the one, write your own Base64 encryption tools.  
 
    
 
   package com . example . testandroid ;   
  
   import java.io.ByteArrayOutputStream ;   
  
   public class Base64Util {   
   private static final char [] < / span> base64EncodeChars = new char [] { 'A' , 'B' , 'C' , 'D' , 'E' , 'F ' , ' G ' , 'H' , 'I' , 'J' < span style = "color: # e0eee0;">, 'K' , 'L' , 'M' , 'N' , 'O' , 'P' , 'Q' , 'R' , 'S' , 'T' , 'U' , 'V' , 'W' , 'X' < / span> , 'Y' , 'Z' , 'a' , 'b' , 'c' , 'd' , 'e ' , ' f ' , 'g' , 'h' , 'i' < span style = "color: # e0eee0;">, 'j' , 'k' , 'l' , 'm' , 'n' , 'o' , 'p' , 'q' , 'r' , 's' , 't' , 'u' , 'v' , 'w' < / span> , 'x' , 'y' , 'z' , '0 ' , '1 ' , '2 ' , '3 ' , '4' , '5 ' , '6 ' , '7' < span style = "color: # e0eee0;">, '8 ' , '9 ' , '+' , '/' };   
  
   private static byte [] base64DecodeChars < / span> = new byte [] { - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , < span style = "color: # e0eee0;"> - 1 , - 1 , - 1 , - 1 , < / span> - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 < span style = "color: # e0eee0;">, - 1 , - 1 , - 1 , - 1 < / span> , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , 62 < span style = "color: # e0eee0;">, - 1 , - 1 , - 1 , 63 , < / span> 52 , 53 , 54 , 55 , 56 , 57 , 58 , 59 , 60 , 61 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , < span style = "color: # e0eee0;"> - 1 , 0 , 1 , 2 , 3 , 4 < / span> , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 14 , 15 , 16 , 17 , 18 , 19 , 20 , 21 , 22 , 23 < span style = "color: # e0eee0;">, 24 , 25 , - 1 , - 1 , - < / span> 1 , - 1 , - 1 , - 1 , 26 , 27 , 28 , 29 , 30 , 31 , 32 , 33 , 34 , 35 , 36 , 37 , 38 , 39 < span style = "color: # e0eee0;">, 40 , 41 , 42 , 43 , 44 , 45 < / span> , 46 , 47 , 48 , 49 , 50 , 51 , - 1 , - 1 , - 1 , - 1 , - 1 };   
  
   private Base64Util () {   
   }   
  
   / **   
   * encoded byte array to a string   
   *   
   * @ param data <​​span>   
   * /   
   public static String encode ( byte < / span> [] data <​​span>) {   
   StringBuffer sb = new StringBuffer ();   
   int len = data <​​span> . length ;   
   int i = 0 ;   
   int b1 , b2 , b3 ;   
  
   while ( i << / span> len ) {   
   b1 = data <​​span> [ i + +] & 0xff ;   
   if ( i == len ) {   
   sb . append ( base64EncodeChars [ < span style = "color: # e0eee0;"> b1 >>> 2 ]);
  
   sb . append ( base64EncodeChars [( b1 & 0x3 ) <<< / span> 4 ]);   
   sb . append ( "==" );   
   break ;   
   }   
   b2 = data <​​span> [ i + +] & 0xff ;   
   if ( i == len ) {   
   sb . append ( base64EncodeChars [ < span style = "color: # e0eee0;"> b1 >>> 2 ]);
  
   sb . append ( base64EncodeChars [(( b1 & 0x03 < / span>) <<< / span> 4 ) | (( b2 & 0xf0 ) >>> 4 ) ]);   
   sb . append ( base64EncodeChars [( b2 & 0x0f ) <<< / span> 2 ]);   
   sb . append ( "=" );   
   break ;   
   }   
   b3 = data <​​span> [ i + +] & 0xff ;   
   sb . append ( base64EncodeChars [ b1 >>> 2 ]);   
   sb .

没有评论:

发表评论