2013-02-10 2 views
0

Эй, ребята, я хотел знать, могу ли я немного помочь: Im пытается подсчитать в шестнадцатеричном массиве байтов. Что я делаю, у меня есть простой текст в виде 8 шестнадцатеричных чисел и шифрованного текста в том же виде, что и первые 4 номера ключа. И я пытаюсь использовать DES, чтобы взломать ключ с помощью грубой силы.Цикл через шестнадцатеричные числа в массиве байтов

мой ключ выглядит следующим образом:

[A3 BB 12 44 __ __ __ __] 

и я хочу, чтобы начать, как это я полагаю:

[A3 BB 12 44 00 00 00 00] 

затем

[A3 BB 12 44 00 00 00 01] 

и так далее. Я просто не знаю, как считать в гексагоне. внутри массива байтов!

любая помощь очень ценится!

EDITED ПОСЛЕ МНОГО HELP

здесь найти ключ (я изменил некоторые из названий вещей вокруг, чтобы лучше соответствовать моей программе)

public static void findKey(){ 

    byte [] keyBytes = null; 
    byte [] pt; 
    byte [] ct; 

    codeBreaker KEY = new codeBreaker(new byte[]{(byte)0x01, (byte)0x23, (byte)0x45, (byte)0x67, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00}, 2); 

    String plaintext = "Plaintxt"; 
    ct = new byte [] {(byte)0x4A, (byte)0xC4, (byte)0x55, (byte)0x3D, (byte)0xB3, (byte)0x37, (byte)0xCA, (byte)0xB3}; 

    //convert the plain text "Plaintxt" into a hex byte array 
    String ptHex = asciiToHex(plaintext); 
    pt = getBytes(ptHex); 

    //keyBytes = KEY.inc() 

    //my attempt 
    /*while(!isKey(pt,keyBytes,ct)){ 
     KEY.inc(); // something like increase the key by 1 and send t back in. 
    } 
    */ 


    //this is your original while loop 
    /*while (KEY.inc()) { 
     byte[] bytes = KEY.getBytes(); 
     for (byte b: bytes) { 
      System.out.printf("%02X ", b); 
     } 
     System.out.println(); 
    } 
    */ 


    //Final outputs for the findKey method 
    System.out.println("  Plain Text In Hex Is:");   
    printByteArray(pt); 
    System.out.println(); 
    System.out.println("   The Cipher Text Is:"); 
    printByteArray(ct); 
    System.out.println(); 

} 

и вот материал, который Вы придумали

public codeBreaker(byte[] keyAr, int startIndex) { 
    this.key = keyAr; 
    this.startIndex = startIndex; 
} 

    public boolean inc() { 
    int i; 
    for (i = key.length-1; i >= startIndex; i--) { 
     key[i]++; 
     if (key[i] != 0) 
      break; 
    } 
     // we return false when all bytes are 0 again 
    return (i >= startIndex || key[startIndex] != 0); 
} 

public byte[] getBytes() { 
    return key; 
} 

который я все положил в один класс и назвал его codeBreaker с остальными методами, которые у меня есть (но те, имеют какое-либо отношение к этой конкретной части)

+0

* «Эй было интересно, если я мог бы получить немного интеллектуальную помощь» * - Не круглый здесь мат. Мы все просто «тупые программисты» ... точно так же, как вы :-) :-) –

+0

@StephenC: говорите сами. Я считаю себя интеллектуальным тяжелым весом, прямо там с Рашем Лимбо и Дональдом Трампом. –

+0

Серьезно, хотя байт не знает и не заботится о том, является ли он шестнадцатеричным или нет, поскольку это просто строковое представление байта. Можете ли вы дать больше информации о том, что вы пытаетесь сделать? Откуда берется массив байтов, почему вы не можете просто перебирать его с помощью цикла for и т. Д. –

ответ

3

Как насчет этого?

public class ByteIncrement 
{ 
    private final byte[] bytes; 
    private final int startIndex; 
    public ByteIncrement(byte[] bytes, int startIndex) { 
     this.bytes = bytes; 
     this.startIndex = startIndex; 
    } 
    public boolean inc() { 
     int i; 
     for (i = bytes.length-1; i >= startIndex; i--) { 
      bytes[i]++; 
      if (bytes[i] != 0) 
       break; 
     } 
     // we return false when all bytes are 0 again 
     return (i >= startIndex || bytes[startIndex] != 0); 
    } 
    public byte[] getBytes() { 
     return bytes; 
    } 

    public static void main(String[] args) { 
     ByteIncrement bi = new ByteIncrement(new byte[]{(byte)0xa4, 0x56, 0x17, (byte)0x9f, 0x00, 0x00, 0x00, 0x00}, 2); // first two bytes are constant -> 2 
     while (bi.inc()) { 
      byte[] bytes = bi.getBytes(); 
      for (byte b: bytes) { 
       System.out.printf("%02X ", b); 
      } 
      System.out.println(); 
     } 
    } 
} 
+0

, так что это произойдет после одного вызова ... 00 00 00 01? например, мне нужно будет увеличивать его после отправки нового массива с добавленным байтом через шифрование des и проверить, соответствует ли этот шифрованный текст моему заданному зашифрованному тексту, если мне не нужно увеличивать его снова. Или с тех пор, как я верну его, и теперь будет 00 00 00 01, я просто отправлю это обратно, а следующее будет 00 00 00 02? Что происходит, когда я встаю в a-f? – erp

+0

после первого inc() результат getBytes() на самом деле .... 01 00 00 00. Я думал, что это грубая сила, и порядок не имеет значения? Если вы хотите это точно ... 00 00 00 01, тогда цикл for должен быть повторен в обратном порядке 'i = bytes.length-1; i> = startIndex; i - ', а возвращаемое значение -' i> = startIndex || байты [startIndex]! = 0'. Инвер возвращает false, когда все значения перевернули на .... 00 00 00 00 снова. –

+0

OK - Из вашего отредактированного определения видно, что обратный цикл - это то, что вы на самом деле хотите. Я изменю код –

0
public static void tryCipher (
    byte b1, byte b2, byte b3, byte b4, 
    byte b5, byte b6, byte b7, byte b8) 
{ 
    // Try the variant, convert to HEX if necessary 
} 

public static void bruteForce (byte b1, byte b2, byte b3, byte b4) 
{ 
    for (int b5 = Byte.MIN_VALUE; b5 <= Byte.MAX_VALUE, b5++) 
     for (int b6 = Byte.MIN_VALUE; b6 <= Byte.MAX_VALUE, b6++) 
      for (int b7 = Byte.MIN_VALUE; b7 <= Byte.MAX_VALUE, b7++) 
       for (int b8 = Byte.MIN_VALUE; b8 <= Byte.MAX_VALUE, b8++) 
        tryCipher (b1, b2, b3, b4, (byte)b5, (byte)b6, (byte)b7, (byte)b8); 
} 
Смежные вопросы