2012-11-27 82 views
1

在我的android应用程序中有一个密码字符串。我需要使用SOAP网络服务通过.net网络服务(即以.aspx结束)发送密码。在发送密码之前,我需要使用自定义密钥和IV加密AES 128加密密码。在Android和.Net中使用自定义密钥和IV的AES 128加密

他们有.net中的自定义密钥和Iv的加密/解密工具。该工具要求提供16位和IV 8位的自定义密钥。如果给它的字符串,它会生成加密字符串。例如

例子:

Key : 1234567812345678 
IV : 12345678 
String : android 
Encrypted string : oZu5E7GgZ83Z3yoK4y8Utg== 

我没有任何想法如何做到这一点的机器人。需要帮忙。

+0

http://www.coderanch.com/t/432039/Security/create-SecretKey-AES-Encryption-based –

+0

的http://计算器。 com/questions/6788018 – user1097489

回答

7

一个完整的例子可以帮助你:

的加密/解密功能,采用四

public static byte[] encrypt(byte[] data, byte[] key, byte[] ivs) { 
    try { 
     Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); 
     SecretKeySpec secretKeySpec = new SecretKeySpec(key, "AES"); 
     byte[] finalIvs = new byte[16]; 
     int len = ivs.length > 16 ? 16 : ivs.length; 
     System.arraycopy(ivs, 0, finalIvs, 0, len); 
     IvParameterSpec ivps = new IvParameterSpec(finalIvs); 
     cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, ivps); 
     return cipher.doFinal(data); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

    return null; 
} 

public static byte[] decrypt(byte[] data, byte[] key, byte[] ivs) { 
    try { 
     Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); 
     SecretKeySpec secretKeySpec = new SecretKeySpec(key, "AES"); 
     byte[] finalIvs = new byte[16]; 
     int len = ivs.length > 16 ? 16 : ivs.length; 
     System.arraycopy(ivs, 0, finalIvs, 0, len); 
     IvParameterSpec ivps = new IvParameterSpec(finalIvs); 
     cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, ivps); 
     return cipher.doFinal(data); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

    return null; 
} 

您可以如下使用它:

String dataToEncryptDecrypt = "android"; 
    String encryptionDecryptionKey = "1234567812345678"; 
    String ivs = "12345678"; 

    byte[] encryptedData = encrypt(dataToEncryptDecrypt.getBytes(), encryptionDecryptionKey.getBytes(), 
      ivs.getBytes()); 
    // here you will get the encrypted bytes. Now you can use Base64 encoding on these bytes, before sending to your web-service 

    byte[] decryptedData = decrypt(encryptedData, encryptionDecryptionKey.getBytes(), ivs.getBytes()); 
    System.out.println(new String(decryptedData)); 
+0

太棒了!我以字节得到答案。现在我需要将其转换为Base64。所以需要使用Base64Encoder。但是,如果我使用它导入包“sun.misc.BASE64Encoder”。 但是我们不应该使用防晒包,因为http://www.oracle.com/technetwork/java/faq-sun-packages-142232.html我该如何解决这个问题? –

+0

由于您使用的是Android,因此如果API级别为8或更高,则可以使用'Base64'类。 http://developer.android.com/reference/android/util/Base64.html – sunil

+0

是的,我得到了它的工作。 Thnks很多。需要更多帮助,我的输出与输出不同。所以在这种情况下,将是错误。输出的长度是相同的。我非常接近回答。 –

3

我不知道在使用AES算法(即模式&填充方法)的细节,位应该大致是这样的:

public static byte[] encrypt(byte[] data, byte[] key) { 
try { 
    Cipher cipher = Cipher.getInstance("AES/CBC/ZeroBytePadding"); 
    SecretKeySpec secretKeySpec = new SecretKeySpec(key, "AES"); 
    byte[] empty = new byte[16]; // For better security you should use a random 16 byte key!!! 
    IvParameterSpec ivps = new IvParameterSpec(empty); 
    cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, ivps); 
    return cipher.doFinal(data); 
} catch (Exception e) { 
    // ... 
} 

return null; 
} 

上述功能可以使用这样的:

String data = "android"; 
String key = "1234567812345678"; 
byte encrypted = encrypt(data.getbytes("UTF-8"), key.getbytes("UTF-8")); 
+0

Thq为您的答复。 –