2017-03-11 2 views
0

하나의 파일 스트림에서 파일을 암호화하고 싶지만 암호 해독 패딩이 잘못되어 제거 할 수없는 경우이 오류가 발생합니다. 패딩을 설정하면 암호화 및 암호 해독 방법에 동일한 패딩이 적용됩니다. 이 상태이기 때문에 제로는, 파일C# Rijandel 파일 암호 해독 패딩이 잘못되어 제거 할 수 없습니다.

당신은 암호화 및 암호 해독에 대해 개별적으로 Rfc2898DeriveBytes를 인스턴스화해야
private static readonly byte[] SALT = new byte[] { 0x26, 0xdc, 0xff, 0x00, 0xad, 0xed, 0x7a, 0xee, 0xc5, 0xfe, 0x07, 0xaf, 0x4d, 0x08, 0x22, 0x3c }; 
    Rfc2898DeriveBytes pdb = new Rfc2898DeriveBytes("TestKey", SALT); 
    public bool EncryptFileP(string Path) 
    { 
     FileInfo IOF = new FileInfo(Path); 
     WRStream = new FileStream(Path, FileMode.Open); 

     CryptoStream cryptoStream; 
     Rijndael rijndael = Rijndael.Create(); 

     rijndael.Key = pdb.GetBytes(16); 
     rijndael.IV = pdb.GetBytes(16); 

     rijndael.Mode = CipherMode.CBC; 
     rijndael.Padding = PaddingMode.PKCS7; 

     cryptoStream = new CryptoStream(WRStream, rijndael.CreateEncryptor(), CryptoStreamMode.Write); 

     cryptoStream.Close(); 
     WRStream.Close(); 

     return true; 
    } 
    public bool DecryptFileP(string Path) 
    { 
     FileInfo IOF = new FileInfo(Path); 
     WRStream = new FileStream(Path, FileMode.Open); 

     CryptoStream cryptoStream; 
     Rijndael rijndael = Rijndael.Create(); 

     rijndael.Key = pdb.GetBytes(16); 
     rijndael.IV = pdb.GetBytes(16); 

     rijndael.Mode = CipherMode.CBC; 
     rijndael.Padding = PaddingMode.PKCS7; 

     cryptoStream = new CryptoStream(WRStream, rijndael.CreateDecryptor(), CryptoStreamMode.Write); 

     cryptoStream.Close(); //error! padding is invalid and cannot be removed 
     WRStream.Close(); 


     return true; 
    } 
+0

즉, 암호화되지 않은 데이터, IV, 키 또는 매개 변수 중 하나 이상이 잘못되었거나 올바르지 않은 디켄딩 . PKCS # 7을 사용하여 올바른 것을 채 웁니다. – zaph

+0

주어진 답 중 하나라도 문제가 해결되면 (http://meta.stackexchange.com/q/5234/266187) 그 중 하나를 수락 할 수 있습니다. 그렇지 않다면, 무엇이 잘못되었는지 확장하십시오. –

답변

0

를 암호화하지 않습니다. Rfc2898DeriveBytes pdb = new Rfc2898DeriveBytes("TestKey", SALT);EncryptFilePDecryptFileP으로 옮깁니다.


보안 힌트 :

IV는 예측할 수 있어야합니다 (읽기 : 임의). 고정 IV를 사용하지 마십시오. 이는 암호화를 결정 론적으로 만들고 따라서 의미 론적으로 안전하지 않기 때문입니다. 암호문을 관찰하는 침입자는 동일한 메시지 접두어가 언제 전에 전송되었는지를 결정할 수 있습니다. IV는 비밀이 아니므로 암호문과 함께 보낼 수 있습니다. 대개 암호문 앞에 붙이고 암호 해독 전에 잘라냅니다.

padding oracle attack과 같은 공격이 가능하지 않도록 암호 텍스트를 인증하는 것이 좋습니다. 이는 GCM 또는 EAX와 같은 인증 된 모드 또는 encrypt-then-MAC 구성표를 사용하여 수행 할 수 있습니다.

2

내가 만드는 스트림에서 읽고 쓰는 것이없는 것처럼 보입니다. 당신은 당신이 DecryptFileP 다시 cryptoStream 중 읽을 필요가 암호를 해독 할 때 어떤 점에서

는 유사하게 당신이 당신의 EncryptFileP 당신이 cryptoStream에 암호화 할 고소장 텍스트 데이터를 기록해야합니다, 파일을 암호화하고 있습니다. 이러한 스트림은 수행하려고하는 것처럼 제 위치의 파일을 암호화/암호 해독하지 않습니다.

관련 문제