2013-02-10 4 views
0

안녕하세요 여러분, 제가 약간의 도움을 얻을 수 있는지 알고 싶습니다. 바이트 배열 내부에서 16 진수로 계산하려고합니다. 무슨 일을하는지 내가 8 자리 16 진수 숫자의 형태로 일반 텍스트와 같은 형태로뿐만 아니라 키의 처음 4 숫자로 암호 텍스트입니다. 그리고 무언가를 통해 열쇠를 해독하기 위해 DES를 사용하려고합니다.바이트 배열의 16 진수를 순환합니다.

[A3 BB 12 44 __ __ __ __] 

그리고 난 그것이 내가 생각 같이 시작하려는 :

내 키는 다음과 같습니다

[A3 BB 12 44 00 00 00 00] 

다음

[A3 BB 12 44 00 00 00 01] 

등등. 나는 실제로 헥스 계산 방법을 모른다. 그것에서 바이트 배열의 내부!

어떤 도움을 많이 받으실 수 있습니다!

여기

여기

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 : 직접 이야기하십시오. 나는 러시 림보 (Lush Limbaugh)와 도널드 트럼프 (Donald Trump)와 함께 저기있는 지적 무거운 체중을 생각한다. –

+0

심각하게도, 바이트는 바이트의 문자열 표현이기 때문에 16 진수인지 여부를 알지 못하거나 신경 쓰지 않습니다. 당신이하려는 일에 대해 더 많은 배경 지식을 줄 수 있습니까? 바이트 배열이 어디서 왔는지, 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? 내가 암호 증가를 통해 새로운 증가 된 바이트 배열을 보내고 암호문이 주어진 암호문과 같은지 확인하기 위해 증분 할 수 있어야합니다. 암호문을 다시 증가시킬 필요가 없다면. 아니면 내가 돌아올 것이고 지금은 될 것입니다 00 00 00 01 wouls는 그걸 다시 보내고 다음은 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'. 모든 값이 반전되었을 때 inc는 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); 
} 
관련 문제