2010-01-15 8 views
0
public void EncryptFile() 
    {    
     OpenFileDialog dialog = new OpenFileDialog(); 
     dialog.Filter = "JPEG Files (*.jpeg)|*.jpeg|PNG Files (*.png)|*.png|All files (*.*)|*.*"; 
     dialog.InitialDirectory = @"C:\"; 
     dialog.Title = "Please select an image file to encrypt."; 
     if (dialog.ShowDialog() == DialogResult.OK) 
     { 
      byte[] ImageBytes = File.ReadAllBytes(dialog.FileName); 

      foreach (byte X in ImageBytes) 
      { 
       //How can I take byte "X" and add a numerical value to it? 
      } 
     }    
    } 

그래서 이미지 파일을 byte [] 배열로 변환 한 다음 각 바이트에 숫자 값을 추가하여 암호화하려고합니다.바이트에 숫자 값을 추가 하시겠습니까?

바이트에 숫자 값을 어떻게 추가 할 수 있습니까?

답변

2

그냥 추가하십시오. 문제는 foreach 루프의 값을 수정할 수 없다는 것입니다. 당신은 실제로 루프를 찾는 :

for(int k = 0; k < ImagesBytes.Length; k++){ 
    ImageBytes[k] = (byte) (ImageBytes[k] + 5); // needs a cast 
} 
+0

itowlson : 실제로, 그것은 단지 행복하게 넘칠 것입니다 (충돌 없음). –

+0

왜 foreach 반복자를 사용할 수 없습니까? –

+0

Papuccino1 : 다른 점은 아래에 설명되어 있지만 기본적으로 foreach 변수에 할당 할 수 없습니다 (구체적으로 허용되지 않음). 그것과 관계없이 foreach 문에서 반복되는 객체는 일반적으로 수정할 수 없습니다. 수정하려는 경우 (예 : 배열의 요소 설정) 일반적인 for 루프 (또는 일부 변형)가 적절합니다. –

0

byte는 반환 때 그것은 항상 복사 된 의미 값 형식입니다. 따라서 foreach 내부의 로컬 바이트 값에만 값을 추가 할 수 있습니다. 함수 내에서 byte 인수의 값을 변경하면 함수 외부의 값이 변경되지 않습니다 (물론 ref 키워드를 사용하지 않은 경우).).

이 작업에는 foreach을 사용할 수 없습니다. 일반 for 루프를 사용하여 다음 작업을 뒤집을 수 있도록

당신은 모듈를 사용할 필요가
for(int i = 0; i < ImageBytes.Length; i++) 
    ImageBytes[i] += MyNumericValue; 
+2

암호화를 위해 바이트에 값을 추가하는 것이 암호화보다 난독 화라고 말하고 싶습니다. – zneak

0

, 또한 (특히 256 모듈로). 또는 비트 연산을 사용할 수도 있지만 XOR은 일반적인 선택입니다.

모듈로 256 동작이 바이트 구현하기 간단합니다, 당신은 단지 같이 결과를 캐스팅해야합니다

ImageBytes[k] = (unsigned byte) ((unsigned byte) ImageBytes[k] + x) 

는 "암호화"오히려 약하다는 그러나 조심하십시오. 이러한 암호화의 강도를 향상시키는 방법은 순환 버퍼 (예 : 결국 반복되는 시퀀스)에서 추가 된 값을 취하는 것과 같이 각 바이트에 고유 한 값을 추가하는 것입니다. 더 나은 방법은 여전히 ​​피연산자의 일부로 쉽게 디코딩 된 값을 사용할 수 있습니다.

+0

팁 주셔서 대단히 감사합니다. 1 단계를 마치면 다음과 같이 구현할 것입니다. 상자에 구멍을 뚫습니다. GOTO 2 단계. –

0

질문 : .NET에서 내장 된 암호화 스트림 중 하나를 사용하지 않는 이유는 무엇입니까?

이미지의 비트를 모호하게 한 후에 이미지를 사용하고 싶다고 가정한다면, 사용자 정의 스트림 클래스를 살펴보고 바이트 만 수정하면됩니다. 들어오고있다.

여기서 끝까지 끝내려면 Custom Transform Streams을 거쳐야한다. (회전 스트림은 이미지 파일을 어둡게하는 문제를 해결하는 더 빠른 방법이다). 또한 바이트를 추가하면 오버플로 문제가 제거됩니다.

관련 문제