CryptoMessage v1.3.2版本的 MD5 值为:66c611ce56a11450659dc23697562928

以下内容为反编译后的 CryptoApiTest.java 源代码,内容仅作参考


package org.jivesoftware.smack.csp.test;

import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.ByteBuffer;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.security.Security;
import java.security.cert.CertificateException;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;
import java.util.ArrayList;
import java.util.List;
import kz.gamma.core.UtilCM;
import kz.gamma.jce.exception.CSPException;
import kz.gamma.jce.provider.GammaTechProvider;
import kz.gamma.tumarcsp.LibraryWrapper;
import kz.gamma.tumarcsp.TumarCspFunctions;
import org.jivesoftware.smack.csp.exeption.DecryptionException;
import org.jivesoftware.smack.csp.exeption.EncryptionException;
import org.jivesoftware.smack.util.StringUtils;

public class CryptoApiTest {
    public static final byte[] intToByteArray(int i) {
        return new byte[]{(byte) (i >>> 24), (byte) (i >>> 16), (byte) (i >>> 8), (byte) i};
    }

    public static void main(String[] strArr) {
        try {
            Security.addProvider(new GammaTechProvider());
            String symmetricDecryptText = symmetricDecryptText("F4D061D4FF6E6600A2C598", "1q2w3e4r");
            System.out.println(">>>>> decrypt: " + symmetricDecryptText);
            String symmetricEncryptText = symmetricEncryptText("test string", "1q2w3e4r");
            System.out.println(">>>> encrypt: " + symmetricEncryptText);
            String symmetricDecryptText2 = symmetricDecryptText(symmetricEncryptText, "1q2w3e4r");
            System.out.println(">>>>> decrypt: " + symmetricDecryptText2);
            File file = new File("D:\\cryptobug.txt");
            File file2 = new File("D:\\encrypt.bin");
            String[] strArr2 = {"D:\\978EB8D304BF87354576A72640A207F09A798FC5A74C193B82DE5876C32E08D8.cer"};
            FileInputStream fileInputStream = new FileInputStream(file);
            try {
                FileOutputStream fileOutputStream = new FileOutputStream(file2);
                try {
                    encryptFile(fileInputStream, fileOutputStream, getCert(strArr2));
                    $closeResource(null, fileOutputStream);
                    $closeResource(null, fileInputStream);
                } finally {
                }
            } finally {
            }
        } catch (Exception e) {
            System.out.println(">>>> File Encrypt ERROR " + e.getMessage());
        }
    }

    private static void $closeResource(Throwable th, AutoCloseable autoCloseable) {
        if (th == null) {
            autoCloseable.close();
            return;
        }
        try {
            autoCloseable.close();
        } catch (Throwable th2) {
            th.addSuppressed(th2);
        }
    }

    public static String createFileName(String str) {
        int lastIndexOf = str.lastIndexOf(".");
        if (lastIndexOf > 0) {
            return str.substring(0, lastIndexOf) + StringUtils.randomString(3) + str.substring(lastIndexOf);
        }
        return str + StringUtils.randomString(5);
    }

    public static List<X509Certificate> getCert(String[] strArr) throws IOException {
        ArrayList arrayList = new ArrayList();
        for (int i = 0; i != strArr.length; i++) {
            arrayList.add(getX509CertificateFromFile(strArr[i]));
        }
        return arrayList;
    }

