原理RSAアルゴリズムとその実装

1、予備ステップ:

1)8ビットが2つの素数(素数)Pを取り、Q

2)N = P *は、Q、オイラー関数mを算出N(p、qは素数、m個である場合、nは素数関係の数を構成するよりも小さいか、またはNに等しい正の整数)で表されます=(P - 1)*(Q - 1)

3)ランダム整数eを選択し(ただし下位mと条件1 <E <M e及びm個の互いに素を満たす - 1、そうでなければ同一の公開鍵と秘密鍵)

4)整数d、ようにE * D MOD M = 1、すなわちEモジュロM(拡張ユークリッドアルゴリズム反転素子、エッセイ前音符)の逆数を見つけるを見つけるために

5)公開鍵(N、e)は、秘密鍵(N、D)であります

 

2、暗号化プロセス

(mingwen)^ E mod nを:数nで割っ番目E平文残り、すなわち、シーク後

 

図3に示すように、復号処理

(miwen)^ D mod nを:暗号文は、n番目の電力Dモジュロ数、すなわち、シークによって分割された後

 

4、暗号化と復号化の実現(学生証+暗号の名前):

  1つの インポートjava.util.ArrayListのの;
   2  
  。3つの パブリック クラスメイン{
   4。     静的のArrayList <整数> = suArr 新しい新規のArrayList <> ();
   5      静的 INT [] = XY 新しい新しい INT [2 ];
   6  
  。7      パブリック 静的 ボイドメイン(文字列[]引数){
   8          // 2つの8ビットの素数p、q及び従って素数の最大セットを取る要求の対象ので以上255 
  。9          int型の最大値= 255、P = 0、q = 0で、N-、M、E -1 =、インデックス= 0 ;
 10          のchar [] = MyInfoの"1700802067GJQ" .toCharArray()。
。11          INT [] =はmiwen 新しい新しい INT [myInfo.length];
 12である         CHAR [] = mingwen 新しい新しい CHAR [myInfo.length];
 13である          suArr.add(2 );
 14  
15          のためにINT I = 3;私は= maxに<。 ++ I ){
 16              IF (isSuShu(I))
 17。                 suArr.add(I);
 18れる         }
 。19  
20である         // 等しくないように注意2つの素数
21はある         一方、(P == Q){
 22は              P = getRanNum(suArr。サイズ());
 23れます             = Q getRanNum(suArr.size());
 24          }
 25  
26である          = P * N- ; Q
 27          (1 - P)*(Q - 1。M = );
 28  
29          // 取得した公開鍵(N、e)の
30          のためにint型 ; Iがm <; I ++のI = 2 ){
 31で             IF(isHuZhi(M、I)1 ==。{)
 32                  E = I;
 33はある                 BREAK ;
 34である             }
 35          }
 36  
37 [          IF = E(-1!){
 38が             exGcd(E、M)。
39              / * 
40              要件に従って(イー・D)%のM =中 1つの判定D(すなわち、X-Y [0])が負であってもよく、したがって、それは負の数にポジティブに変換され、変換の原理:
 41              %のB =(%のB + B)%のB
 42は、             負のaおよびbである場合、上記式に番号を使用して正であるの正数変換
 43である             * / 
44である             場合(XY [0] <0)XY [0 ] =(X-Y [0] +のm%のM)%のM、
 45              のSystem.out.println(+ String.valueOf(P)+ " "Pである" 、Qがである" + String.valueOf(Q));
 46である              システム.out.println( "公開鍵(" + String.valueOf(N)+ "" + String.valueOf(E)+ ")、 秘密鍵(" + String.valueOf(N)+ "" + String.valueOf(XY [0])+ ")" )。
47個の 
48              // 公開鍵を暗号化する(mingwen)MOD E ^ N- 
49              のためにCHARC:MyInfoの){
 50                  miwen [インデックス++] = MYPOW((INT )C、E、N-);
 51である             }
 52が              System.out.print( "暗号化された暗号文:"という53がある             ためint型C:miwen) {
 54は                  System.out.print(C + ""の);
 55              }
 56である             のSystem.out.println();
 57は、 
58              インデックス= 0 ;
 59              // プライベート鍵(miwen)を復号MOD D ^ N- 
60              のためのint型I :miwen){
 61である                  mingwen [インデックス] =(チャー)MYPOW(miwen [インデックス]、XY [0 ]、N-);
 62である                  、インデックス++ ;
 63である             }
 64  
65              :System.out.printの( "復号された平文" );
 66              チャーC:mingwen){
 67                  システム.out.print(C);
 68              }
 69  
70          }
 71は、 
72      }
 73は、 
74      // 数が素数であるか否かを判断する
75      パブリック 静的 ブール isSuShu(int型NUM)を{
 76          int型の最大値(=INT )Math.sqrt(NUM);
 77          INT I = 2;私は= maxに<; I ++は){
 78              IF(I NUM%== 0 79                  リターン falseに;
 80          }
 81          リターン trueに;
 82      }
 83  
84      / / ランダムアレイに素数
85      パブリック 静的 INT getRanNum(INT サイズ){
 86          リターン suArr.get((INT)(Math.random()* (サイズ)));
 87      }
 88  
89     // 2つの素数か否かを判断する
90      パブリック 静的 INT isHuZhi(INT A、int型B){
 91が         戻り 0 A:?IsHuZhi(B、%Bは== B);
 92      }
 93  
94      // 拡張ユークリッドEモジュロmが得られるの逆元アルゴリズム、秘密鍵(N、X-Y [0])となるよう 、 すなわち、(N、D​​)
95      公共 静的 ボイド exGcd(int型int型B){
 96          IF(B == 0 ){
 97              XY [0] = 1 ;
 98              [1] XY = 0 ;
 99          } さもなければ{
 100              exGcd(B、%のB)。
101              INT X = X-Y [0 ]。
102              X-Y [0] = X-Y [1 ]。
103              XY [1] = Xの- (A / B)* X-Y [1 ]。
104          }
 105      }
 106  
107      パブリック 静的 INT MYPOW(INT A、int型 B、int型M){
 108          INT RES = 1 109          =%M。
110          一方の(b!= 0 ){
 111              もし((B&1)== 1112の                  RES =(RES * A)%のM。
113              =(* A)%のM。
114              B >> = 1 115          }
 116          戻りRES。
117      }
 118  }
 119  
120  / * 
121  *参考:https://www.jianshu.com/p/fbb8bf7baa97 
122  * https://www.cnblogs.com/shuaihui520/p/8954788.html 
123  * のhttps:// www.cnblogs.com/linkzijun/p/6151486.html 
124   * /

 

おすすめ

転載: www.cnblogs.com/GjqDream/p/11543073.html