Зашифрованный в java (Android) не удается в расшифровке Python AES - PullRequest
0 голосов
/ 17 октября 2019

Я пытаюсь расшифровать зашифрованный код Java AES в скрипт Python, но не удается полностью расшифровать, что означает, что некоторые из исходных данных не расшифровываются, но остальные данные расшифровываются нормально. Ниже приведен код Python -

decryptor = Cipher(
            algorithms.AES(self._encryption_key),
            modes.CBC(initialization_vector),
            self._backend
        ).decryptor()
        plaintext_padded = decryptor.update(ciphertext)
        try:
            plaintext_padded += decryptor.finalize()
        except ValueError:
            raise InvalidToken
        unpadder = padding.PKCS7(algorithms.AES.block_size).unpadder()

        unpadded = unpadder.update(plaintext_padded)
        try:
            unpadded += unpadder.finalize()
        except ValueError:
            raise InvalidToken

А ниже - мой Java-код, который может успешно зашифровывать и дешифровать свой собственный сгенерированный шифр в обычный и наоборот.

aesCipher = Cipher.getInstance("AES/CBC/PKCS7Padding");
.
.
static SecretKey generateSecretKey() {

        SecretKeyFactory pbeKeyFactory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1And8bit");
        SecretKey secretKey;
        try {
            SecureRandom rand = new SecureRandom();
            byte[] salt = new byte[32];
            rand.nextBytes(salt);
            // WORK-AROUND change rand.nextInt(2048) to rand.nextInt(2047) + 1 to genterate 1-2048;
            int iterationCount = rand.nextInt(2047) + 1;
            KeySpec pbeKeySpec = new PBEKeySpec(new String(rand.generateSeed(24)).toCharArray(), salt, iterationCount, 256);
            SecretKey pbeKey = pbeKeyFactory.generateSecret(pbeKeySpec);
            secretKey = new SecretKeySpec(pbeKey.getEncoded(), "AES");
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        return secretKey;
    }

    static SymmetricEncryptionEntry symmetricEncrypt(SecretKey key, String data) {

        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding");
        SymmetricEncryptionEntry entry;
        try {
            byte[] iv = generateIv(cipher.getBlockSize());
            IvParameterSpec ivParams = new IvParameterSpec(iv);
            cipher.init(Cipher.ENCRYPT_MODE, key, ivParams);
            byte[] cipherText = cipher.doFinal(data.getBytes(StandardCharsets.UTF_8));
            entry = new SymmetricEncryptionEntry(cipherText , iv);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        return entry;
    }

    private static byte[] generateIv(int length) {
        byte[] b = new byte[length];
        new SecureRandom().nextBytes(b);

        return b;
    }

Ниже приведен реальный простой текст и расшифрованный простой текст -

, ожидаемый при расшифровке с помощью python

b'{"auth_key":"eyJhbGciOiJSUzI1NiIsImtpZCI6ImZhMWQ3NzBlZWY5ZWFhNjU0MzY1ZGE5MDhjNDIzY2NkNzY4ODkxMDUiLCJ0eXAiOiJKV1QifQ.eyJpc3MiOiJodHRwczovL3NlY3VyZXRva2VuLmdvb2dsZS5jb20vY2hhdHEtc3RhZ2luZyIsImF1ZCI6ImNoYXRxLXN0YWdpbmciLCJhdXRoX3RpbWUiOjE1NzExMjM5NDcsInVzZXJfaWQiOiJyQ3N0aTBoMEczVUZmVWk2Q1oxYjNJOEJmOVIyIiwic3ViIjoickNzdGkwaDBHM1VGZlVpNkNaMWIzSThCZjlSMiIsImlhdCI6MTU3MTIwMjY4OSwiZXhwIjoxNTcxMjA2Mjg5LCJwaG9uZV9udW1iZXIiOiIrODQxMjM0NTY3ODIiLCJmaXJlYmFzZSI6eyJpZGVudGl0aWVzIjp7InBob25lIjpbIis4NDEyMzQ1Njc4MiJdfSwic2lnbl9pbl9wcm92aWRlciI6InBob25lIn19.0OCskQkPKq5yxku02PuBgoZMFHgMfZBVPptQaVExrWYRDrEM3uUwDrDXAWiqA6L9i54fg_7dfWBwnPvQ71g4Lzsft60_JycS0-C_kSlCBxVSlX5J8WDTwNGm6p5-QDxN2bU9fwglzmggMst-4A3tLlPLQRnttuishFKhgr40ABHX8tksNfbs626YhTiwY6vD6_Gn0k7X7jh1HsHAUUcnPZq2tCXRFUKNDmF_4lC6vc7-Cs5zHpIlKtaAXoQBRe9HYsEvYfK2tOey8T_3mDC_Eh36fcve6HCOQBt9EtFPRIUcKZgFDWPoG70t-ABk66Lr2BjejbOsBBnA9R7492t6Sg","correlation_id":"1fb572ff331346b7","user_id":"rCsti0h0G3UFfUi6CZ1b3I8Bf9R2"}'

ПолученоРасшифровка Python

b'\xae\xfa\x9c\xb3\x8c+\x17\xfeI\xc9\xb8\x0b\x0e@\xac\rhbGciOiJSUzI1NiIsImtpZCI6ImZhMWQ3NzBlZWY5ZWFhNjU0MzY1ZGE5MDhjNDIzY2NkNzY4ODkxMDUiLCJ0eXAiOiJKV1QifQ.eyJpc3MiOiJodHRwczovL3NlY3VyZXRva2VuLmdvb2dsZS5jb20vY2hhdHEtc3RhZ2luZyIsImF1ZCI6ImNoYXRxLXN0YWdpbmciLCJhdXRoX3RpbWUiOjE1NzExMjM5NDcsInVzZXJfaWQiOiJyQ3N0aTBoMEczVUZmVWk2Q1oxYjNJOEJmOVIyIiwic3ViIjoickNzdGkwaDBHM1VGZlVpNkNaMWIzSThCZjlSMiIsImlhdCI6MTU3MTIwMjY4OSwiZXhwIjoxNTcxMjA2Mjg5LCJwaG9uZV9udW1iZXIiOiIrODQxMjM0NTY3ODIiLCJmaXJlYmFzZSI6eyJpZGVudGl0aWVzIjp7InBob25lIjpbIis4NDEyMzQ1Njc4MiJdfSwic2lnbl9pbl9wcm92aWRlciI6InBob25lIn19.0OCskQkPKq5yxku02PuBgoZMFHgMfZBVPptQaVExrWYRDrEM3uUwDrDXAWiqA6L9i54fg_7dfWBwnPvQ71g4Lzsft60_JycS0-C_kSlCBxVSlX5J8WDTwNGm6p5-QDxN2bU9fwglzmggMst-4A3tLlPLQRnttuishFKhgr40ABHX8tksNfbs626YhTiwY6vD6_Gn0k7X7jh1HsHAUUcnPZq2tCXRFUKNDmF_4lC6vc7-Cs5zHpIlKtaAXoQBRe9HYsEvYfK2tOey8T_3mDC_Eh36fcve6HCOQBt9EtFPRIUcKZgFDWPoG70t-ABk66Lr2BjejbOsBBnA9R7492t6Sg","correlation_id":"1fb572ff331346b7","user_id":"rCsti0h0G3UFfUi6CZ1b3I8Bf9R2"}'

По сути, начало перепутано:

{"auth_key":"eyJ != \xae\xfa\x9c\xb3\x8c+\x17\xfeI\xc9\xb8\x0b\x0e@\xac\r

Дайте мне знать в комментарии, если я что-то пропустил: -)

...