2016-04-14 4 views
0

Я сделал свою собственную систему шифрования для своих фреймворков, и я использовал ее какое-то время, и она отлично работает, но я нашел серьезную проблему: если строка, которая должна быть зашифрованная точно длину 4 символа, второй символ становится последним символом, как так:C# Weird проблема шифрования

1234> 1434

2408> 2808

24082408> 24082408

123> 123

12> 12

12345> 12345

Это действительно происходит только тогда, когда строка ровно 4 символов, все меньше/больше, и это работает абсолютно нормально!

Я понятия не имею, если это шифрование вызывает его или расшифровку ...

Код для шифрования:

public static string DoEncrypt(string ToEncrypt, [Optional, DefaultParameterValue(true)] bool UseHashing) 
    { 
     Memory.HasInitializedCheck(); 
     int intLenght = ToEncrypt.Length - 1; 
     string NewString = null; 
     for (int intCount = intLenght; intCount >= 0; intCount--) 
     { 

      if (intCount == 2) 
      { 
       NewString += ToEncrypt.Substring(intLenght, 1); 
      } 
      else if (intCount == 1) 
      { 
       NewString += ToEncrypt.Substring(intLenght - 1, 1); 
      } 
      else if (intCount == intLenght - 1) 
      { 
       NewString += ToEncrypt.Substring(1, 1); 
      } 
      else if (intCount == intLenght) 
      { 
       NewString += ToEncrypt.Substring(2, 1); 
      } 
      else 
      { 
       NewString += ToEncrypt.Substring(intCount, 1); 
      } 

     } 
     char[] array = Application.ProductName.ToCharArray(); 
     Array.Reverse(array); 
     NewString += "#" + new string(array) + "#"; 


     byte[] keyArray; 
     byte[] ToEncryptArray = UTF8Encoding.UTF8.GetBytes(NewString); 
     if (UseHashing) 
     { 
      MD5CryptoServiceProvider hashmd5 = new MD5CryptoServiceProvider(); 
      keyArray = hashmd5.ComputeHash(UTF8Encoding.UTF8.GetBytes(MechaKey)); 
      hashmd5.Clear(); 
     } 
     else 
     { 
      keyArray = UTF8Encoding.UTF8.GetBytes(MechaKey); 
     } 
     TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider(); 
     tdes.Key = keyArray; 
     tdes.Mode = CipherMode.ECB; 
     tdes.Padding = PaddingMode.PKCS7; 
     ICryptoTransform cTransform = tdes.CreateEncryptor(); 
     byte[] resultArray = cTransform.TransformFinalBlock(ToEncryptArray, 0, ToEncryptArray.Length); 
     tdes.Clear(); 
     String FinalEnc = Convert.ToBase64String(resultArray, 0, resultArray.Length); 
     return FinalEnc; 

    } 

И код для расшифровки

public static string DoDecrypt(string ToDecrypt, [Optional, DefaultParameterValue(true)] bool UseHashing) 
    { 
     Memory.HasInitializedCheck(); 
     byte[] keyArray; 
     byte[] toEncryptArray = Convert.FromBase64String(ToDecrypt); 
     if (UseHashing) 
     { 
      MD5CryptoServiceProvider hashmd5 = new MD5CryptoServiceProvider(); 
      keyArray = hashmd5.ComputeHash(UTF8Encoding.UTF8.GetBytes(MechaKey)); 
      hashmd5.Clear(); 
     } 
     else 
      keyArray = UTF8Encoding.UTF8.GetBytes(MechaKey); 

     TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider(); 
     tdes.Key = keyArray; 
     tdes.Mode = CipherMode.ECB; 
     tdes.Padding = PaddingMode.PKCS7; 
     ICryptoTransform cTransform = tdes.CreateDecryptor(); 
     byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length); 
     Array.Reverse(resultArray); 
     string UTF = UTF8Encoding.UTF8.GetString(resultArray); 
     int lenght = Application.ProductName.Length + 2; 
     bool start = false; 
     string appname = null; 
     try 
     { 
      if (UTF.Substring(0, lenght) != "#" + Application.ProductName + "#") 
      { 

       for (int appchecker = 0; appchecker < UTF.Length; appchecker++) 
       { 
        if (UTF.Substring(appchecker, 1) == "#" && start == false) 
        { 
         appchecker = appchecker + 1; 
         start = true; 
        } 
        if (start) 
        { 
         appname += UTF.Substring(appchecker, 1); 
        } 
        if (UTF.Substring(appchecker + 1, 1) == "#" && start == true) 
        { 
         break; 
        } 
       } 

       return "IDMismatch Key belongs to " + appname + " %E01"; 
      } 
     } 
     catch 
     { 

      return "IDMismatch Key lenght incorrect %E02"; 
     } 


     UTF = UTF.Replace("#" + Application.ProductName + "#", ""); 
     char[] UTFChar = UTF.ToCharArray(); 
     Array.Reverse(UTFChar); 
     int intLengt = UTFChar.Length - 1; 
     string NewString = null; 
     for (int intCount = 0; intCount <= intLengt; intCount++) 
     { 

      if (intCount == 2) 
      { 
       NewString += UTF.Substring(intLengt, 1); 
      } 
      else if (intCount == 1) 
      { 
       NewString += UTF.Substring(intLengt - 1, 1); 
      } 
      else if (intCount == intLengt - 1) 
      { 
       NewString += UTF.Substring(1, 1); 
      } 
      else if (intCount == intLengt) 
      { 
       NewString += UTF.Substring(2, 1); 
      } 
      else 
      { 
       NewString += UTF.Substring(intCount, 1); 
      } 

     } 
     tdes.Clear(); 
     return NewString; 
    } 


} 

У меня есть попробовал разные ключи шифрования, но ничего не изменил.

Может ли кто-нибудь сказать мне, что случилось?

Благодаря

+1

Попробуйте пропустить фактическое шифрование, чтобы вы могли проверить свои промежуточные значения. Проблема может быть связана с циклами for. –

+1

См. [Здесь] (https://stackoverflow.com/questions/202011/encrypt-and-decrypt-a-string) для ответа на шифрование и дешифрование строки * без * переноса собственного криптографического кода. Если вы не хотите проходить эти усилия, вы, вероятно, будете так же безопасны, просто запустите XOR-фильтр над байтами любой строки. – Kupiakos

+0

@DougDomeny да, это определенно цикл for: 12345> 32541 # 2noitacilppAsmroFswodniW # 321> 321 # 2noitacilppAsmroFswodniW # 1234> 3431 # 2noitacilppAsmroFswodniW # – user265889

ответ

1

проблема заключается в двух случаях

if (intCount == 1) 
{ 
    NewString += ToEncrypt.Substring(intLenght - 1, 1); 
} 

и

else if (intCount == intLenght) 
{ 
    NewString += ToEncrypt.Substring(2, 1); 
} 

С ToEnrypt от длины 4, таким образом intLength = 3, оба эти условия принять третий характер ToEncrypt, но никто из других не может взять второй символ строки, так как для входов короче 5 символов вы никогда не сможете добраться до последнего блока else.

BTW перетасовка входных данных не добавит существенной защиты для вашего шифрования. Придерживайтесь известных схем шифрования и получите свою безопасность от размера ключа.

Смежные вопросы