AES加密.NET到Android的移动设备



i i转介到下面的链接AES加密.NET到Swift,

但是,为Android应用相同的内容,我无法使用版本(PBKDF2)转换的正确AES加密。需要帮助。

public static String Encrypt(String PlainText) throws Exception {
        try {
            byte[] salt = new byte[] { 0x49, 0x76, 0x61, 0x6E, 0x20, 0x4D,
                    0x65, 0x64, 0x76, 0x65, 0x64, 0x65, 0x76 };
            System.out.println("Exception setting up cipher: "+pbkdf2("<keyname>",salt.toString(),1024,128));
            Cipher _aesCipher = Cipher.getInstance("AES/CBC/PKCS7Padding");
            byte[] keyBytes =pbkdf2("<keyname>",salt.toString(),1024,128).getBytes();
            SecretKeySpec keySpec = new SecretKeySpec(keyBytes, "AES");
            byte[] iv ="OFRna73m*aze01xY".getBytes();//pbkdf2("<keyname>",salt.toString(),2,64).getBytes();
            IvParameterSpec ivSpec = new IvParameterSpec(iv);
            _aesCipher.init(1, keySpec, ivSpec);
            byte[] plainText = PlainText.getBytes();
            byte[] result = _aesCipher.doFinal(plainText);
            return Base64.encodeToString(result, Base64.DEFAULT);//Base64.encode(result,1));
        } catch (Exception ex1) {
            System.out.println("Exception setting up cipher: "
                    + ex1.getMessage() + "rn");
            ex1.printStackTrace();
            return "";
        }
    }
    public static String pbkdf2(String password, String salt, int iterations, int keyLength) throws NoSuchAlgorithmException, InvalidKeySpecException {
        char[] chars = password.toCharArray();
        PBEKeySpec spec = new PBEKeySpec(chars, salt.getBytes(), iterations, keyLength);
        SecretKeyFactory skf = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
        byte[] hash = skf.generateSecret(spec).getEncoded();
        return toHex(hash);
    }
    // Converts byte array to a hexadecimal string
    private static String toHex(byte[] array) {
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < array.length; i++) {
            sb.append(Integer.toString((array[i] & 0xff) + 0x100, 16).substring(1));
        }
        return sb.toString();
    }

请检查下面的代码。 我已经创建了相同的单元节类,因此我可以在应用程序中的任何地方访问它。

以下点应该相同,例如.NET或SWIFT

重要点 iv salt password请检查一下 pbkdf2withhmacsha1

SecretKeyFactory Factory = SecretKeyFactory.getInstance(" pbkdf2withhmacsha1");

要生成密钥,我们使用了此

KeySpec spec = new PBEKeySpec(password, salt, 2, 256);

"要点"是(密码,盐,迭代,字节)这必须像您使用的其他平台一样,使用。

public class AesBase64Wrapper {
    private static String IV = "it should be same like server or other platform";
    private static String PASSWORD = "it should be same like server or other platform";
    private static String SALT = "it should be same like server or other platform";

    private static volatile AesBase64Wrapper sSoleInstance = new AesBase64Wrapper();
    //private constructor.
    private AesBase64Wrapper() {
    }
    public static AesBase64Wrapper getInstance() {
        return sSoleInstance;
    }
    // For Encryption
    public String encryptAndEncode(String raw) {
        try {
         Cipher c = getCipher(Cipher.ENCRYPT_MODE);
         byte[] encryptedVal = c.doFinal(getBytes(raw));
    //String retVal = Base64.encodeToString(encryptedVal, Base64.DEFAULT);
         String retVal = Base64.encodeToString(encryptedVal, Base64.NO_WRAP);
         return retVal;
        }catch (Throwable t) {
            throw new RuntimeException(t);
        }
    }
    public String decodeAndDecrypt(String encrypted) throws Exception {
//        byte[] decodedValue = Base64.decode(getBytes(encrypted),Base64.DEFAULT);
        byte[] decodedValue = Base64.decode(getBytes(encrypted), Base64.NO_WRAP);
        Cipher c = getCipher(Cipher.DECRYPT_MODE);
        byte[] decValue = c.doFinal(decodedValue);
        return new String(decValue);
    }
    private String getString(byte[] bytes) throws UnsupportedEncodingException {
        return new String(bytes, "UTF-8");
    }
    private byte[] getBytes(String str) throws UnsupportedEncodingException {
        return str.getBytes("UTF-8");
    }
    private Cipher getCipher(int mode) throws Exception {
        Cipher c = Cipher.getInstance("AES/CBC/PKCS5Padding");
        byte[] iv = getBytes(IV);
        String xyz = String.valueOf(generateKey());
        Log.i("generateKey", xyz);
        c.init(mode, generateKey(), new IvParameterSpec(iv));
        return c;
    }
    private Key generateKey() throws Exception {
        SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
        char[] password = PASSWORD.toCharArray();
        byte[] salt = getBytes(SALT);
        KeySpec spec = new PBEKeySpec(password, salt, 2, 256);
        SecretKey tmp = factory.generateSecret(spec);
        byte[] encoded = tmp.getEncoded();
        byte b = encoded[1];
        Log.e("Secrete Key", String.valueOf(encoded));
        return new SecretKeySpec(encoded, "CBC");
    }

}

在活动中您可以使用它,例如

String EncryptString = AesBase64Wrapper.getInstance().encryptAndEncode("hello");
String DecryptString = AesBase64Wrapper.getInstance().encryptAndEncode(EncryptString);
// You will Get Output in Decrypted String