公開鍵方式の暗号

[RSA 暗号]は公開鍵と秘密の鍵を使います。

前田稔(Maeda Minoru)の超初心者のプログラム入門

RSA 暗号の説明

  1. [RSA 暗号]は 1977 年に米国で開発された暗号で、公表されている鍵の数字を使って暗号化すると、受け手が秘密にしている鍵でしか復元出来ません。
    RSA は発明した数学者3人の頭文字をとって名付けられました。
  2. RSA 暗号の簡単な例を説明しましょう。
    公開鍵として二組の数字「7, 55」を、秘密の鍵として「3」を使います。
    公開鍵の片方(55)は2つの素数の積で、この因数分解ができれば秘密の鍵も分かるのですが、100桁の素数の積ならスーパーコンピュータでも手に負えません。
  3. 今送りたい数字を2とします。
  4. 今送りたい数字を13とします。

プログラムの説明

  1. dat[5] を暗号化して送り、復元した値を des[5] に格納します。
    //★ RSA 公開鍵のプログラム     前田 稔 ★
    using System;
    
    class console
    {
        static int[]  dat = { 2, 13, 8, 9, 10 };
        static int[]  sou = new int[5];  
        static int[]  des = new int[5];  
    
        public static void Main()
        {
            encode();
            decode();
            System.Console.ReadLine();
        }
    
        // hello → sou
        static void encode()
        {
            int  wk,i;
            long ans;
    
            for(i=0; i<5; i++)
            {   wk= dat[i];
                ans= wk * wk * wk * wk * wk * wk * wk;
                sou[i]= (int)ans%55;
                System.Console.WriteLine(dat[i] + "→" + sou[i]);
            }
        }
    
        // sou → des
        static void decode()
        {
            int  wk,i;
            long ans;
    
            for(i=0; i<5; i++)
            {   wk= sou[i];
                ans= wk * wk * wk;
                des[i]= (int)ans%55;
                System.Console.WriteLine("Decode : " + des[i]);
            }
        }
    }
    
  2. Main() 関数から encode(); に続いて decode(); を呼び出します。
    encode() 関数で dat[5] を暗号化して sou[5] に格納します。
    decode() 関数で sou[5] を復元して des[5] に格納します。
  3. 暗号化及び復元を行うときに、べき乗計算を行っています。
        ans= wk * wk * wk * wk * wk * wk * wk;
        ans= wk * wk * wk;
    
    このとき公開鍵や秘密の鍵が大きくなると long ではオーバーフローが起こります。
    まして100桁近くの素数を使うとなると、何桁の領域を用意すれば良いのか検討もつきません。
    そのようなときは Python やネット環境では Ruby が威力を発揮するようです。
    ここは C# のコーナーなのですが、特別に Python を使った RSA のプログラム を紹介します。

超初心者のプログラム入門(C# Frame Work)