2009-11-04 2 views
0

Rijndael 알고리즘을 사용하여 Windows Mobile 용 샘플 응용 프로그램을 만듭니다. 잘 작동합니다. 암호화하기 전에Rijndael 알고리즘 (오른쪽 8 비트 패딩 문제)

: 그러나 문제는 우리가 데이터를 해독 할 때 거기에, 우리는 트랜잭션에 대한 고유 키를 암호화하는 예를 들어 값의 오른쪽에 8 비트 패딩까지이며, 그것은 다음과 같습니다이다 MI03112009044625000000000000008024754008

암호 해독 후

: MI03112009044625000000000000008024754008 揞 ⑁㋬ 㓠 ⥳ 空 ⠜ 資

사람이 원래 값에서 일어나고있는이 권리 패딩에 도움이 될 수 있습니다.

코드 : 암호화 :

byte[] inputData = System.Text.Encoding.Unicode.GetBytes(inputDataString);   
MemoryStream stream = new MemoryStream(); 
CryptoStream cStream = new CryptoStream(stream, RijndaelAlg.CreateEncryptor(key, value), CryptoStreamMode.Write); 
cStream.Write(inputData, 0, inputData.Length);   
cStream.Close(); 

암호 해독 :

MemoryStream stream = new MemoryStream(outputData); 
CryptoStream cStream = new CryptoStream(stream, RijndaelAlg.CreateDecryptor(key, value), CryptoStreamMode.Read); 
cStream.Read(outputData, 0, outputData.Length); 
cStream.Close(); 
byte[] decryptedData = stream.ToArray(); 

return System.Text.Encoding.Unicode.GetString(decryptedData, 0, decryptedData.Length); 

이 다른 어떤 솔루션이 있습니까? 우리는 원래의 데이터 길이를

지사

+0

당신이 어떻게 암호화 및 암호 해독하고에 관해서는 몇 가지 코드를 제공 할 수 있습니까? –

답변

1

을 얻을 질수 있기 때문에 나는 미만 48 바이트를 암호화하기 때문이라고 생각합니다.

42 바이트라고하는 일반 텍스트를 인코딩/디코딩하면 패딩 바이트 수가 2 개 적어집니다.

또한 사용중인 특정 블록 암호에 따라 다르지만 해독 된 데이터는 블록의 배수 인 체계적으로 길이가 있습니다 (기본적으로 AES 및 Rijndael에서는 기본적으로 16입니다).

편집 : "은 패딩 허용을 허용하거나 패딩을 허용하지 않습니다 ... 그게 문제입니다!"
많은 암호문은 마지막 블록에서 패딩 방지를 허용합니다 (어떤 경우에는 마지막 블록도 길이가 몇 바이트에 불과합니다 ... ...). 이렇게하지 않으면 수신자가 메시지의 유효 끝을 찾지 못하는 문제가 해결됩니다. 메시지의 길이를 알아라. (

  • 처음에 "소금"또는 메시지의 끝을 추가 : 짧은 메시지의 맥락에서
    ,이 암호화의 강도를 줄일 수 있으며, 다음과 같은 두 가지 방법이 완화 할 수있다 또는 둘 다)
  • 가 종료 시퀀스를 추가 (및 사용 패딩)
  • 추가 길이 정보 (및 사용 패딩)

참고 : 이 제안된다 약간의 까다로운 점은 그들 자신이 인 은 공격자가 사용할 수있는 "유아용 침대"를 도입하여 암호화 기능을 약화시킬 수 있다는 점입니다. 예를 들어 길이가 메시지의 처음 4 바이트에서 체계적으로 전송 된 경우 공격자는이 정보를 사용하여 암호문에서 해당 패턴을 찾습니다. 그러나 지나치게 편집증을 일으키지는 않겠지 만 이러한 짧은 힌트는 특히 "소금"과 함께 사용할 때 활용하기가 어렵습니다.

는 "SALT"는 평문 (전형적으로 전 또는 후)에 대체로 첨가 단순히 바이트 [다소 랜덤 시퀀스이며, 메시지의 일부인 것처럼 이는 부호화 . 수신 측은 암호 해독에 의해 생성 된 일반 텍스트에서이 소금을 버립니다. 단순한 소금은 길이가 고정되어있어 쉽게 제거 할 수 있으며 길이가 소금에 어딘가에 명시 적으로 표시되거나 더 미묘하고 다양한 방법으로 코드화/숨김 될 수있는 가변 길이 일 수 있습니다.

+0

정보를 제공해 주셔서 감사합니다. 다음 코드를 포함 시키면 완벽하게 작동합니다. int count = testval.Length - mdpoddet.CMPODDETID.Length; testval = testval.Remove (mdpoddet.CMPODDETID.Length, count) 감사합니다. Geetha – Geetha

+0

다른 해결책이 있습니까? 우리는 원래의 데이터 길이를 얻을 수 없기 때문에 – Geetha

+1

enption과 decyprtion에서 paddingMode.None을 사용하여 해결책을 얻었습니다. – Geetha

0

해독 된 데이터에서 여분의 패딩을 제거하는 해결책이 있습니다.

코드 :

this.algorithm.Mode = CipherMode.CBC; 
protected SymmetricAlgorithm algorithm; 
ICryptoTransform cryptoTransform = this.algorithm.CreateDecryptor(); 
CryptoStream cryptoStream = new CryptoStream(memoryStream, cryptoTransform, CryptoStreamMode.Write)