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