2016-03-30 3 views
2

У меня проблема с вычислением значения ASCII с показателем и модулем. Я хочу рассчитать значение ASCII «K» с алгоритмом RSA.Как зашифровать символ ASCII с помощью учебника RSA в C#?

K в значении ASCii является 75

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

Тогда как сделать его в исходный код в C#? Я получил ошибку «не может преобразовать тип implicity».

это мой исходный код

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(); 
+0

Не уверен, если это связано с вашим сообщением об ошибке , но, похоже, у вас есть ошибка в коде, внутренняя часть цикла for должна работать с 'value [i]' вместо 'i'. – jojonas

ответ

1
string value = "K"; 

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

После того, как вы получите массив из положить вы можете установить его в переменную и делать то, что математики вам нужно сделать.

+0

У меня есть этот метод, но когда я управляю им с помощью math.pow(), которые делают ошибку, – Indra776

+0

Выход Math.pow является двойным, а не int. бросить его в int или сделать вашу переменную двойной. Я также считаю, что внутренние параметры также должны быть удвоены. – sjr59

0

Вывод Math.Pow является двойным и принимает два поплавка в качестве аргументов. По крайней мере, отлитый выход из Math.Pow(i,e) быть ИНТ, например, так:

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

Это одна из самых страшных вещей о C#, имо. Не уверен, почему он не врожденно поддерживает целочисленное возведение в степень.

Какой тип i? Возможно, его нужно будет забросить и в парные разряды.

+1

'75^41' будет переполняться, если будет применено к' int'. –

3

С 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); 
} 
+0

У меня есть ваш метод, но результат все еще ошибка, сообщение об ошибке вот так: "Ошибка Ссылка на объект требуется для нестатического поля, метода или свойства 'ConsoleApplication1.Program.PowModN (int, int, int) '" – Indra776

+0

Если весь ваш код находится в' static Main', вы также можете сделать 'PowModN'' static'. Я соответствующим образом обновил свой ответ. –

+0

@JamesKPolk Отличный улов, Джеймс. Исправлена. –