我将如何实施使用 Java 攻击 TripleDES 的暴力破解?
How would I implement brute-force that would attack TripleDES using Java?
我一直在从事我的科学项目,当时我想进行一项实验,通过暴力破解来测试 TripleDES 的安全性。 TripleDES 由三个密钥组成,每个 56 位(加上 8 个奇偶校验位),其中每个密钥可以是两种模式,解密或加密。因此,有八种可能的组合(如此处所列):
使用这个原则,我将如何设计一个 Java 程序来暴力破解所有可能的 TripleDES 密钥并可能找到原始纯文本?
以下是我对单个 DES 的尝试:
import java.security.spec.AlgorithmParameterSpec;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.util.BitSet;
public class DES64 {
public static byte[] generateKey(byte [] encoded_key2, int N_BYTE) {
byte[] encoded_key = new byte[] { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 };
for (int i = 0; i < N_BYTE; i++) {
encoded_key[8 - N_BYTE + i] = encoded_key2[i];
}
return encoded_key;
}
public static byte[] des_attack(String plaintext, byte[] encoded_key2, int N_BYTE) throws Exception {
byte[] encoded_key = generateKey(encoded_key2, N_BYTE);
SecretKey key = new SecretKeySpec(encoded_key, "DES");
byte[] initVector = new byte[] { 0x10, 0x10, 0x01, 0x04, 0x01, 0x01, 0x01, 0x02 };
AlgorithmParameterSpec algParamSpec = new IvParameterSpec(initVector);
Cipher m_encrypter = Cipher.getInstance("DES/CBC/PKCS5Padding");
m_encrypter.init(Cipher.ENCRYPT_MODE, key, algParamSpec);
Cipher m_decrypter = Cipher.getInstance("DES/CBC/PKCS5Padding");
byte[] clearText = plaintext.getBytes();
byte[] encryptedText = m_encrypter.doFinal(clearText);
int guess = 0;
int N_COMB = (int) Math.pow(2.0, (N_BYTE) * 7);
System.out.println("All possible combiantions : " + N_COMB);
BitSet encoding_attack_key = new BitSet(8 * N_BYTE);
encoding_attack_key.clear();
byte[] mykey = new byte[] { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 };
for (int i = 0; i < N_COMB; i++) {
String tmp = Integer.toBinaryString(i);
int z = 0;
int j = tmp.length() - 1;
while (j >= 0) {
if (z != 63 && z != 55 && z != 47 && z != 39 && z != 31 && z != 23 && z != 15 && z != 7) {
if (tmp.charAt(j) == '1') {
encoding_attack_key.set(z);
}
j--;
z++;
} else {
z++;
}
}
for (int k = 0; k < N_BYTE; k++) {
if (encoding_attack_key.get(k * 8, (k * 8) + 7).cardinality() % 2 != 0) {
encoding_attack_key.set((k * 8) + 7);
}
}
if (guess % 1000000 == 0) {
System.out.println("Guess : " + guess + " out of : " + N_COMB + " ------- "
+ 100 * (guess + 0.0) / N_COMB + "% completed");
}
guess++;
int len = encoding_attack_key.toByteArray().length;
mykey[0] = len >= 8 ? encoding_attack_key.toByteArray()[7] : 0x0;
mykey[1] = len >= 7 ? encoding_attack_key.toByteArray()[6] : 0x0;
mykey[2] = len >= 6 ? encoding_attack_key.toByteArray()[5] : 0x0;
mykey[3] = len >= 5 ? encoding_attack_key.toByteArray()[4] : 0x0;
mykey[4] = len >= 4 ? encoding_attack_key.toByteArray()[3] : 0x0;
mykey[5] = len >= 3 ? encoding_attack_key.toByteArray()[2] : 0x0;
mykey[6] = len >= 2 ? encoding_attack_key.toByteArray()[1] : 0x0;
mykey[7] = len >= 1 ? encoding_attack_key.toByteArray()[0] : 0x0;
SecretKey key_g = new SecretKeySpec(mykey, "DES");
m_decrypter.init(Cipher.DECRYPT_MODE, key_g, algParamSpec);
try {
byte[] text_g = m_decrypter.doFinal(encryptedText);
String plain_text = new String(text_g);
if (plain_text.equals(new String(clearText))) {
return mykey;
}
} catch (BadPaddingException ee) {
}
encoding_attack_key.clear();
}
return null;
}
public static void main(String args[]) throws Exception {
String plaintext = "example";
int nbyte = 4;
byte[] b = new byte[] { 0x6, 0x7, 0x35, 0x09 };
long startTime = System.nanoTime();
byte[] ris = des_attack(plaintext, b, b.length);
long estimatedTime = (System.nanoTime() - startTime);
String kris = "";
for (int i = 0; i < ris.length; i++)
kris += " " + ris[i] + " ";
System.out.println("PLAINTEXT : " + plaintext + " ESTIMATED TIME: " + estimatedTime
+ " NFREE_BYTE_KEY: " + nbyte + " KEY: " + kris + "\n");
}
}
Triple-DES or actually TDEA is a standard。顺便说一下,它只是 DES-EDE,而不是其他任何一个。当然解密是使用DED命令进行的。 Triple-DES 有两键和三键模式(忽略为了向后兼容而简单地恢复到 DES 的模式)。
两个密钥的三重 DES 模式(具有所谓的 DES ABA 密钥,因为 A 密钥被重新用于最终的 DES 密码)在最坏的情况下具有大约 80 位的强度。这有点接近暴力破解,仅比使用 Google 的基础设施执行的破碎攻击难 2^16 倍。不是你用 Java 和 PC 本身做的事情。
三个带DES ABC密钥的Triple-DES的强度约为2^112,没有办法暴力破解。所以简单的答案是:"you don't" 有 Java 或没有。
我一直在从事我的科学项目,当时我想进行一项实验,通过暴力破解来测试 TripleDES 的安全性。 TripleDES 由三个密钥组成,每个 56 位(加上 8 个奇偶校验位),其中每个密钥可以是两种模式,解密或加密。因此,有八种可能的组合(如此处所列):
使用这个原则,我将如何设计一个 Java 程序来暴力破解所有可能的 TripleDES 密钥并可能找到原始纯文本?
以下是我对单个 DES 的尝试:
import java.security.spec.AlgorithmParameterSpec;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.util.BitSet;
public class DES64 {
public static byte[] generateKey(byte [] encoded_key2, int N_BYTE) {
byte[] encoded_key = new byte[] { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 };
for (int i = 0; i < N_BYTE; i++) {
encoded_key[8 - N_BYTE + i] = encoded_key2[i];
}
return encoded_key;
}
public static byte[] des_attack(String plaintext, byte[] encoded_key2, int N_BYTE) throws Exception {
byte[] encoded_key = generateKey(encoded_key2, N_BYTE);
SecretKey key = new SecretKeySpec(encoded_key, "DES");
byte[] initVector = new byte[] { 0x10, 0x10, 0x01, 0x04, 0x01, 0x01, 0x01, 0x02 };
AlgorithmParameterSpec algParamSpec = new IvParameterSpec(initVector);
Cipher m_encrypter = Cipher.getInstance("DES/CBC/PKCS5Padding");
m_encrypter.init(Cipher.ENCRYPT_MODE, key, algParamSpec);
Cipher m_decrypter = Cipher.getInstance("DES/CBC/PKCS5Padding");
byte[] clearText = plaintext.getBytes();
byte[] encryptedText = m_encrypter.doFinal(clearText);
int guess = 0;
int N_COMB = (int) Math.pow(2.0, (N_BYTE) * 7);
System.out.println("All possible combiantions : " + N_COMB);
BitSet encoding_attack_key = new BitSet(8 * N_BYTE);
encoding_attack_key.clear();
byte[] mykey = new byte[] { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 };
for (int i = 0; i < N_COMB; i++) {
String tmp = Integer.toBinaryString(i);
int z = 0;
int j = tmp.length() - 1;
while (j >= 0) {
if (z != 63 && z != 55 && z != 47 && z != 39 && z != 31 && z != 23 && z != 15 && z != 7) {
if (tmp.charAt(j) == '1') {
encoding_attack_key.set(z);
}
j--;
z++;
} else {
z++;
}
}
for (int k = 0; k < N_BYTE; k++) {
if (encoding_attack_key.get(k * 8, (k * 8) + 7).cardinality() % 2 != 0) {
encoding_attack_key.set((k * 8) + 7);
}
}
if (guess % 1000000 == 0) {
System.out.println("Guess : " + guess + " out of : " + N_COMB + " ------- "
+ 100 * (guess + 0.0) / N_COMB + "% completed");
}
guess++;
int len = encoding_attack_key.toByteArray().length;
mykey[0] = len >= 8 ? encoding_attack_key.toByteArray()[7] : 0x0;
mykey[1] = len >= 7 ? encoding_attack_key.toByteArray()[6] : 0x0;
mykey[2] = len >= 6 ? encoding_attack_key.toByteArray()[5] : 0x0;
mykey[3] = len >= 5 ? encoding_attack_key.toByteArray()[4] : 0x0;
mykey[4] = len >= 4 ? encoding_attack_key.toByteArray()[3] : 0x0;
mykey[5] = len >= 3 ? encoding_attack_key.toByteArray()[2] : 0x0;
mykey[6] = len >= 2 ? encoding_attack_key.toByteArray()[1] : 0x0;
mykey[7] = len >= 1 ? encoding_attack_key.toByteArray()[0] : 0x0;
SecretKey key_g = new SecretKeySpec(mykey, "DES");
m_decrypter.init(Cipher.DECRYPT_MODE, key_g, algParamSpec);
try {
byte[] text_g = m_decrypter.doFinal(encryptedText);
String plain_text = new String(text_g);
if (plain_text.equals(new String(clearText))) {
return mykey;
}
} catch (BadPaddingException ee) {
}
encoding_attack_key.clear();
}
return null;
}
public static void main(String args[]) throws Exception {
String plaintext = "example";
int nbyte = 4;
byte[] b = new byte[] { 0x6, 0x7, 0x35, 0x09 };
long startTime = System.nanoTime();
byte[] ris = des_attack(plaintext, b, b.length);
long estimatedTime = (System.nanoTime() - startTime);
String kris = "";
for (int i = 0; i < ris.length; i++)
kris += " " + ris[i] + " ";
System.out.println("PLAINTEXT : " + plaintext + " ESTIMATED TIME: " + estimatedTime
+ " NFREE_BYTE_KEY: " + nbyte + " KEY: " + kris + "\n");
}
}
Triple-DES or actually TDEA is a standard。顺便说一下,它只是 DES-EDE,而不是其他任何一个。当然解密是使用DED命令进行的。 Triple-DES 有两键和三键模式(忽略为了向后兼容而简单地恢复到 DES 的模式)。
两个密钥的三重 DES 模式(具有所谓的 DES ABA 密钥,因为 A 密钥被重新用于最终的 DES 密码)在最坏的情况下具有大约 80 位的强度。这有点接近暴力破解,仅比使用 Google 的基础设施执行的破碎攻击难 2^16 倍。不是你用 Java 和 PC 本身做的事情。
三个带DES ABC密钥的Triple-DES的强度约为2^112,没有办法暴力破解。所以简单的答案是:"you don't" 有 Java 或没有。