1

自作した暗号を数学的に補強したい

243
0

こんにちは、Nappleです。
今回は自作した暗号の説明と、その背景で動く理論を数学的に検討していきます。

以降、今回扱う暗号をOCCO(Operators Chain COde)と呼ぶことにします。

・どちらかというと工学(情報工学)の内容かも
・実用性の無視
・誤りがあったり厳密じゃなかったりする場合があります

余談: Mathlogのユーザは当然数学系の人が多い一方で、工学系や自然科学系の記事もある程度存在するように感じる。どれくらいの比率なんでしょう…

OCCOのアルゴリズム

厳密な実装とは少々異なりますが、大枠は同じです。

  1. 文字と数値(0以上M未満)を対応付ける変換表を用意する。
  2. 入力として 平文Pと鍵sを受け取る。
  3. sから区切り値Cを設定する
  4. 平文Pから1文字取り出して、対応する数字をpとする。
  5. sに依存するnの関数{f0,f1,,fC1}を用意する。
  6. pに対して初期値n0(C以上M未満)をランダムに設定する。
  7. pniが等しくなるまでni+1=fλi(ni)を繰り返す。このとき、
     ・確率q|pni||pfλi(ni)|を満たすように
     ・そうでなければランダムに
    λi(0,1,,C1)を選ぶ。
  8. λiと初期値n0を、変換表を使って文字に逆変換して並べる。
  9. 平文Pのすべての文字に対して4.から8.を繰り返す。
  10. 9.を並べる。

わからないよ!

自分もよくわかってないです。説明が煩雑ですみません。
例をあげて考えていきましょう。

1. 文字と数値を対応付ける変換表を用意する

まず変換表を用意します。今回は4つの文字で考えます。(M=4)

文字abcd
数値0123

2. 入力として平文Pと鍵sを受け取る。

平文: P="add"
 鍵: s=3
としましょう。
注:平文というのは暗号化したい元の文字列のことです。

3. 区切り値Cを決める

区切り値Cは、使用するM個の文字のうちC個を関数(オペレータ)を指す記号に使うと決めるための値です。残りのMC個は初期値を指す記号に使います。

今回はCを次の式で決めることとします。
C=(s+1)%(M2)+2
a%bab

s=3,M=4なのでC=2になります。

4. オペレータfjを用意する

オペレータというのはnを変数として持つ関数{f0(n),f1(n),,fC1(n)}のことです。
オペレータは予め決めておくもので、最大C種類設定できます。

今回の例ではC=2なので、{f0,f1}を以下で定義します。
f0(n)=n+s, f1(n)=n1

5. 文字を取り出して数値にする

事前の準備が済んだので、ここからは実際に暗号化する作業になります。

まずは平文P="add"から最初の文字"a"を取り出しましょう。
さらに、変換表を使って平文を数値にします。
aに対応するのは0なので、p=0です。

6. 初期値を決める

このpに対する初期値n0を決めます。
Cn0<Mを満たす整数をランダムに取ればいいので、今回は仮にn0=2だったとしましょう。

7.p=niになるまでオペレータを適用する

目標の値pに一致するように、規則に従って初期値n0にオペレータfλiを適用していきます。

つまり以下が成り立ってほしいわけです。
p=fλK1((fλ0(n0)))=fλK1fλ0(n0)

このλi0λiC1を満たす自然数であり、
適当な乱数r(0,1)を振って、事前に決めていたしきい値qに対し
rqならば、|pni||pfλi(ni)|を満たすようなλiを選ぶ。
r>qならば、ランダムなλiを選ぶ。
という規則に従って決められます。
これをp=niとなるまで繰り返します。

しきい値q=0.5として、実際にやってみましょう。

目標p=0, 初期値n0=2

(1)乱数を振ってr=0.7が出た。

r>qなので適当にλ0を選びます。
λ0=1: n1=fλ0(n0)=n01=1

pn1なので続けます。

(2)乱数を振ってr=0.2が出た。

rqなので差が小さくなるようなλ1を選びます。
λ1=1: n2=fλ1(n1)=n11=0

p=n2なのでここで終わりです。
このようにして数列λ=(λ0,λ1)=(1,1)が得られました。

8. オペレータと初期値を文字に戻す

求めたλn0を変換表を使って文字に戻します。
λ0=1b
λ1=1b
n0=2c

なので、並べると"bbc"が得られます。これが入力の"a"に対応してるというわけですね。

ちなみに、これはただの決めごとなのですがλは逆順に並べます。

9. すべての文字に対して繰り返す。

同様に平文P="add"のそれぞれに同じことを繰り返すと、以下のような対応が得られます。
abbc
dbbabd
dbbbabac

