Mathematicaにおける文字のコード化

Mathematicaでの文字コ-ドの扱いをアルファベットについて述べます. Mathematicaではaが 97 です.

ToCharacterCode["a"]

{97}

ToCharacterCode["love"]

{108, 111, 118, 101}

数値から文字コ-ドの規則に従って変換します.

FromCharacterCode[97]

a

空白も含めアルファベットを 27 文字として扱います.

alphabet = "`abcdefghijklmnopqrstuvwxyz"

`abcdefghijklmnopqrstuvwxyz

ToCharacterCode[alphabet] - 96

{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26}

文字のコ-ド化

次のコマンドによって,与えられた文字列を数値に変換します.(以下,文字コード列を27進数表示桁として扱います.)

toNumCode[word_String] := FromDigits[ToCharacterCode[word] - 96, 27]

toNumCode["this`is`a`pen"]

3048363198518204570

コ-ドの文字化(逆変換)

逆に,与えられた10進数を,27進数表示した時の各桁を表示させます.

IntegerDigits[3048363198518204570, 27]

{20, 8, 9, 19, 0, 9, 19, 0, 1, 0, 16, 5, 14}

FromCharacterCode[{20, 8, 9, 19, 0, 9, 19, 0, 1, 0, 16, 5, 14} + 96]

this`is`a`pen

関数としてまとめます.

fromNumCode[num_] := FromCharacterCode[IntegerDigits[num, 27] + 96]

fromNumCode[3048363198518204570]

this`is`a`pen

公開鍵暗号・・・RSA体系(AからBへメッセージを送る場合)

AがBの公開鍵をもとに,メッセ-ジを送る場合を考えます.

Bの公開鍵  ( n , r )の作り方

まず,大きな二つの素数を用意します.

primeAbove[n_] := Module[{i = n}, While[! PrimeQ[i], i ++] ; i]

p = primeAbove[100^10]

100000000000000000039

q = primeAbove[145^10]

4108469075197275390631

次に,公開鍵の一つであるnをp ,q の積とします.

n = p q

410846907519727539223330293932693740234609

次にrを,(p-1)(q-1)と互いに素となるように選びます.

r = 9007 ;

確かに,

GCD[r, (p - 1) (q - 1)]

1

そして,Bはnとrを公開鍵として公表します.

送信者の暗号化方法(AはBの公開鍵を用いてメッセージを暗号化する)

Aはまずメッセ-ジ(平文)をつくります.(実際は,文字列を数字列に変換し,nより小さい適当な数字列にする)

message = 463616659 ;

そして,Bの公開鍵を用いて,次のように暗号化します.

angou = PowerMod[message, r, n]

16954000975174278144228464559019666109988

受信者の復号化(Bは自分だけが知っている秘密鍵  sを計算して,暗号文を復号化する)

Bは秘密鍵 sを計算します.( s は p , q から計算できる)

s = PowerMod[r, -1, (p - 1) (q - 1)]

310951856174306942917370209842739358370283

実際, s は r の逆数です.

Mod[r s , (p - 1) (q - 1)]

1

そして,次の計算でもとのメッセ-ジが復元されます.

moto = PowerMod[angou, s, n]

463616659

例題

具体的な文字列で確かめます.

hirabun = toNumCode["waseda`taro"]

4748541663046821

angoubun = PowerMod[hirabun, r, n]

94598034870345904635605235210693639536928

motobun = PowerMod[angoubun, s, n]

4748541663046821

fromNumCode[motobun]

waseda`taro


Created by Mathematica  (February 1, 2004)