217 lines
8.3 KiB
Java
217 lines
8.3 KiB
Java
|
package org.bouncycastle.crypto.examples;
|
||
|
|
||
|
import java.io.BufferedInputStream;
|
||
|
import java.io.BufferedOutputStream;
|
||
|
import java.io.BufferedReader;
|
||
|
import java.io.FileInputStream;
|
||
|
import java.io.FileNotFoundException;
|
||
|
import java.io.FileOutputStream;
|
||
|
import java.io.IOException;
|
||
|
import java.io.InputStreamReader;
|
||
|
import java.io.PrintStream;
|
||
|
import java.security.SecureRandom;
|
||
|
import org.bouncycastle.crypto.CryptoException;
|
||
|
import org.bouncycastle.crypto.KeyGenerationParameters;
|
||
|
import org.bouncycastle.crypto.engines.DESedeEngine;
|
||
|
import org.bouncycastle.crypto.generators.DESedeKeyGenerator;
|
||
|
import org.bouncycastle.crypto.modes.CBCBlockCipher;
|
||
|
import org.bouncycastle.crypto.paddings.PaddedBufferedBlockCipher;
|
||
|
import org.bouncycastle.crypto.params.KeyParameter;
|
||
|
import org.bouncycastle.util.encoders.Hex;
|
||
|
|
||
|
/* loaded from: classes6.dex */
|
||
|
public class DESExample {
|
||
|
private PaddedBufferedBlockCipher cipher;
|
||
|
private boolean encrypt;
|
||
|
private BufferedInputStream in;
|
||
|
private byte[] key;
|
||
|
private BufferedOutputStream out;
|
||
|
|
||
|
private void process() {
|
||
|
this.cipher = new PaddedBufferedBlockCipher(new CBCBlockCipher(new DESedeEngine()));
|
||
|
if (this.encrypt) {
|
||
|
performEncrypt(this.key);
|
||
|
} else {
|
||
|
performDecrypt(this.key);
|
||
|
}
|
||
|
try {
|
||
|
this.in.close();
|
||
|
this.out.flush();
|
||
|
this.out.close();
|
||
|
} catch (IOException unused) {
|
||
|
}
|
||
|
}
|
||
|
|
||
|
private void performEncrypt(byte[] bArr) {
|
||
|
this.cipher.init(true, new KeyParameter(bArr));
|
||
|
byte[] bArr2 = new byte[47];
|
||
|
byte[] bArr3 = new byte[this.cipher.getOutputSize(47)];
|
||
|
while (true) {
|
||
|
try {
|
||
|
int read = this.in.read(bArr2, 0, 47);
|
||
|
if (read <= 0) {
|
||
|
break;
|
||
|
}
|
||
|
int processBytes = this.cipher.processBytes(bArr2, 0, read, bArr3, 0);
|
||
|
if (processBytes > 0) {
|
||
|
byte[] encode = Hex.encode(bArr3, 0, processBytes);
|
||
|
this.out.write(encode, 0, encode.length);
|
||
|
this.out.write(10);
|
||
|
}
|
||
|
} catch (IOException | CryptoException unused) {
|
||
|
return;
|
||
|
}
|
||
|
}
|
||
|
int doFinal = this.cipher.doFinal(bArr3, 0);
|
||
|
if (doFinal > 0) {
|
||
|
byte[] encode2 = Hex.encode(bArr3, 0, doFinal);
|
||
|
this.out.write(encode2, 0, encode2.length);
|
||
|
this.out.write(10);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
private void performDecrypt(byte[] bArr) {
|
||
|
this.cipher.init(false, new KeyParameter(bArr));
|
||
|
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(this.in));
|
||
|
byte[] bArr2 = null;
|
||
|
while (true) {
|
||
|
try {
|
||
|
String readLine = bufferedReader.readLine();
|
||
|
if (readLine == null) {
|
||
|
break;
|
||
|
}
|
||
|
byte[] decode = Hex.decode(readLine);
|
||
|
bArr2 = new byte[this.cipher.getOutputSize(decode.length)];
|
||
|
int processBytes = this.cipher.processBytes(decode, 0, decode.length, bArr2, 0);
|
||
|
if (processBytes > 0) {
|
||
|
this.out.write(bArr2, 0, processBytes);
|
||
|
}
|
||
|
} catch (IOException | CryptoException unused) {
|
||
|
return;
|
||
|
}
|
||
|
}
|
||
|
int doFinal = this.cipher.doFinal(bArr2, 0);
|
||
|
if (doFinal > 0) {
|
||
|
this.out.write(bArr2, 0, doFinal);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public static void main(String[] strArr) {
|
||
|
String str;
|
||
|
boolean z = true;
|
||
|
if (strArr.length < 2) {
|
||
|
DESExample dESExample = new DESExample();
|
||
|
PrintStream printStream = System.err;
|
||
|
StringBuilder sb = new StringBuilder("Usage: java ");
|
||
|
sb.append(dESExample.getClass().getName());
|
||
|
sb.append(" infile outfile [keyfile]");
|
||
|
printStream.println(sb.toString());
|
||
|
System.exit(1);
|
||
|
}
|
||
|
String str2 = strArr[0];
|
||
|
String str3 = strArr[1];
|
||
|
if (strArr.length > 2) {
|
||
|
str = strArr[2];
|
||
|
z = false;
|
||
|
} else {
|
||
|
str = "deskey.dat";
|
||
|
}
|
||
|
new DESExample(str2, str3, str, z).process();
|
||
|
}
|
||
|
|
||
|
public DESExample(String str, String str2, String str3, boolean z) {
|
||
|
PrintStream printStream;
|
||
|
StringBuilder sb;
|
||
|
SecureRandom secureRandom;
|
||
|
SecureRandom secureRandom2 = null;
|
||
|
this.cipher = null;
|
||
|
this.in = null;
|
||
|
this.out = null;
|
||
|
this.key = null;
|
||
|
this.encrypt = z;
|
||
|
try {
|
||
|
this.in = new BufferedInputStream(new FileInputStream(str));
|
||
|
} catch (FileNotFoundException unused) {
|
||
|
PrintStream printStream2 = System.err;
|
||
|
StringBuilder sb2 = new StringBuilder("Input file not found [");
|
||
|
sb2.append(str);
|
||
|
sb2.append("]");
|
||
|
printStream2.println(sb2.toString());
|
||
|
System.exit(1);
|
||
|
}
|
||
|
try {
|
||
|
this.out = new BufferedOutputStream(new FileOutputStream(str2));
|
||
|
} catch (IOException unused2) {
|
||
|
PrintStream printStream3 = System.err;
|
||
|
StringBuilder sb3 = new StringBuilder("Output file not created [");
|
||
|
sb3.append(str2);
|
||
|
sb3.append("]");
|
||
|
printStream3.println(sb3.toString());
|
||
|
System.exit(1);
|
||
|
}
|
||
|
if (z) {
|
||
|
try {
|
||
|
try {
|
||
|
secureRandom = new SecureRandom();
|
||
|
} catch (Exception unused3) {
|
||
|
}
|
||
|
try {
|
||
|
secureRandom.setSeed("www.bouncycastle.org".getBytes());
|
||
|
} catch (Exception unused4) {
|
||
|
secureRandom2 = secureRandom;
|
||
|
System.err.println("Hmmm, no SHA1PRNG, you need the Sun implementation");
|
||
|
System.exit(1);
|
||
|
secureRandom = secureRandom2;
|
||
|
KeyGenerationParameters keyGenerationParameters = new KeyGenerationParameters(secureRandom, 192);
|
||
|
DESedeKeyGenerator dESedeKeyGenerator = new DESedeKeyGenerator();
|
||
|
dESedeKeyGenerator.init(keyGenerationParameters);
|
||
|
this.key = dESedeKeyGenerator.generateKey();
|
||
|
BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(new FileOutputStream(str3));
|
||
|
byte[] encode = Hex.encode(this.key);
|
||
|
bufferedOutputStream.write(encode, 0, encode.length);
|
||
|
bufferedOutputStream.flush();
|
||
|
bufferedOutputStream.close();
|
||
|
return;
|
||
|
}
|
||
|
KeyGenerationParameters keyGenerationParameters2 = new KeyGenerationParameters(secureRandom, 192);
|
||
|
DESedeKeyGenerator dESedeKeyGenerator2 = new DESedeKeyGenerator();
|
||
|
dESedeKeyGenerator2.init(keyGenerationParameters2);
|
||
|
this.key = dESedeKeyGenerator2.generateKey();
|
||
|
BufferedOutputStream bufferedOutputStream2 = new BufferedOutputStream(new FileOutputStream(str3));
|
||
|
byte[] encode2 = Hex.encode(this.key);
|
||
|
bufferedOutputStream2.write(encode2, 0, encode2.length);
|
||
|
bufferedOutputStream2.flush();
|
||
|
bufferedOutputStream2.close();
|
||
|
return;
|
||
|
} catch (IOException unused5) {
|
||
|
printStream = System.err;
|
||
|
sb = new StringBuilder("Could not decryption create key file [");
|
||
|
}
|
||
|
} else {
|
||
|
try {
|
||
|
BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream(str3));
|
||
|
int available = bufferedInputStream.available();
|
||
|
byte[] bArr = new byte[available];
|
||
|
bufferedInputStream.read(bArr, 0, available);
|
||
|
this.key = Hex.decode(bArr);
|
||
|
return;
|
||
|
} catch (IOException unused6) {
|
||
|
printStream = System.err;
|
||
|
sb = new StringBuilder("Decryption key file not found, or not valid [");
|
||
|
}
|
||
|
}
|
||
|
sb.append(str3);
|
||
|
sb.append("]");
|
||
|
printStream.println(sb.toString());
|
||
|
System.exit(1);
|
||
|
}
|
||
|
|
||
|
public DESExample() {
|
||
|
this.encrypt = true;
|
||
|
this.cipher = null;
|
||
|
this.in = null;
|
||
|
this.out = null;
|
||
|
this.key = null;
|
||
|
}
|
||
|
}
|