2012-11-27 111 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爲您的答覆。 –