如何使用自己的RSA加密加密字节数组?

时间:2013-12-22 23:16:07

标签: c# arrays byte rsa

我正在尝试进行自己的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);
}

1 个答案:

答案 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。 (想到一个填充物)。另外,如果你想更好地理解算法,我建议你查找一些真实的开源实现。