Napisałem ten kod w C#
zaszyfrować ciąg z kluczem:Pomóż mi z szyfrowania XOR
private static int Bin2Dec(string num)
{
int _num = 0;
for (int i = 0; i < num.Length; i++)
_num += (int)Math.Pow(2, num.Length - i - 1) * int.Parse(num[i].ToString());
return _num;
}
private static string Dec2Bin(int num)
{
if (num < 2) return num.ToString();
return Dec2Bin(num/2) + (num % 2).ToString();
}
public static string StrXor(string str, string key)
{
string _str = "";
string _key = "";
string _xorStr = "";
string _temp = "";
for (int i = 0; i < str.Length; i++)
{
_temp = Dec2Bin(str[i]);
for (int j = 0; j < 8 - _temp.Length + 1; j++)
_temp = '0' + _temp;
_str += _temp;
}
for (int i = 0; i < key.Length; i++)
{
_temp = Dec2Bin(key[i]);
for (int j = 0; j < 8 - _temp.Length + 1; j++)
_temp = '0' + _temp;
_key += _temp;
}
while (_key.Length < _str.Length) _key += _key;
if (_key.Length > _str.Length) _key = _key.Substring(0, _str.Length);
for (int i = 0; i < _str.Length; i++)
if (_str[i] == _key[i]) { _xorStr += '0'; } else { _xorStr += '1'; }
_str = "";
for (int i = 0; i < _xorStr.Length; i += 8)
{
char _chr = (char)0;
_chr = (char)Bin2Dec(_xorStr.Substring(i, 8)); //ERROR : (Index and length must refer to a location within the string. Parameter name: length)
_str += _chr;
}
return _str;
}
Problemem jest to, że zawsze się błąd, gdy chcę, aby odszyfrować się encryted tekst z tym kodem:
string enc_text = ENCRYPT.XORENC("abc","a"); // enc_text = " ♥☻"
string dec_text = ENCRYPT.XORENC(enc_text,"a"); // ArgumentOutOfRangeException
Jakieś wskazówki?
Wszystko, co mogę powiedzieć, to co? :) Być może jest to ćwiczenie edukacyjne, ale nie musisz konwertować znaków na ciągi, ręcznie je zamieniać, a następnie konwertować z powrotem na ciąg znaków. Jak udowodniono dzięki funkcjom Dec2Bin i Bin2Dec, char można konwertować do iz ints z rzutami, więc po prostu weź char z obu ciągów, zastosuj operator xor i wstaw nowy łańcuch. – tyranid
Byłoby pomocne, jeśli określisz, jaki błąd otrzymujesz :) –
Ponadto, możesz użyć StringBuilders zamiast ciągów. Ciągi są niezmienne (nie można ich zmienić), więc takie rzeczy jak _str + = _temp; generuje nowy ciąg za każdym razem, co powoduje, że ta metoda jest niepotrzebnie ciężka/droga. Użyj StringBuilder i .Append (temp). –