public bool TryDecodeData(GetRsaDelegate getRSA, byte[] bytes, out DeserializeResult deserializeResult) { var result = false; deserializeResult = null; var decodedBytes = _cryption.Decode(bytes, getRSA); if (decodedBytes != null && _formatChecker.Check(decodedBytes)) { deserializeResult = _serializeProvider.Deserialize(decodedBytes); result = true; } return(result); }
/// <summary>Расшифровать массив</summary> /// <param name="result">Массив шифрации</param> /// <returns></returns> public unsafe byte[] Decode(byte[] mass, GetRsaDelegate getRSA) { byte[] result = mass.Clone() as byte[]; uint UserID; fixed(void *numPtr = &result[result.Length - 4]) { UserID = *(uint *)numPtr; } //id пользователя RSACryptoServiceProvider rsa; if (!getRSA(UserID, out rsa)) { return(null); } crypt_struct urbytes, mrpass; int enckeyLength; { //длина внешнего пароля fixed(void *numPtr = &result[0]) { enckeyLength = *(int *)numPtr; } var tmass = new byte[enckeyLength]; Array.Copy(result, 8, tmass, 0, enckeyLength); int m1ln, m2ln; fixed(void *numPtr = &result[0]) { m1ln = *(int *)numPtr; } fixed(void *numPtr = &result[4]) { m2ln = *(int *)numPtr; } urbytes = new crypt_struct(rsa.Decrypt(tmass, true)); //дешифрованный шифр //тут все правильно! } //дешифрую основной и первый пароль вторым шифром { int Start = 8 + enckeyLength; int End = result.Length - 4; for (int i = Start; i < End; i++) { result[i] = urbytes.Decrypt(result[i]); } } { int mrpLength; //длина внутреннего пароля fixed(void *numPtr = &result[4]) { mrpLength = *(int *)numPtr; } var tmass = new byte[mrpLength]; Array.Copy(result, 8 + enckeyLength, tmass, 0, tmass.Length); mrpass = new crypt_struct(tmass); //внутренний пароль смещения } //дешифрую основной набор первым шифром { int Start = mrpass.mass.Length + enckeyLength + 8; int End = result.Length - 4; for (int i = Start; i < End; i++) { result[i] = mrpass.Decrypt(result[i]); } } { int MassFrom = mrpass.mass.Length + enckeyLength + 8; int MassLength = result.Length - MassFrom; Array.Copy(result, MassFrom, result, 0, MassLength); Array.Resize(ref result, MassLength); } return(result); }
public byte[] Decode(byte[] mass, GetRsaDelegate getRSA) { return(mass); }