我正在尝试进行自己的RSA加密。我知道C#中有一些构建方法,但我想创建自己的程序,因为我想了解它是如何完成的。在从字节数组转换到字节数组时,我想我搞砸了。如果有人能把我推向正确的方向,那就太棒了:)。
private void btnEncrypt_Click(object sender, EventArgs e)
{
EncryptieModulo = 55;
PublicKey = 27;
var PlainText = Encoding.UTF8.GetBytes(txtPlaintext.Text);
for (int i = 0; i < PlainText.Length; i++)
{
PlainText[i] = (byte)(BigInteger.Pow(PlainText[i], PublicKey) % EncryptieModulo);
}
textBox1.Text = Convert.ToBase64String(PlainText);
}
private void btnDecrypt_Click(object sender, EventArgs e)
{
EncryptieModulo = 55;
PrivateKey = 3;
var CrypText = Convert.FromBase64String(txtCCryptedText.Text);
for (int i = 0; i < CrypText.Length; i++)
{
CrypText[i] = (byte)(BigInteger.Pow(CrypText[i], PrivateKey) % EncryptieModulo);
}
textBox1.Text = Encoding.UTF8.GetString(CrypText);
}
答案 0 :(得分:1)
您编码的值必须小于Modulo,在您的情况下为55.为了使您的示例有效,您需要将Encoding.UTF8.GetBytes
/ Encoding.UTF8.GetString
替换为您自定义的自定义函数拉丁字母字符到0-54之间和之后的字节。
例如,您可以这样做:
private static byte[] GetBytes(string s)
{
byte[] result = new byte[s.Length];
for (int i = 0; i < s.Length; i++)
{
if (s[i] >= 'a' && s[i] <= 'z')
{
result[i] = (byte)(s[i] - 'a');
continue;
}
if (s[i] >= 'A' && s[i] <= 'Z')
{
result[i] = (byte)(s[i] - 'A' + 26);
continue;
}
throw new ArgumentOutOfRangeException();
}
return result;
}
private static string GetString(byte[] b)
{
StringBuilder sb = new StringBuilder(b.Length);
for (int i = 0; i < b.Length; i++)
{
if (b[i] >= 0 && b[i] < 26)
{
sb.Append((char)('a' + b[i]));
continue;
}
if (b[i] >= 26 && b[i] < 52)
{
sb.Append((char)('A' + b[i] - 26));
continue;
}
throw new ArgumentOutOfRangeException();
}
return sb.ToString();
}
现在用我们新的Encoding.UTF8.GetBytes
/ Encoding.UTF8.GetString
替换你,你应该好好去。
注意但是,你刚刚做的并不是真正的RSA加密。您只需使用非常短的密钥单独加密每个字节。这种实现的安全性是zilch。有关“真实”实施的所有复杂性,请参阅the spec。 (想到一个填充物)。另外,如果你想更好地理解算法,我建议你查找一些真实的开源实现。