Navicat view password Java

Export link

Take navicat15 as an example, click File on the menu bar, select Export Connection…, Be sure to select Export Password! ! ! The export format is *.ncx (the ncx is essentially an xml file, which contains all the information of the connection)
?
?

Open the exported file with a text editor and find the encrypted password

Run code

import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import javax.xml.bind.DatatypeConverter;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.util.Arrays;

public class Main {<!-- -->
public static void main(String []args) {<!-- -->
        //navicat11 decryption
        Navicat11Cipher de = new Navicat11Cipher();
        System.out.println(de.decryptString("15057D7BA390"));
        //navicat12 decryption
        Navicat12Cipher de12 = new Navicat12Cipher();
        System.out.println(de12.decryptString("503AA930968F877F04770B47DD731DC0"));
    }
    static class Navicat11Cipher {<!-- -->
        public static final String DefaultUserKey = "3DC5CA39";
        private static byte[] _IV;

        private static SecretKeySpec_Key;
        private static Cipher_Encryptor;
        private static Cipher _Decryptor;

        private static void initKey(String UserKey) {<!-- -->
            try {<!-- -->
                MessageDigest sha1 = MessageDigest. getInstance("SHA1");
                byte[] userkey_data = UserKey.getBytes(StandardCharsets.UTF_8);
                sha1.update(userkey_data, 0, userkey_data.length);
                _Key = new SecretKeySpec(sha1. digest(), "Blowfish");
            } catch (Exception e) {<!-- -->
                e.printStackTrace();
            }
        }

        private static void initChiperEncrypt() {<!-- -->
            try {<!-- -->
                // Must use NoPadding
                _Encryptor = Cipher. getInstance("Blowfish/ECB/NoPadding");
                _Encryptor.init(Cipher.ENCRYPT_MODE, _Key);
            } catch (Exception e) {<!-- -->
                e.printStackTrace();
            }
        }

        private static void initChiperDecrypt() {<!-- -->
            try {<!-- -->
                // Must use NoPadding
                _Decryptor = Cipher.getInstance("Blowfish/ECB/NoPadding");
                _Decryptor.init(Cipher.DECRYPT_MODE, _Key);
            } catch (Exception e) {<!-- -->
                e.printStackTrace();
            }
        }

        private static void initIV() {<!-- -->
            try {<!-- -->
                byte[] initVec = DatatypeConverter. parseHexBinary("FFFFFFFFFFFFFFFF");
                _IV = _Encryptor. doFinal(initVec);
            } catch (Exception e) {<!-- -->
                e.printStackTrace();
            }
        }

        private void xorBytes(byte[] a, byte[] b) {<!-- -->
            for (int i = 0; i < a.length; i ++ ) {<!-- -->
                int aVal = a[i] & amp; 0xff; // convert byte to integer
                int bVal = b[i] & 0xff;
                a[i] = (byte) (aVal ^ bVal); // xor aVal and bVal and typecast to byte
            }
        }

        private void xorBytes(byte[] a, byte[] b, int l) {<!-- -->
            for (int i = 0; i < l; i ++ ) {<!-- -->
                int aVal = a[i] & amp; 0xff; // convert byte to integer
                int bVal = b[i] & 0xff;
                a[i] = (byte) (aVal ^ bVal); // xor aVal and bVal and typecast to byte
            }
        }

        static {<!-- -->
            initKey(DefaultUserKey);
            initChiperEncrypt();
            initChiperDecrypt();
            initIV();
        }

