2013-07-25 62 views
0

我必须使用AES算法在J2ME和android中加密相同的数据。为Java ME和Android中的相同数据生成相同的加密结果?

但加密结果不一样。我想要产生相同的加密数据输出结果。

J2ME代码:

public String Encrypt(String text, String key) 
     throws Exception { 

     Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); 
     byte[] keyBytes= new byte[16]; 
     byte[] b= key.getBytes("UTF-8"); 
     int len= b.length; 
     if (len > keyBytes.length) len = keyBytes.length; 
     System.arraycopy(b, 0, keyBytes, 0, len); 
     SecretKeySpec keySpec = new SecretKeySpec(keyBytes,0,keyBytes.length, "AES"); 

     cipher.init(Cipher.ENCRYPT_MODE,keySpec, ivspec); 

      byte[] outputBytes = new byte[100]; 
      byte[] inputBytes; 
      inputBytes=text.getBytes("UTF-8"); 
     int results = cipher.doFinal(inputBytes,0,inputBytes.length,outputBytes,0); 

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

     String strMobile_No = Base64.encode(str.getBytes()); 
      String strresult=strMobile_No.toString(); 
      textField.setString(strMobile_No); 
      return strresult; 

     } 

的Android代码:

private String Encrypt(String text, String key) 
     throws Exception { 
     Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); 
     byte[] keyBytes= new byte[16]; 
     byte[] b= key.getBytes("UTF-8"); 
     int len= b.length; 
     if (len > keyBytes.length) len = keyBytes.length; 
     System.arraycopy(b, 0, keyBytes, 0, len); 
     SecretKeySpec keySpec = new SecretKeySpec(keyBytes, "AES"); 
     IvParameterSpec ivSpec = new IvParameterSpec(keyBytes); 
     cipher.init(Cipher.ENCRYPT_MODE,keySpec,ivSpec); 

     byte[] results = cipher.doFinal(text.getBytes("UTF-8")); 
     Log.v("GET Result from final:",results.toString()); 
     strMobile_No = Base64.encodeToString(results, 1); 

     return strMobile_No; 

     } 

J2ME生产:85IV+rkwyE/oO6z7uvwKbw==

的Android生产:XYMqEaliHBykRXGqV4LawA

有人可以帮我解决我的代码?

+0

这甚至没有编译。 J2ME代码中定义了“ivspec”?也有可怕的密码错误,可能会破坏整个事情的安全。 – ntoskrnl

+0

ohh有错误... ivspec在上面的j2me函数中定义:private IvParameterSpec ivspec; – Bushra

+0

足够公平......'ivpsec' *初始化*在哪里? – ntoskrnl

回答

1

使用此代码进行加密和解密。为了测试目的,您可以使用“1234567812345678”作为您的SecretKey。

public MCrypt(String SecretKey) { 
    ivspec = new IvParameterSpec(iv.getBytes()); 
    keyspec = new SecretKeySpec(SecretKey.getBytes(), "AES"); 
    try { 
     cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); 
    } catch (NoSuchAlgorithmException e) { 
     e.printStackTrace(); 
    } catch (NoSuchPaddingException e) { 
     e.printStackTrace(); 
    } 
} 

public byte[] encrypt(String text) throws Exception { 
    if (text == null || text.length() == 0) 
     throw new Exception("Empty string"); 
    byte[] encrypted = null; 
    try { 
     cipher.init(Cipher.ENCRYPT_MODE, keyspec, ivspec); 
     encrypted = cipher.doFinal(padString(text).getBytes()); 
    } catch (Exception e) { 
     throw new Exception("[encrypt] " + e.getMessage()); 
    } 
    return encrypted; 
} 

private byte[] decrypt(String code) throws Exception { 
    if (code == null || code.length() == 0) 
     throw new Exception("Empty string"); 
    byte[] decrypted = null; 
    try { 
     cipher.init(Cipher.DECRYPT_MODE, keyspec, ivspec); 
     decrypted = cipher.doFinal(hexToBytes(code)); 
    } catch (Exception e) { 
     throw new Exception("[decrypt] " + e.getMessage()); 
    } 
    return decrypted; 
} 

public static String bytesToHex(byte[] data) { 
    if (data == null) { 
     return null; 
    } 

    int len = data.length; 
    String str = ""; 
    for (int i = 0; i < len; i++) { 
     if ((data[i] & 0xFF) < 16) 
      str = str + "0" + java.lang.Integer.toHexString(data[i] & 0xFF); 
     else 
      str = str + java.lang.Integer.toHexString(data[i] & 0xFF); 
    } 
    return str; 
} 

private static byte[] hexToBytes(String str) { 
    if (str == null) { 
     return null; 
    } else if (str.length() < 2) { 
     return null; 
    } else { 
     int len = str.length()/2; 
     byte[] buffer = new byte[len]; 
     for (int i = 0; i < len; i++) { 
      buffer[i] = (byte) Integer.parseInt(
        str.substring(i * 2, i * 2 + 2), 16); 
     } 
     return buffer; 
    } 
} 

private String padString(String source) { 

    char paddingChar = ' '; 
    int size = 16; 
    int x = source.length() % size; 
    int padLength = size - x; 

    for (int i = 0; i < padLength; i++) { 
     source += paddingChar; 
    } 
    return source; 
} 

我希望你知道秘密密钥应该是128/256位的事实。

相关问题