2016-03-30 4 views
2

指数とモジュラスでASCII値の計算に問題があります。 私はRSAアルゴリズムで "K"のASCII値を計算します。 ASCII値でC#で教科書RSAでASCII文字を暗号化する方法は?

Kは、C#ソースコードにそれを作る方法を次に75

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

ですか?私は "暗黙の変換のタイプ"のエラーを受け取りました。

この私のソースコード

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

わからないそれはあなたのエラーメッセージに関連したなら、あなただけの残りの部分を毎回取って、ループ内の乗算を行うようA*B mod Nは、(A mod N) * (B mod N) mod Nに相当しますあなたのコードにエラーがあるようですが、forループの内部は 'i 'ではなく' value [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ではなくdoubleです。それをintにキャストするか、変数をdoubleにします。私はまた、内部パラメータも倍増する必要があると信じています。 – sjr59

0

Math.Powの出力は2倍で、引数として2つのfloatをとります。少なくとも、そのように、int型であることをMath.Pow(i,e)の出力をキャスト:

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

これは芋、C#の程度最悪のものの一つです。整数累乗を本来的にサポートしていない理由はわかりません。

iはどのタイプですか?ダブルスにキャストする必要があるかもしれません。

+1

'75^41'は' int'にキャストされるとオーバーフローします。 –

3

intにキャストすると、75^41はオーバーフローしますので、ちょっとしたやり方をする必要があります。

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

私はあなたのメソッドを使用していますが、結果はまだエラーです エラーメッセージは "エラー非スタティックフィールド、メソッド、 int、int) '" – Indra776

+0

すべてのコードが'静的Main'にある場合、 'PowModN'を' static'にすることもできます。私はそれに応じて私の答えを更新しました。 –

+0

@JamesKPolkグッドキャッチ、ジェームズ。一定。 –

関連する問題