code: def _jce_invert_salt_half(salt_half):
      
      salt = bytearray(salt_half)
      salt[2] = salt[1]
      salt[1] = salt[0]
      salt[0] = salt[3]
      return bytes(salt)
docs: JCE's proprietary PBEWithMD5AndTripleDES algorithm as described in the OpenJDK sources calls for inverting the first salt half if the two halves are equal.
      However, there appears to be a bug in the original JCE implementation of com.sun.crypto.provider.PBECipherCore causing it to perform a different operation:
  
        for (i=0; i<2; i++) {
            byte tmp = salt[i];
            salt[i] = salt[3-i];
            salt[3-1] = tmp;     // <-- typo '1' instead of 'i'
        }
  
      The result is transforming [a,b,c,d] into [d,a,b,d] instead of [d,c,b,a] (verified going back to the original JCE 1.2.2 release for JDK 1.2).
      See source (or bytecode) of com.sun.crypto.provider.PBECipherCore (JRE <= 7) and com.sun.crypto.provider.PBES1Core (JRE 8+):