        private byte[] Encrypt(byte[] inData) {<!-- -->
            try {<!-- -->
                byte[] CV = Arrays.copyOf(_IV, _IV.length);
                byte[] ret = new byte[inData. length];

                int blocks_len = inData. length / 8;
                int left_len = inData. length % 8;

                for (int i = 0; i < blocks_len; i ++ ) {<!-- -->
                    byte[] temp = Arrays.copyOfRange(inData, i * 8, (i * 8) + 8);

                    xorBytes(temp, CV);
                    temp = _Encryptor.doFinal(temp);
                    xorBytes(CV, temp);

                    System.arraycopy(temp, 0, ret, i * 8, 8);
                }

                if (left_len != 0) {<!-- -->
                    CV = _Encryptor. doFinal(CV);
                    byte[] temp = Arrays.copyOfRange(inData, blocks_len * 8, (blocks_len * 8) + left_len);
                    xorBytes(temp, CV, left_len);
                    System.arraycopy(temp, 0, ret, blocks_len * 8, temp.length);
                }

                return ret;
            } catch (Exception e) {<!-- -->
                e.printStackTrace();
                return null;
            }
        }

        public String encryptString(String inputString) {<!-- -->
            try {<!-- -->
                byte[] inData = inputString.getBytes(StandardCharsets.UTF_8);
                byte[] outData = Encrypt(inData);
                return DatatypeConverter. printHexBinary(outData);
            } catch (Exception e) {<!-- -->
                e.printStackTrace();
                return "";
            }
        }

        private byte[] Decrypt(byte[] inData) {<!-- -->
            try {<!-- -->
                byte[] CV = Arrays.copyOf(_IV, _IV.length);
                byte[] ret = new byte[inData. length];

                int blocks_len = inData. length / 8;
                int left_len = inData. length % 8;

                for (int i = 0; i < blocks_len; i ++ ) {<!-- -->
                    byte[] temp = Arrays.copyOfRange(inData, i * 8, (i * 8) + 8);

                    temp = _Decryptor.doFinal(temp);
                    xorBytes(temp, CV);
                    System.arraycopy(temp, 0, ret, i * 8, 8);
                    for (int j = 0; j < CV. length; j ++ ) {<!-- -->
                        CV[j] = (byte) (CV[j] ^ inData[i * 8 + j]);
                    }
                }

                if (left_len != 0) {<!-- -->
                    CV = _Encryptor. doFinal(CV);
                    byte[] temp = Arrays.copyOfRange(inData, blocks_len * 8, (blocks_len * 8) + left_len);

                    xorBytes(temp, CV, left_len);
                    for (int j = 0; j < temp. length; j ++ ) {<!-- -->
                        ret[blocks_len * 8 + j] = temp[j];
                    }
                }

                return ret;
            } catch (Exception e) {<!-- -->
                e.printStackTrace();
                return null;
            }
        }

        public String decryptString(String hexString) {<!-- -->
            try {<!-- -->
                byte[] inData = DatatypeConverter. parseHexBinary(hexString);
                byte[] outData = Decrypt(inData);
                return new String(outData, StandardCharsets. UTF_8);
            } catch (Exception e) {<!-- -->
                e.printStackTrace();
                return "";
            }
        }
    }
    static class Navicat12Cipher {<!-- -->
        private static SecretKeySpec _AesKey;
        private static IvParameterSpec _AesIV;

        static {<!-- -->
            _AesKey = new SecretKeySpec("libcckeylibcckey".getBytes(StandardCharsets.UTF_8), "AES");
            _AesIV = new IvParameterSpec("libcciv libcciv ".getBytes(StandardCharsets.UTF_8));
        }

        public String encryptString(String plaintext) {<!-- -->
            try {<!-- -->
                Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
                cipher.init(Cipher.ENCRYPT_MODE, _AesKey, _AesIV);
                byte[] ret = cipher.doFinal(plaintext.getBytes(StandardCharsets.UTF_8));
                return DatatypeConverter.printHexBinary(ret);
            } catch (Exception e) {<!-- -->
                e.printStackTrace();
                return "";
            }
        }

        public String decryptString(String ciphertext) {<!-- -->
            try {<!-- -->
                Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
                cipher.init(Cipher.DECRYPT_MODE, _AesKey, _AesIV);
                byte[] ret = cipher.doFinal(DatatypeConverter.parseHexBinary(ciphertext));
                return new String(ret, StandardCharsets. UTF_8);
            } catch (Exception e) {<!-- -->
                e.printStackTrace();
                return "";
            }
        }
    }
}