2011-03-06 5 views
0

좋아, 내가 비트 XOR (비트 XOR 믿을) 암호화 된 35 MB 파일이 있고 그것을 해독하는 좋은 방법을 알고 싶습니다, C#의 파일 I/O를 사용하여 다시 암호화합니다.C# 비트 비트 XOR 및 파일 I/O

다음은 ENC/DEC 알고리즘 :

Encrypt:----------------------Decrypt: 
Bit 0 -> Bit 26--------------Bit 0 -> Bit 18 
Bit 1 -> Bit 31--------------Bit 1 -> Bit 29 
Bit 2 -> Bit 17--------------Bit 2 -> Bit 7 
Bit 3 -> Bit 10--------------Bit 3 -> Bit 25 
Bit 4 -> Bit 30--------------Bit 4 -> Bit 15 
Bit 5 -> Bit 16--------------Bit 5 -> Bit 31 
Bit 6 -> Bit 24--------------Bit 6 -> Bit 22 
Bit 7 -> Bit 2--------------Bit 7 -> Bit 27 
Bit 8 -> Bit 29--------------Bit 8 -> Bit 9 
Bit 9 -> Bit 8--------------Bit 9 -> Bit 26 
Bit 10 -> Bit 20--------------Bit 10 -> Bit 3 
Bit 11 -> Bit 15--------------Bit 11 -> Bit 13 
Bit 12 -> Bit 28--------------Bit 12 -> Bit 19 
Bit 13 -> Bit 11--------------Bit 13 -> Bit 14 
Bit 14 -> Bit 13--------------Bit 14 -> Bit 20 
Bit 15 -> Bit 4--------------Bit 15 -> Bit 11 
Bit 16 -> Bit 19--------------Bit 16 -> Bit 5 
Bit 17 -> Bit 23--------------Bit 17 -> Bit 2 
Bit 18 -> Bit 0--------------Bit 18 -> Bit 23 
Bit 19 -> Bit 12--------------Bit 19 -> Bit 16 
Bit 20 -> Bit 14--------------Bit 20 -> Bit 10 
Bit 21 -> Bit 27--------------Bit 21 -> Bit 24 
Bit 22 -> Bit 6--------------Bit 22 -> Bit 28 
Bit 23 -> Bit 18--------------Bit 23 -> Bit 17 
Bit 24 -> Bit 21--------------Bit 24 -> Bit 6 
Bit 25 -> Bit 3--------------Bit 25 -> Bit 30 
Bit 26 -> Bit 9--------------Bit 26 -> Bit 0 
Bit 27 -> Bit 7--------------Bit 27 -> Bit 21 
Bit 28 -> Bit 22--------------Bit 28 -> Bit 12 
Bit 29 -> Bit 1--------------Bit 29 -> Bit 8 
Bit 30 -> Bit 25--------------Bit 30 -> Bit 4 
Bit 31 -> Bit 5--------------Bit 31 -> Bit 1 
+1

그래서 무엇이 문제입니까? – vissi

+0

위에서 인용 한 내용 : "암호 해독과 C#의 파일 I/O를 사용하여 다시 암호화하는 좋은 방법을 알고 싶습니다." – Phant0m

+0

x31 '암호화'처럼 보이지 않습니다. 혼합. FileStream 및 BitVector32를 사용하십시오. –

답변

4

이 비트 단위 XOR 아니다 - 그것은 효과적으로 비트 substitution cypher입니다. 가장 느슨한 의미의 "암호화"라고 알고 있습니다.

기본적으로 두 단계가 필요합니다 : 암호화/복호화를위한 비트를 트랜스에

  • 쓰기 방법을 32 비트 정수
  • 을 32 비트 정수를 복용하고 반환 각각의 하나는 파일을 읽기 한 번에 32 비트 정수, 적절한 연산을 적용하고 결과를 다른 파일에 씁니다. 이 경우 BinaryReaderBinaryWriter을 사용하는 것이 좋습니다.

은 (물론 당신은 버퍼링으로 최적화 할 수 있습니다,하지만 일반 요점입니다.)

당신은 부호 비트에 대한 걱정 피하기 위해 대신 intuint 작업하는 것이 가장 쉬운 방법입니다 찾을 수 있습니다. 이런 식으로 뭔가 :이 암호화를위한 테이블 및 암호 해독을위한 테이블과 테이블 구동 할 수 있지만, 내가 귀찮게 거라고 확실하지 않다

public static uint Encrypt(uint input) 
{ 
    return (((input >> 0) & 1) << 26) | 
      (((input >> 1) & 1) << 31) | 
      (((input >> 2) & 1) << 17) | 
      ... 
      (((input >> 31) & 1) << 5); 
} 

. 민감한 정보를 저장하려면이 옵션을 사용하여 실제로이라면, 당신은 가능한 한 빨리 실제 암호화를 사용하여 시작해야 함을

참고.

+0

정보를 제공해 주셔서 감사합니다. – Phant0m

1

이것은 XOR이 아닙니다. 만약 당신이 단순히 같은 값을 가진 데이터를 다시 XOR하면 decrypt it이됩니다.

설명하는 것은 일종의 비트 스크램블 암호화입니다.

다른 사람들이 말했듯이 이는 안전한 암호화가 아닙니다. 일반적으로 "security through obscurity"으로 알려진 방법을 사용합니다. 나는 당신의 알고리즘을 이해한다면 당신은 수동으로 같은 것을 (각 변환을 할 필요가

int getBit(int position, int word) 
{ 
    return ((word >> position) & 1); 
} 

void setBit(int position, int value, ref word) 
{ 
    word = (word & (value << position)); 
} 

을 :

1

먼저 당신은 당신이 원하는 목적지까지 단일 비트와 함수를 저장하는 얻을 수있는 기능을해야 할 올바르게) :

int b1 = getBit(0, word); 
int b2 = getBit(18, word); 
setBit(0, b1^b2, ref word); 
+0

고맙습니다. :) – Phant0m