AES-шифрование .Net для Android для мобильных устройств - PullRequest
0 голосов
/ 19 декабря 2018

Я сослался на ссылку ниже AES Encryption .net to swift ,

Но, применяя то же самое для ANDROID, я не могу получить правильное шифрование AES с версией (PBKDF2) преобразование для моего кода.НУЖНА ПОМОЩЬ.

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() + "\r\n");
            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();
    }

1 Ответ

0 голосов
/ 19 декабря 2018

Пожалуйста, проверьте ниже код. Я создал класс Singletone для того же, чтобы я мог получить к нему доступ в любом месте в приложении.

Ниже пунктов должныбыть таким же, как .net или swift

Важными точками являются IV , СОЛЬ и ПАРОЛЬ Пожалуйста, проверьтеэто тоже PBKDF2WithHmacSHA1

SecretKeyFactory factory = SecretKeyFactory.getInstance ("PBKDF2WithHmacSHA1");

, чтобы сгенерировать ключ, который мы использовали

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

Важными точками являются (пароль, соль, итерация, байты) это должно быть так же, как и на другой платформе, которую вы используете с .net или swift

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");
    }


}

В Activity вы можете использовать его как

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