    public static byte[] encryptEx(String str, String str2, List<X509Certificate> list) throws Exception {
        Number number;
        Number number2;
        FileInputStream fileInputStream;
        Throwable th;
        Throwable th2;
        Number number3;
        Number number4;
        byte[] cpExportKeyData;
        try {
            fileInputStream = new FileInputStream(str);
            try {
                FileOutputStream fileOutputStream = new FileOutputStream(str2);
                try {
                    number2 = TumarCspFunctions.cpAcquireContext("", -268435456, LibraryWrapper.PV_TABLE);
                    try {
                        number = TumarCspFunctions.cpGenKey(number2, 26655, 1);
                        try {
                            int available = fileInputStream.available();
                            int i = 8192;
                            byte[] bArr = new byte[8192];
                            int read = fileInputStream.read(bArr, 0, 8192);
                            int i2 = 0;
                            while (read > 0) {
                                try {
                                    byte[] bArr2 = new byte[read];
                                    System.arraycopy(bArr, 0, bArr2, 0, read);
                                    int read2 = fileInputStream.read(bArr, 0, i);
                                    int i3 = read2 <= 0 ? 1 : i2;
                                    byte[] bArr3 = bArr;
                                    int i4 = i;
                                    fileOutputStream.write(TumarCspFunctions.cpEncrypt(number2, number, (Number) 0, i3, 0, bArr2, read, available));
                                    read = read2;
                                    i2 = i3;
                                    i = i4;
                                    bArr = bArr3;
                                } catch (Throwable th3) {
                                    th = th3;
                                    th2 = th;
                                    try {
                                        throw th2;
                                    } catch (Throwable th4) {
                                        try {
                                            $closeResource(th2, fileOutputStream);
                                            throw th4;
                                        } catch (Throwable th5) {
                                            th = th5;
                                            try {
                                                throw th;
                                            } catch (Throwable th6) {
                                                try {
                                                    try {
                                                        $closeResource(th, fileInputStream);
                                                        throw th6;
                                                    } catch (CSPException unused) {
                                                        throw new EncryptionException();
                                                    }
                                                } catch (Throwable th7) {
                                                    th = th7;
                                                    destroy(number2, number, 0);
                                                    throw th;
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                            int i5 = read;
                            for (X509Certificate x509Certificate : list) {
                                if (x509Certificate != null) {
                                    if (x509Certificate.getKeyUsage()[3]) {
                                        Number cpImportKey = TumarCspFunctions.cpImportKey(number2, x509Certificate.getEncoded(), x509Certificate.getEncoded().length, (Number) 0, 0);
                                        number3 = number;
                                        number4 = number2;
                                        try {
                                            TumarCspFunctions.cpExportKeyDataEx(number2, number, cpImportKey, 80, 33554432, i5 + (list.size() * 1024));
                                            TumarCspFunctions.cpDestroyKey(number4, cpImportKey);
                                        } catch (Throwable th8) {
                                            th2 = th8;
                                            number = number3;
                                            number2 = number4;
                                            throw th2;
                                        }
                                    } else {
                                        number3 = number;
                                        number4 = number2;
                                    }
                                    number = number3;
                                    number2 = number4;
                                }
                            }
                            number3 = number;
                            number4 = number2;
                            TumarCspFunctions.cpExportKeyData(number4, number3, (Number) 0, 80, 0);
                            cpExportKeyData = TumarCspFunctions.cpExportKeyData(number4, number3, (Number) 0, 80, 0);
                            try {
                                $closeResource(null, fileOutputStream);
                            } catch (Throwable th9) {
                                th = th9;
                                number = number3;
                                number2 = number4;
                                throw th;
                            }
                        } catch (Throwable th10) {
                            th = th10;
                        }
                    } catch (Throwable th11) {
                        th2 = th11;
                        number = 0;
                    }
                } catch (Throwable th12) {
                    th2 = th12;
                    number = 0;
                    number2 = null;
                }
            } catch (Throwable th13) {
                th = th13;
                number = 0;
                number2 = null;
            }
        } catch (CSPException unused2) {
            number = 0;
            number2 = null;
        } catch (Throwable th14) {
            th = th14;
            number = 0;
            number2 = null;
        }
        try {
            $closeResource(null, fileInputStream);
            destroy(number4, number3, 0);
            return cpExportKeyData;
        } catch (CSPException unused3) {
            number = number3;
            number2 = number4;
            throw new EncryptionException();
        } catch (Throwable th15) {
            th = th15;
            number = number3;
            number2 = number4;
            destroy(number2, number, 0);
            throw th;
        }
    }

    public static boolean encryptFile(InputStream inputStream, OutputStream outputStream, List<X509Certificate> list) throws Exception {
        Number number;
        Number number2;
        Number number3;
        Number number4;
        int i;
        Number number5;
        boolean z;
        Number number6;
        int i2 = 0;
        try {
            number2 = TumarCspFunctions.cpAcquireContext("", -268435456, LibraryWrapper.PV_TABLE);
            boolean z2 = true;
            try {
                number = TumarCspFunctions.cpGenKey(number2, 26655, 1);
                int i3 = 3;
                try {
                    byte[] cpEncrypt = TumarCspFunctions.cpEncrypt(number2, number, (Number) 0, 1, 0, new byte[]{97, 98, 99}, 3, 3);
                    TumarCspFunctions.cpSetKeyParam(number2, number, 110, UtilCM.intToByte(cpEncrypt.length, LibraryWrapper.SUN_CPU_ENDIAN), 0);
                    TumarCspFunctions.cpSetKeyParam(number2, number, 111, cpEncrypt, 0);
                    for (X509Certificate x509Certificate : list) {
                        try {
                            if (x509Certificate != null) {
                                if (x509Certificate.getKeyUsage()[i3]) {
                                    Number cpImportKey = TumarCspFunctions.cpImportKey(number2, x509Certificate.getEncoded(), x509Certificate.getEncoded().length, (Number) 0, 0);
                                    i = i3;
                                    number5 = number;
                                    z = z2;
                                    number6 = number2;
                                    try {
                                        TumarCspFunctions.cpExportKeyDataEx(number2, number, cpImportKey, 80, 33554432, i3 + (list.size() * 2048));
                                        TumarCspFunctions.cpDestroyKey(number6, cpImportKey);
                                    } catch (Exception e) {
                                        e = e;
                                        number2 = number6;
                                        number = number5;
                                        try {
                                            System.out.println(e.getMessage());
                                            destroy(number2, number, 0);
                                            return false;
                                        } catch (Throwable th) {
                                            th = th;
                                            destroy(number2, number, 0);
                                            throw th;
                                        }
                                    } catch (Throwable th2) {
                                        th = th2;
                                        number2 = number6;
                                        number = number5;
                                        destroy(number2, number, 0);
                                        throw th;
                                    }
                                } else {
                                    i = i3;
                                    number5 = number;
                                    z = z2;
                                    number6 = number2;
                                }
                                i3 = i;
                                number2 = number6;
                                number = number5;
                                z2 = z;
                            }
                        } catch (Exception e2) {
                            e = e2;
                        } catch (Throwable th3) {
                            th = th3;
                        }
                    }
                    Number number7 = number;
                    boolean z3 = z2;
                    Number number8 = number2;
                    try {
                        byte[] cpExportKeyData = TumarCspFunctions.cpExportKeyData(number8, number7, (Number) 0, 80, 0);
                        outputStream.write(intToByteArray(cpExportKeyData.length));
                        outputStream.write(cpExportKeyData);
                        int i4 = 1048576;
                        byte[] bArr = new byte[1048576];
                        int read = inputStream.read(bArr, 0, 1048576);
                        boolean z4 = false;
                        while (read > 0) {
                            byte[] bArr2 = new byte[read];
                            System.arraycopy(bArr, i2, bArr2, i2, read);
                            int read2 = inputStream.read(bArr, i2, i4);
                            boolean z5 = read2 <= 0 ? z3 : z4;
                            number3 = number8;
                            number4 = number7;
                            try {
                                outputStream.write(TumarCspFunctions.cpEncrypt(number8, number7, (Number) 0, z5 ? 1 : 0, 0, bArr2, read, read));
                                number7 = number4;
                                number8 = number3;
                                read = read2;
                                z4 = z5;
                                i2 = 0;
                                i4 = 1048576;
                            } catch (Exception e3) {
                                e = e3;
                                number = number4;
                                number2 = number3;
                                System.out.println(e.getMessage());
                                destroy(number2, number, 0);
                                return false;
                            } catch (Throwable th4) {
                                th = th4;
                                number = number4;
                                number2 = number3;
                                destroy(number2, number, 0);
                                throw th;
                            }
                        }
                        destroy(number8, number7, 0);
                        return z3;
                    } catch (Exception e4) {
                        e = e4;
                        number3 = number8;
                        number4 = number7;
                    } catch (Throwable th5) {
                        th = th5;
                        number3 = number8;
                        number4 = number7;
                    }
                } catch (Exception e5) {
                    e = e5;
                } catch (Throwable th6) {
                    th = th6;
                }
            } catch (Exception e6) {
                e = e6;
                number = 0;
            } catch (Throwable th7) {
                th = th7;
                number = 0;
            }
        } catch (Exception e7) {
            e = e7;
            number = 0;
            number2 = null;
        } catch (Throwable th8) {
            th = th8;
            number = 0;
            number2 = null;
        }
    }

    public static byte[] decrypt(byte[] bArr, FileOutputStream fileOutputStream, List<X509Certificate> list) {
        Number number;
        Number number2;
        Number number3;
        Number cpImportKey;
        Number cpImportKey2;
        int i;
        int i2;
        ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bArr);
        Number number4 = 0;
        try {
            Number cpAcquireContext = TumarCspFunctions.cpAcquireContext("file://user_GOST:hex=72AE0D96299C558938B332E80EBBCBF215B56E44F76E6E00B7BC2D482D638B535ECD4E0A3664A515D38AE062590F01AFB2B5987172A074C11B03F09613C7BBC592CE9EEB28B4EACE@/C:%5CUsers%5Cd_ermolaev%5CCryptoMessage2%5CTumarCSP?salg=1.3.6.1.4.1.6801.1.5.8", 0, LibraryWrapper.PV_TABLE);
            try {
                while (true) {
                    number = number4;
                    Number number5 = number;
                    for (X509Certificate x509Certificate : list) {
                        try {
                            if (x509Certificate == null) {
                                break;
                            }
                            if (x509Certificate.getKeyUsage()[3]) {
                                try {
                                    cpImportKey = TumarCspFunctions.cpImportKey(cpAcquireContext, x509Certificate.getPublicKey().getEncoded(), x509Certificate.getPublicKey().getEncoded().length, number4, 0);
                                    try {
                                        cpImportKey2 = TumarCspFunctions.cpImportKey(cpAcquireContext, bArr, bArr.length, cpImportKey, 0);
                                        i = 8192;
                                    } catch (Exception e) {
                                        e = e;
                                        number = number4;
                                        number5 = cpImportKey;
                                    } catch (Throwable th) {
                                        th = th;
                                        number = number4;
                                        number3 = cpImportKey;
                                        number4 = cpAcquireContext;
                                        number2 = number3;
                                        destroy(number4, number, number2);
                                        throw th;
                                    }
                                } catch (Exception e2) {
                                    e = e2;
                                    number = number4;
                                    number5 = number;
                                }
                                try {
                                    byte[] bArr2 = new byte[8192];
                                    int read = byteArrayInputStream.read(bArr2, 0, 8192);
                                    while (true) {
                                        i2 = read;
                                        if (i2 != i) {
                                            break;
                                        }
                                        byte[] bArr3 = bArr2;
                                        fileOutputStream.write(TumarCspFunctions.cpDecrypt(cpAcquireContext, cpImportKey2, number4, 0, 0, bArr2, 8192), 0, i2);
                                        i = 8192;
                                        read = byteArrayInputStream.read(bArr3, 0, 8192);
                                        bArr2 = bArr3;
                                    }
                                    fileOutputStream.write(TumarCspFunctions.cpDecrypt(cpAcquireContext, cpImportKey2, number4, 1, 0, bArr2, i2));
                                    number5 = cpImportKey;
                                    number = cpImportKey2;
                                } catch (Exception e3) {
                                    e = e3;
                                    number5 = cpImportKey;
                                    number = cpImportKey2;
                                    e.printStackTrace();
                                } catch (Throwable th2) {
                                    th = th2;
                                    number4 = cpAcquireContext;
                                    number = cpImportKey2;
                                    number2 = cpImportKey;
                                    destroy(number4, number, number2);
                                    throw th;
                                }
                            }
                        } catch (Throwable th3) {
                            th = th3;
                            number3 = number5;
                        }
                    }
                    destroy(cpAcquireContext, number, number5);
                    return null;
                }
            } catch (Throwable th4) {
                th = th4;
                number = number4;
                number3 = number;
            }
        } catch (Throwable th5) {
            th = th5;
            number = number4;
            number2 = number;
        }
    }

    public static byte[] encrypt(byte[] bArr, List<X509Certificate> list) throws Exception {
        Number number;
        Number number2;
        Number number3;
        Number number4;
        try {
            number2 = TumarCspFunctions.cpAcquireContext("", -268435456, LibraryWrapper.PV_TABLE);
            try {
                number = TumarCspFunctions.cpGenKey(number2, 26655, 1);
                try {
                    byte[] cpEncrypt = TumarCspFunctions.cpEncrypt(number2, number, (Number) 0, 1, 0, bArr, bArr.length, bArr.length);
                    TumarCspFunctions.cpSetKeyParam(number2, number, 110, UtilCM.intToByte(cpEncrypt.length, LibraryWrapper.SUN_CPU_ENDIAN), 0);
                    TumarCspFunctions.cpSetKeyParam(number2, number, 111, cpEncrypt, 0);
                    for (X509Certificate x509Certificate : list) {
                        if (x509Certificate != null) {
                            if (x509Certificate.getKeyUsage()[3]) {
                                Number cpImportKey = TumarCspFunctions.cpImportKey(number2, x509Certificate.getEncoded(), x509Certificate.getEncoded().length, (Number) 0, 0);
                                number3 = number;
                                number4 = number2;
                                try {
                                    TumarCspFunctions.cpExportKeyDataEx(number2, number, cpImportKey, 80, 0, TumarCspFunctions.cpExportKeySize(number2, number, cpImportKey, 80, 33554432));
                                    TumarCspFunctions.cpDestroyKey(number4, cpImportKey);
                                } catch (Throwable th) {
                                    th = th;
                                    number = number3;
                                    number2 = number4;
                                    destroy(number2, number, 0);
                                    throw th;
                                }
                            } else {
                                number3 = number;
                                number4 = number2;
                            }
                            number = number3;
                            number2 = number4;
                        }
                    }
                    number3 = number;
                    number4 = number2;
                    byte[] cpExportKeyData = TumarCspFunctions.cpExportKeyData(number4, number3, (Number) 0, 80, 0);
                    destroy(number4, number3, 0);
                    return cpExportKeyData;
                } catch (Throwable th2) {
                    th = th2;
                }
            } catch (Throwable th3) {
                th = th3;
                number = 0;
            }
        } catch (Throwable th4) {
            th = th4;
            number = 0;
            number2 = null;
        }
    }

    private static void destroy(Number number, Number number2, Number number3) {
        if (number2 != null && number2.intValue() != 0) {
            TumarCspFunctions.cpDestroyKey(number, number2);
        }
        if (number3 != null && number3.intValue() != 0) {
            TumarCspFunctions.cpDestroyHash(number, number3);
        }
        if (number == null || number.intValue() == 0) {
            return;
        }
        TumarCspFunctions.cpReleaseContext(number, 0);
    }

    public static String symmetricEncryptText(String str, String str2) throws EncryptionException {
        Number number;
        Number number2;
        byte[] bytes;
        Number cpAcquireContext;
        Number number3 = null;
        try {
            bytes = str.getBytes(StandardCharsets.UTF_8);
            cpAcquireContext = TumarCspFunctions.cpAcquireContext("", -268435456, (Number) 0);
            try {
                number2 = TumarCspFunctions.cpCreateHash(cpAcquireContext, 32797, (Number) 0, 0);
            } catch (Exception e) {
                e = e;
                number2 = null;
                number3 = cpAcquireContext;
                number = null;
            } catch (Throwable th) {
                th = th;
                number2 = null;
                number3 = cpAcquireContext;
                number = null;
            }
        } catch (Exception e2) {
            e = e2;
            number = null;
            number2 = null;
        } catch (Throwable th2) {
            th = th2;
            number = null;
            number2 = null;
        }
        try {
            TumarCspFunctions.cpHashData(cpAcquireContext, number2, str2.getBytes(StandardCharsets.UTF_8), str2.length(), 0);
            number3 = TumarCspFunctions.cpDeriveKey(cpAcquireContext, 26655, number2, 0);
            String array2hex = UtilCM.array2hex(TumarCspFunctions.cpEncrypt(cpAcquireContext, number3, (Number) 0, 1, 0, bytes, bytes.length, bytes.length));
            destroy(cpAcquireContext, number3, number2);
            return array2hex;
        } catch (Exception e3) {
            e = e3;
            Number number4 = number3;
            number3 = cpAcquireContext;
            number = number4;
            try {
                e.printStackTrace();
                throw new EncryptionException("Ошибка шифрования. ");
            } catch (Throwable th3) {
                th = th3;
                destroy(number3, number, number2);
                throw th;
            }
        } catch (Throwable th4) {
            th = th4;
            Number number5 = number3;
            number3 = cpAcquireContext;
            number = number5;
            destroy(number3, number, number2);
            throw th;
        }
    }

    public static synchronized String symmetricDecryptText(String str, String str2) throws Exception {
        Number number;
        Number number2;
        String charBuffer;
        synchronized (CryptoApiTest.class) {
            Number number3 = null;
            try {
                byte[] hex2array = UtilCM.hex2array(str);
                Number cpAcquireContext = TumarCspFunctions.cpAcquireContext("", -268435456, (Number) 0);
                try {
                    number2 = TumarCspFunctions.cpCreateHash(cpAcquireContext, 32797, (Number) 0, 0);
                    try {
                        TumarCspFunctions.cpHashData(cpAcquireContext, number2, str2.getBytes(StandardCharsets.UTF_8), str2.length(), 0);
                        number3 = TumarCspFunctions.cpDeriveKey(cpAcquireContext, 26655, number2, 0);
                        charBuffer = StandardCharsets.UTF_8.decode(ByteBuffer.wrap(TumarCspFunctions.cpDecrypt(cpAcquireContext, number3, (Number) 0, 1, 0, hex2array, hex2array.length))).toString();
                        destroy(cpAcquireContext, number3, number2);
                    } catch (Exception e) {
                        e = e;
                        Number number4 = number3;
                        number3 = cpAcquireContext;
                        number = number4;
                        try {
                            e.printStackTrace();
                            throw new DecryptionException("Ошибка шифрования.");
                        } catch (Throwable th) {
                            th = th;
                            destroy(number3, number, number2);
                            throw th;
                        }
                    } catch (Throwable th2) {
                        th = th2;
                        Number number5 = number3;
                        number3 = cpAcquireContext;
                        number = number5;
                        destroy(number3, number, number2);
                        throw th;
                    }
                } catch (Exception e2) {
                    e = e2;
                    number2 = null;
                    number3 = cpAcquireContext;
                    number = null;
                } catch (Throwable th3) {
                    th = th3;
                    number2 = null;
                    number3 = cpAcquireContext;
                    number = null;
                }
            } catch (Exception e3) {
                e = e3;
                number = null;
                number2 = null;
            } catch (Throwable th4) {
                th = th4;
                number = null;
                number2 = null;
            }
        }
        return charBuffer;
    }

    public static X509Certificate getX509CertificateFromFile(String str) throws IOException {
        return getX509FromBytes(Files.readAllBytes(Paths.get(str, new String[0])));
    }

    public static X509Certificate getX509FromBytes(byte[] bArr) {
        ByteArrayInputStream byteArrayInputStream;
        X509Certificate x509Certificate = null;
        try {
            byteArrayInputStream = new ByteArrayInputStream(bArr);
        } catch (IOException | CertificateException unused) {
        }
        try {
            X509Certificate x509Certificate2 = (X509Certificate) CertificateFactory.getInstance("X.509").generateCertificate(byteArrayInputStream);
            try {
                $closeResource(null, byteArrayInputStream);
                return x509Certificate2;
            } catch (IOException | CertificateException unused2) {
                x509Certificate = x509Certificate2;
                return x509Certificate;
            }
        } catch (Throwable th) {
            try {
                throw th;
            } catch (Throwable th2) {
                $closeResource(th, byteArrayInputStream);
                throw th2;
            }
        }
    }

    public static final int ByteArraytoInt(byte[] bArr) {
        return (bArr[3] & 255) + 0 + ((bArr[2] & 255) << 8) + ((bArr[1] & 255) << 16) + ((bArr[0] & 255) << 24);
    }
}