このディレクトリの索引

# p=1231, q=4567を選びます。 # eに65537 # e^-1=d mod φ(n) のdを計算して求めます。 #     d=3988493 # となります。 # # 暗号化と複合化の手順 # 公開鍵:N = 1231 * 4567 # E = 65537 # d = 3988493 # 文字コード:「a〜z」=01〜26、「A〜Z」=27〜52、空白=53 # 文書:This Anser p(1231). % 素数1 q(4567). % 素数2 法とする数(5621977). % 法とする数 暗号用の鍵(65537). % 公開鍵 復号用の鍵(3988493). % 秘密鍵 'RSA暗号化'(_文書,_暗号文字コードならび) :- 文書を文字コードで数値化します(_文書,_文字コードならび), 'RSA方式によるコード暗号化'(_文字コードならび,_暗号文字コードならび). 'RSA復号化'(_暗号文字コードならび,_文書) :- 'RSA方式によるコード復号化'(_暗号文字コードならび,_文字コードならび), 文字コードならびから文書を復元します(_文字コードならび,_文書). 'RSA方式によるコード暗号化'(_文字コードならび,_暗号コードならび) :- 公開鍵(_公開鍵), 法とする数(_法とする数), findall(_暗号コード,( '_文字コードを_暗号コードに変換'(_文字コードならび,_公開鍵,_法とする数,_暗号コード)),_暗号コードならび). '_文字コードを_暗号コードに変換'(_文字コードならび,_公開鍵,_法とする数,_暗号コード) :- member(_文字コード,_文字コードならび), _暗号コード is _文字コード ^ _公開鍵 mod _法とする数. 'RSA方式によるコード復号化'(_暗号文字コードならび,_文字コードならび) :- 秘密鍵(_秘密鍵), 法とする数(_法とする数), findall(_文字コード,( '_暗号文字コードを_文字コードに復号する'(_暗号文字コードならび,_秘密鍵,_法とする数,_文字コード)),_文字コードならび). '_暗号文字コードを_文字コードに復号する'(_暗号文字コードならび,_秘密鍵,_法とする数,_文字コード) :- member(_暗号文字コード,_暗号文字コードならび), _文字コード is _暗号文字コード ^ _秘密鍵 mod _法とする数. 文書を文字コードで数値化します(_文書,_文字コードならび) :- findall(_文字コード,( sub_atom(_文書,_,1,_,_文字), 文字コード(_文字,_文字コード)),_文字コードならび). 暗号コードを暗号文に変換(_暗号コードならび,_暗号文) :- findall(_暗号文字,( member(_暗号コード,_暗号コードならび), 文字コード(_暗号文字,_暗号コード)),_暗号文字ならび),atom_chars(_暗号文,_暗号文字ならび). 文字コードならびから文書を復元します(_文字コードならび,_文書) :- findall(_文字,( member(_文字コード,_文字コードならび), 文字コード(_文字,_文字コード)),_文字ならび), atom_chars(_文書,_文字ならび). 文字コード(_文字,_コード) :- char_code(_文字,_コード). '復号用の鍵の候補'(_素数p,_素数q,_暗号用の鍵,_復号用の鍵) :- '_素数p_1と_素数q_1の最小公倍数'(_素数p,_素数q,_素数p_1と_素数q_1の最小公倍数), '((_素数p_1と_素数q_1の最小公倍数 * N + 1) / _公開鍵) が整数となる秘密鍵候補を得る'(_素数p,_素数q,_素数p_1と_素数q_1の最小公倍数,_暗号用の鍵,_復号用の鍵). '((_素数p_1と_素数q_1の最小公倍数 * N + 1) / _公開鍵) が整数となる秘密鍵候補を得る'(_素数p,_素数q,_素数p_1と_素数q_1の最小公倍数,_暗号用の鍵,_復号用の鍵) :- between(10000,9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999,_復号用の鍵), 1 is (_暗号用の鍵 * _復号用の鍵) mod _素数p_1と_素数q_1の最小公倍数. '_素数p_1と_素数q_1の最小公倍数'(_素数p,_素数q,_素数p_1と_素数q_1の最小公倍数) :- succ(_素数p_1,_素数p), succ(_素数q_1,_素数q), 最小公倍数(_素数p_1,_素数q_1,_素数p_1と_素数q_1の最小公倍数). 最小公倍数(_m,_n,_最小公倍数) :- Y is _m * _n, ユークリッドの互除法により最大公約数を得る(_m,_n,_最大公約数), _最小公倍数 is ( _m * _n ) // _最大公約数. 'ユークリッドの互除法により最大公約数を得る'(_m,_m,_m). 'ユークリッドの互除法により最大公約数を得る'(_m,_n,_最大公約数) :- _m > _n, _剰余 is _m mod _n, ユークリッドの互除法により最大公約数を得る(_m,_n,_剰余,_最大公約数). 'ユークリッドの互除法により最大公約数を得る'(_m,_n,_最大公約数) :- _m < _n, ユークリッドの互除法により最大公約数を得る(_n,_m,_最大公約数). ユークリッドの互除法により最大公約数を得る(_,_最大公約数,0,_最大公約数) :- !. ユークリッドの互除法により最大公約数を得る(_m,_n,_剰余,_最大公約数) :- 'ユークリッドの互除法により最大公約数を得る'(_n,_剰余,_最大公約数).