【问题标题】:How to encrypt an ASCII character with textbook RSA in C#?如何在 C# 中使用教科书 RSA 加密 ASCII 字符?
【发布时间】:2016-03-30 12:31:55
【问题描述】:

我在用指数和模数计算 ASCII 值时遇到问题。 我想用 RSA 算法计算“K”的 ASCII 值。

ascii 值中的 K 为 75

c   = m^e mod n
    = 75^41 mod 689
    = 316

那么如何在C#中将其制作成源代码呢?我收到错误“无法隐式转换类型”。

这是我的源代码

int n = 689;
int e = 41;
int d = 137;
string value = "K";

for (int i = 0; i < value.Length; i++)
{
    int c = (int)i;
    c = Math.Pow(i,e);
}
Console.ReadLine();

【问题讨论】:

  • 不确定它是否与您的错误消息有关,但您的代码似乎有错误,for 循环的内部部分应该在value[i] 而不是i 上工作。跨度>

标签: c# math encryption rsa modular-arithmetic


【解决方案1】:

由于75^41 将在转换为int 时溢出,因此您必须做一些数学运算。 A*B mod N 等价于(A mod N) * (B mod N) mod N,所以你只需在循环中做乘法,每次取余数:

public static int PowModN(int a, int b, int n)
{
    a = a % n;
    int c = 1;
    for(int i=1; i <= b; i++)
        c = (c*a % n);

    return c;
}

并将循环更改为:

for (int i = 0; i < value.Length; i++)
{
    int c = (int)i;
    c = PowModN(i,e,n);
}

【讨论】:

  • 我已经使用了你的方法,但结果仍然错误,错误消息是这样的“错误4非静态字段,方法或属性'ConsoleApplication1.Program.PowModN需要对象引用(int, int, int)'"
  • 如果您的所有代码都在static Main 中,那么您也可以创建PowModN static。我已经相应地更新了我的答案。
  • @JamesKPolk 伟大的收获,詹姆斯。固定。
【解决方案2】:
string value = "K";

// Convert the string into a byte[].
byte[] asciiBytes = Encoding.ASCII.GetBytes(value);

一旦你把数组取出来,你就可以把它设置为一个变量,然后做任何你需要做的数学运算。

【讨论】:

  • 我用过那个方法,但是当我用 math.pow() 操作它时,会出错,
  • Math.pow 输出是双精度,而不是整数。将其转换为 int 或将变量设为 double。我也相信内部参数也需要加倍。
【解决方案3】:

Math.Pow 的输出是一个双精度浮点数,并接受两个浮点数作为参数。至少,将Math.Pow(i,e) 的输出转换为 int,如下所示:

c = (int)Math.Pow(i,e)

这是 C# 最糟糕的事情之一,imo。不知道为什么它天生不支持整数幂运算。

i 是什么类型?它可能也需要转换为双打。

【讨论】:

  • 75^41 如果转换为 int 将溢出。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-15
  • 1970-01-01
  • 2013-03-17
  • 1970-01-01
  • 2013-06-08
  • 2018-05-02
相关资源
最近更新 更多