最終的にこれらを並べた"bbcbbabdbbbabac"が平文Pに対する暗号文として得られます。
やったー!

※復号のアルゴリズムは解説しませんが、(多分)一般に一意な復号が可能です。

ざっくりした利点と欠点

利点

・乱数を含んでいるので必ずしも1対1にならない
・自由度が高い

欠点

オペレータの適切な設定方法が不明
・暗号文の長さ(符号化率)が一定でない
・区切り値の適切な設定方法が不明 (実装で解決可能)
・文字の出現確率に偏りがあり解読が容易 (実装で解決可能)

ここから本当の本題

前置きが非常に長くなりましたが、ここからが本題で、欠点の1つ目に上げた「オペレータの適切な設定方法が不明」という問題についてです。

今回の例では有限回のオペレータの適用で必ず暗号化できるようなオペレータを取りました。しかし、オペレータはある程度複雑であるほうが好ましいですし、どのような変換表でもどのような鍵でも動く必要があります。
どのような条件をつければオペレータは適切になるのでしょうか。

うまく行かない例を見てみましょう。

うまくいかない例

(1)有限回の試行でpにたどり着けない場合

f0(n)=n
f1(n)=sn

これはどのようにsを取ったとしても、初期値n0sk倍しか取ることができません。もしp=n0(s1)のような場合、一般にはたどり着くことができないのでこれは不適切です。

(2)発散してpにたどり着けなくなる場合

f0(n)=n+1
f1(n)=2n1

これはn1のとき、f0(n)>n,f1(n)nなので、どのように値をとっても増え続けてしまいます。もしp=0ならばni1になった時点で到達不可能になるのでこれも不適切です。

解決策

以上のような問題を解決する、オペレータ設定方法を考えましょう。

と、その前に、新たな用語を定義しておきます。

オペレータ集合の網羅性

オペレータ集合f={f0(n),...,fC1(n)}
任意の初期値n0Nと鍵sNおよび、ある集合Aに対して
あるλ={λ0,,λn}, λiN,0λi(C1)が存在して、

AF={nm|nm=fλmfλ0(n0)}

を満たすとき、fA網羅的であると言う。

また、このF={nm|nm=fλmfλ0(n0)}fの像と呼ぶことにする。

これを使うと、今求めているのはN網羅的なfということになります。

うまくいかない例で示した2つのオペレータ集合の像はそれぞれ、
(1) F={sn|nN}
(2) F={n|n0n,nN}
となるのでN網羅的ではありません。

fN網羅的であるための十分条件

あるλがあって、オペレータ集合fの像F
n+1,n1F
を満たすとき、fN網羅的である。

n+1Fであるとき、あるλ={λ0,,λm}があって
n+1=fλmfλ0(n)=:f+(n)
任意のkNに対してn+k=f+k(n)が成り立つので、{m|m>n0,mN}F
注) fkfk回合成

n1Fのときも同様にして、{m|m<n0,mN}Fがわかる。

また、n0F

ゆえに、fN網羅的である。

考えてみれば当たり前ですが、こういうことが成り立ちます。

最適なfの例

(1)f1(n)=n+1,f2(n)=n1 : 最小のN網羅的オペレータ集合
(2)f1(n)=2n,f2(n)=n1
(3)f1(n)=n2,f2(n)=2n1,f3(n)=n3

でも、待って

最適なfはその像がn+1,n1を持つことがわかりましたが、まだ問題は解決しません。

・任意のCsに対して最適なfを設定する方法は?
fN網羅的であるための必要条件は?

でも疲れたので続きは次回以降の記事に。
それではまた(突然の別れ)

投稿日:2024216
OptHub AI Competition

この記事を高評価した人

高評価したユーザはいません

この記事に送られたバッジ

バッジはありません。
バッチを贈って投稿者を応援しよう

バッチを贈ると投稿者に現金やAmazonのギフトカードが還元されます。

投稿者

🤔 数学の専門ではないです。 思いついたことを書きます。

コメント

他の人のコメント

コメントはありません。
読み込み中...
読み込み中
  1. OCCOのアルゴリズム
  2. わからないよ!
  3. 1. 文字と数値を対応付ける変換表を用意する
  4. 2. 入力として平文Pと鍵sを受け取る。
  5. 3. 区切り値Cを決める
  6. 4. オペレータfjを用意する
  7. 5. 文字を取り出して数値にする
  8. 6. 初期値を決める
  9. 7.p=niになるまでオペレータを適用する
  10. 8. オペレータと初期値を文字に戻す
  11. 9. すべての文字に対して繰り返す。
  12. ざっくりした利点と欠点
  13. 利点
  14. 欠点
  15. ここから本当の本題
  16. うまくいかない例
  17. 解決策
  18. でも、待って