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)== 1) 112の 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 * /