Здравствуйте! Помогите пожалуйста разобраться, пишу алгоритм "Гаммирование с обратной связью", вроде как разобрался с шифрованием и расшифрованием, но не работает... выкладываю процедуры:
(пишу С#)
Шифрование:
Код:
{
cr_s = "";
Data.Text = "";
int i;
Random a = new Random();
UInt32 sin1, sin2;
sin1 = Convert.ToUInt32(a.Next());
sin2 = Convert.ToUInt32(a.Next());
circle_zash(ref sin1, ref sin2);
const_a = sin1;
const_b = sin2;
UInt32[] mas_new = new UInt32[s.Length];
for (i = 0; i < s.Length - 1; i = i + 2)
{
circle_zash(ref sin1, ref sin2);
mas_new[i] = Convert.ToUInt32((int)s[i]) ^ sin1;
mas_new[i + 1] = Convert.ToUInt32((int)s[i + 1]) ^ sin2;
sin1 = mas_new[i];
sin2 = mas_new[i + 1];
}
for (i = 0; i < mas_new.Length; i++)
cr_s += Convert.ToChar((byte)mas_new[i]);
button7.Enabled = true;
Data.Text = cr_s;
}
Дешифрование:
{
s_wr = "";
Data.Text = "";
int i;
UInt32 sin1, sin2;
sin1 = const_a;
sin2 = const_b;
// const_a и const_b - синхропосылка
UInt32[] mas_new = new UInt32[s_de.Length];
for (i = 0; i < s_de.Length - 1; i = i + 2)
{
circle_zash(ref sin1, ref sin2);
mas_new[i] = Convert.ToUInt32(s_de[i]) ^ sin1;
mas_new[i + 1] = Convert.ToUInt32(s_de[i + 1]) ^ sin2;
sin1 = mas_new[i];
sin2 = mas_new[i + 1];
}
for (i = 0; i < mas_new.Length; i++)
s_wr += Convert.ToChar((byte)mas_new[i]);
button3.Enabled = true;
Data.Text = s_wr;
}
(ну вобщем то они одинаковые)
и вложенные циклы:
private void circle_zash(ref UInt32 a, ref UInt32 b)
{
int j,k;
string ku;
for (j = 0; j < 3; j++)
{
for (k = 0; k < 7; k++)
{
UInt32 w = Convert.ToUInt32(keymas[k], 2);
ku = Convert.ToString(keymas[k]);
UInt32 f = BaseCircle(ref a, ref b, ku);
}
}
for (k = 7; k < 0; k--)
{
UInt32 w = Convert.ToUInt32(keymas[k], 2);
ku = Convert.ToString(keymas[k]);
UInt32 f = BaseCircle(ref a, ref b, ku);
}
}
private UInt32 BaseCircle(ref UInt32 a, ref UInt32 b, string k)
{
UInt32 S;
UInt32 N1 = a;
UInt32 N2 = b;
UInt32 X = Convert.ToUInt32(k, 2);
S = N1 ^ X;
int i;
string s32 = Convert.ToString(S, 2);
string[] si = new string[8];
for (i = 0; i < 8; i++)
{
if (s32.Length >= 4)
{
si[i] = s32.Substring(s32.Length - 4);
s32 = s32.Remove(s32.Length - 4);
}
if (s32.Length == 0){ si[i] = "0000"; }
else if (s32.Length < 4)
{
si[i] = s32;
s32 = "";
}
}
for (i = 0; i < 8; i++)
si[i] = zamena(ref si[i], i);
s32 = "";
for (i = 0; i < 8; i++)
s32 = si[i] + s32;
S = Convert.ToUInt32(s32,2);
S = S << 11;
S = S ^ N2;
N2 = N1;
N1 = S;
a = N1;
b = N2;
return S;
}
Буду очень признателен.