Алгоритм Шамира
Код:
// x^y mod p
public int fun(int p, int a, int b)
{
int s = 1;
for (int i = 1; i <= b; i++)
{
s = (s * a) % p;
}
return s;
}
// Генерируем Ca, Da и Сb, Db
public void Generate(ref int iA, ref int iB, int p)
{
iA = 1;
iB = Rnd.Next(p);
while (iA < p)
{
if ((iA * iB) % (p - 1) == 1)
return;
iA = iA + 1;
}
if (iA == p)
Generate(ref iA, ref iB, p);
}
private void button1_Click(object sender, EventArgs e)
{
string sKey;
Random myrandom = new Random();
int p = 127, cb = 1, ca = 1, da = 1, db = 1, k;
Generate(ref da, ref ca, p);
Generate(ref db, ref cb, p);
sKey = textBox1.Text;
textBox2.Clear();
textBox3.Clear();
textBox4.Clear();
textBox5.Clear();
for (int i = 0; i < sKey.Length; i++)
{
k = (int)sKey[i];
// Step 1
k = fun(p, k, ca);
textBox2.Text = textBox2.Text + k.ToString()+".";
// Step 2
k = fun(p, k, cb);
textBox3.Text = textBox3.Text + k.ToString() + ".";
// Step 3
k = fun(p, k, da);
textBox4.Text = textBox4.Text + k.ToString() + ".";
// Step 4
k = fun(p, k, db);
textBox5.Text = textBox5.Text + (char)k;
}
}
}
public int fun(int p, int a, int b)
{
int s = 1;
for (int i = 1; i <= b; i++)
{
s = (s * a) % p;
}
return s;
}
// Генерируем Ca, Da и Сb, Db
public void Generate(ref int iA, ref int iB, int p)
{
iA = 1;
iB = Rnd.Next(p);
while (iA < p)
{
if ((iA * iB) % (p - 1) == 1)
return;
iA = iA + 1;
}
if (iA == p)
Generate(ref iA, ref iB, p);
}
private void button1_Click(object sender, EventArgs e)
{
string sKey;
Random myrandom = new Random();
int p = 127, cb = 1, ca = 1, da = 1, db = 1, k;
Generate(ref da, ref ca, p);
Generate(ref db, ref cb, p);
sKey = textBox1.Text;
textBox2.Clear();
textBox3.Clear();
textBox4.Clear();
textBox5.Clear();
for (int i = 0; i < sKey.Length; i++)
{
k = (int)sKey[i];
// Step 1
k = fun(p, k, ca);
textBox2.Text = textBox2.Text + k.ToString()+".";
// Step 2
k = fun(p, k, cb);
textBox3.Text = textBox3.Text + k.ToString() + ".";
// Step 3
k = fun(p, k, da);
textBox4.Text = textBox4.Text + k.ToString() + ".";
// Step 4
k = fun(p, k, db);
textBox5.Text = textBox5.Text + (char)k;
}
}
}