2013-01-24 2 views
2

을 학술 목적으로 사용하기 위해 java 및 java 암호를 사용하는 작은 암호화 기반 응용 프로그램을 개발 중입니다. 즉, 나는 일반적으로 C 또는 C++ (매우 쉬운 일이 일어난다)에서 일하기 때문에 이것은 명백한 문제라면 사과드립니다. 따라서 정보를 해독하려고 할 때 내 문제가 발생합니다. 이 문제는 암호화 나 다른 것을 사용하는 것과 관련이 없지만 실제로는 초기화 벡터를 적절히 검색합니다.BufferedReader.readLine()은 이진 코드

password:salt:<IV> 

- 지금 나는 (분명히 키 파일이 현실 세계에서 일반 텍스트로되지 않을 것 예,이 불안하지만 그것은 학문적 인 운동이다)으로 구분 된 다음과 같은 형식의 새로운 온라인/대장과 일반 텍스트 파일이 여기서 <IV>은 초기화 벡터입니다. 초기화 벡터를 직접 바이너리 형식으로 작성하기로했습니다. 이제 여기서 나는 나의 문제가 시작되는 곳이다. 데이터를 올바르게 쓸 수는 있지만 (hexdump를 사용하여 검증 된 것입니다.) 프로그램으로 올바르게 읽혀지지 않는 것 같습니다. 예를 들어 카운터 값이

인 경우
00 18 C0 98 (decimal: 1622168) 

이 값은 올바르게 기록됩니다. 그러나 읽을 때이 값은 모두 잘못되었습니다. 나는 이것이 BufferedReader.readLine()의 결과라고 생각합니다. 간단히 말해서 나는 당신이 줄을 읽고 다른 파일에 쓰는이 값은

BD EF BF BD (decimal: who cares, very wrong...) 

로 변경 그러나 ASCII 값 (비밀번호, 소금)을 그대로뿐만 아니라 대장 구분 남아있다. 초기화 벡터 바이너리는 모두 스크램블된다.

는 내가 뭘하려고 오전 이것이다 :이 시점에서

BufferedReader reader = new BufferedReader(new FileReader(f)); 
String last = null; 
String parse = null; 
while((last = reader.readLine()) != null) { 
    parse = last; 
} 
reader.close(); 
int offset = // A few indexOf() statements to find the positon; 
byte[] iv = parse.substring(offset).getBytes(); 

, 이미 잘못 (128 비트 AES를 사용하여) iv.length > 16. 그래서 나는이 ASCII- 바이너리 믹스를 어떻게 완성 할 수 있는지 완전히 확신하지 못한다. 내 문제의 일부는 Java에서 char != byte이며 전체 라인을 읽으려는 경우 모든 내용을 읽을 수 없다 (어쨌든 readLine() 사용). 그러나이 문제를 해결하기 위해 어쨌든 있습니까? 전체 라인을 원하기 때문에이 라인에서 바이너리를 추출하려고합니다.

또한, 나 또한 직접 변환

for(int i = 0 ; i < 16 ; ++i) 
    iv[i] = (byte)parse.charAt(offset + i); 

을 시도하지만이 중 하나가 작동하지 않습니다. 다른 코드 (getBytes() 기반)는 java version "1.6.0_37"으로 개인용 컴퓨터에서 작동하지만 배포 환경에서는 java version "1.6.0_33"을 사용하고 있습니다. 어떤 도움을 주셔서 감사합니다.

+2

이진 데이터에 독자를 사용하지 마십시오. – EJP

답변

9

이진 데이터 라인이란 무엇입니까? 0x0A이 데이터이고 줄 바꿈이 무엇인지 어떻게 알 수 있습니까?

요점은 BufferedReader입니다. 텍스트, 임의의 데이터가 아닙니다. 모든 데이터를 텍스트로 취급합니다. 또한 인코딩을 사용하여 바이너리를 텍스트로 변환하려고 시도합니다. 이는 물론 데이터를 조작합니다.

  • 는 바이너리로 데이터의 쓰기와 줄 바꿈 또는 다른 구분에 의존하지 : 중 하나에

    더 좋은 방법이 될 것입니다. (예 :BufferedReader.readLine()을 사용하십시오.

  • 모든 데이터를 이진 파일로 쓰고 파일의 각 레코드를 고정 길이로 만들거나 좀 더 복잡한 구분 기호 체계를 사용하십시오. (예 : FileInputStream.read(byte[]) 만 사용)
+0

'DataInputStream.readLine()'(http://docs.oracle.com/javase/6/docs/api/java/io/DataInputStream.html#readLine())에 대한 설명을 읽었으며 사용되지 않는 이유는 무엇입니까? 'BufferedReader.readLine()'이 이와 같이 바이트를 조작하지 않는다는 인상하에있었습니다. – RageD

+1

두 가지 경우의 문제점은 판독기가 원시 바이트를 문자 (텍스트)로 변환하려고 시도하고 데이터가 텍스트가 아니라는 것입니다. 어쨌든 전적으로 텍스트가 아닙니다. –

+0

Bah - 의미가 있습니다. 도움을 주셔서 감사합니다. 데이터를 해석하는 방법에 대한 규정이 없지만 (좋은 점을 떠올리지 만, 내 데이터에는 crlf 바이너리 코드가 포함되어 있지 않습니다)! – RageD

관련 문제