マンドルブロ集合の描画を使用してデータを暗号化できること、およびこの暗号化アルゴリズムは量子安全性があること (多くの一般的に使用されるアルゴリズムとは異なり、量子コンピューターで解読できないこと) を聞いたことがあります。Google で詳細を調べてみましたが、技術に詳しくない読者向けの記事しか見つけられませんでした。この魅力的な主題についてもっと学ぶために私が使用できる情報源はありますか?
7 に答える
第一に、インターネット上の記事のほとんどが非常に曖昧に見える理由は、それらがすべて一握りの特許出願から引き出されているように見えるからです. 新しい数式とアルゴリズムの特許出願は、常に何かを隠しているように見える傾向があります。そのようなものの無許可の使用を監視することは悪名高く、申請者は特許保護と企業秘密保護の間の境界線をまたがろうとします. ここでのポイントは、必ずしもすべてが BS であるという意味ではないということです。
第二に、私が知っているすべてのフラクタル マッピングは、厳密には 1 対 1 ではないため、ある程度「損失」があります。また、非可逆フラクタルによって直接「暗号化」されたものは、キーを使用しても復号化できないことも意味します。したがって、いかなる種類の直接フラクタル ハッシュも可逆ではありません。
したがって、フラトカル暗号化は、メッセージ自体がフラクタルで直接暗号化されていることを意味するものではありません。むしろ、実際のメッセージの暗号化と復号化に使用される「ローカル」キーまたは「シーケンシャル」キーの同時生成を可能にするために、フラクタルが「マスター キー」として使用されることを意味する必要があります。
先に進む前に、暗号化の基本を確認しましょう。
暗号化アルゴリズムの原則
受信者に安全に送信できるようにしたい j=1 から N の一連のメッセージ M(j) があるとします。次のような可逆暗号化関数 E が必要です。
E(M(j), k) --> X(j)
(k) は暗号化キー、X(j) は対応する暗号化されたメッセージです。次に、暗号化されたメッセージを解読するための補完的な関数 E' を持つ受信者にメッセージが送信されます。
E'(X(j), k) --> M(j)
ただし、知る限り、フラクタルを使用して E() と E'() 関数の両方を作成することはできません。一方、XOR のように独自の補完機能を持つ関数がいくつかあります。
( M(j) XOR k ) --> X(j) *and also* ( X(j) XOR k ) --> M(j)
しかし、XOR は弱い暗号化機能でもあり、単一のメッセージに対しては完全に安全ですが、同じキー (k) で複数回使用すると、リバース エンジニアリング (k) が非常に簡単になり、XOR は安全ではなくなります。単一キー暗号化システム用。これは、毎回異なるキーを使用することで解決できます。
M(j) XOR K(j) --> X(j)
と
X(j) XOR K(j) --> M(j)
これは 1 つの問題を解決しますが、送信者と受信者の両方が同じ鍵のセットを持っていることをどのように保証するかという別の問題をもたらします。一連のキーを送信することは、一連のメッセージを安全に送信するという元の問題に戻るため、解決策にはなりません。
代わりに、送信者と受信者の両方で一連の同一のキーを個別に生成したいと考えています。しかし、それ自体で暗号的に安全な一連のキーを生成できる必要があります。つまり、外部のオブザーバーが前のキーをすべて知っていたとしても、シリーズの次のキーを正確に予測することはできません。また、(推測できないようにするために) 毎回まったく異なる一連のキーが必要になるため、実際には Key シリーズ自体がキーベースである必要があります。
これに対する解決策は、マスター キー MK と別の暗号化関数 H を使用して、各メッセージに固有のキーを生成することです。
H(MK, j) --> K(j); M(j) XOR K(j) --> X(j)
と
H(MK, j) --> K(j); X(j) XOR K(j) --> M(j)
ここでフラクタルの出番です。なぜなら、上で見たように、H 関数は相補関数 H' を必要としないからです。したがって、一連のローカル キーを生成するためにマスター キーを使用して Fractal ベースの関数を自由に使用できます。
実装例と説明
以下は、フラクタル暗号化の単純な実装であるこのアプローチを示す VB.NET クラスです。
Option Explicit On
Public Class FractalEncrypt
'Fractal Encryption / Decryption demo class'
' 2009-08-08 RBarryYoung Created.'
' note: '
' Property of R. Barry Young & Proactive Performance Solutions, Inc.,'
' protected under open source license'
Public Const CrLower As Double = 0.1
Public Const CrUpper As Double = Math.PI / (2 * Math.E)
Public Const CiLower As Double = 0.1
Public Const CiUpper As Double = Math.PI / (2 * Math.E)
Public ReadOnly Cr As Double, Ci As Double, Sr As Double, Si As Double
Public ReadOnly BaseSeq As Integer
Public Sub New(ByVal KeyR As Double, ByVal KeyI As Double, ByVal SaltR As Double _
, ByVal SaltI As Double, ByVal SeqStart As Integer)
Cr = ((KeyR - CrLower) Mod (CrUpper - CrLower)) + CrLower
Ci = ((KeyI - CiLower) Mod (CiUpper - CiLower)) + CiLower
Sr = ((SaltR - CrLower) Mod (CrUpper - CrLower)) + CrLower
Si = ((SaltI - CiLower) Mod (CiUpper - CiLower)) + CiLower
BaseSeq = SeqStart
End Sub
Public Function Encrypt(ByVal Text As String, ByVal Seq As Integer) As String
'Encrypt the string passed, adding on the sequence as a header.'
Debug.Print("Encrypt<" & Seq & ">" & Len(Text) & ":" & Text)
Dim CurSeq = BaseSeq + Seq
'make the sequence prefix'
Dim enc As String = Format(Seq, "000000000") & ":"
Dim EncryptedOffset As Integer = 0
Do While EncryptedOffset < Len(Text)
'encrypt each 4 characters separately'
enc = enc & Encrypt4(Text, EncryptedOffset, CurSeq)
EncryptedOffset = EncryptedOffset + 4
Loop
Return enc
End Function
Public Function Decrypt(ByVal CrypText As String) As String
'Decrypt the string passed, extracting the Sequence header first.'
'Extract the sequence'
Dim Seq As Integer = CInt(Left(CrypText, 9))
Dim CurSeq = BaseSeq + Seq
'Extract the encrypted message payload'
CrypText = Mid(CrypText, 11)
Debug.Print("Decrypt<" & Seq & ">" & Len(CrypText) & ":" & CrypText)
'Now decrypt it 4 characters at a time'
Dim txt As String = ""
Dim EncryptedOffset As Integer = 0
Do While EncryptedOffset < Len(CrypText)
'encrypt each 4 characters separately'
txt = txt & Encrypt4(CrypText, EncryptedOffset, CurSeq)
EncryptedOffset = EncryptedOffset + 4
Loop
Return txt
End Function
Public Function Encrypt4(ByVal text As String, ByVal StrOffs As Integer _
, ByVal CurSeq As Integer) As String
'Encrypt/Decrypt 4 characters of the string.'
' (note: encrypt and decrypt are the same because XOR is its own complement)'
Dim str As String = Mid(text, StrOffs + 1, 4)
Dim enc As String
'generate the seeds from the current message sequence and the current string offset'
'1. define complex Seq as (CurSeq, StrOffs)'
Dim SeedR As Double = (Sr * CurSeq) - (Si * StrOffs)
Dim SeedI As Double = (Sr * StrOffs) + (Si * CurSeq)
'2. remap the result back into the valid range'
SeedR = SeedR Mod (CrUpper - CrLower)
SeedI = SeedI Mod (CiUpper - CiLower)
'generate the local keys from the master keys'
Dim Zr As Double = SeedR, Zi As Double = SeedI
Dim r As Double, i As Double, zx As Integer = 0, zy As Integer = 0
'1. apply the julia formula 16 times to hash it up good.'
For j As Integer = 1 To 16
'Z(n+1) = Z(n)^2 - C:'
r = Zr * Zr - Zi * Zi - Cr
i = 2 * Zr * Zi - Ci
If Double.IsInfinity(r) Or Double.IsNaN(r) Then r = (zx \ zy) 'force an error'
If Double.IsInfinity(i) Or Double.IsNaN(i) Then i = (zx \ zy) 'force an error'
'put back into Z:'
Zr = r : Zi = i
Next
'2. remap the back into our results window'
Zr = ((Zr - CrLower) Mod (CrUpper - CrLower)) + CrLower
Zi = ((Zi - CiLower) Mod (CiUpper - CiLower)) + CiLower
'Form the local keys into the Mask Keys variables (M).'
Dim Mr As Integer, Mi As Integer
'1. scale them both into the range of about 2^30.'
Mr = CInt((1024 * 1024 * 1024) * (Zr - CrLower) / (CrUpper - CrLower))
Mi = CInt((1024 * 1024 * 1024) * (Zi - CiLower) / (CiUpper - CiLower))
'2. only use the lower 16 bits that are left:'
Mr = Mr And 65535 : Mi = Mi And 65535
'encode the current 4 characters as a 2 * 2-byte integer'
Dim R2 As Integer, I2 As Integer
If StrOffs + 1 <= Len(text) Then R2 = Asc(Mid(text, StrOffs + 1, 1))
If StrOffs + 2 <= Len(text) Then R2 = R2 + 256 * Asc(Mid(text, StrOffs + 2, 1))
If StrOffs + 3 <= Len(text) Then I2 = Asc(Mid(text, StrOffs + 3, 1))
If StrOffs + 4 <= Len(text) Then I2 = I2 + 256 * Asc(Mid(text, StrOffs + 4, 1))
'Encrypt (or Decrypt) the data by masking it with the local Keys'
R2 = R2 Xor Mr
I2 = I2 Xor Mi
'recode them as ascii strings again:'
enc = Chr(R2 And 255) & Chr(R2 \ 256) & Chr(I2 And 255) & Chr(I2 \ 256)
Return enc
End Function
End Class
完全な Visual Studio Windows プロジェクトと Windows exe は、http://www.codeplex.com/FractalEncryptDemoにあります。
このクラスは、複素平面での二次再帰 Z(i+1) = Z(i)^2 - C に基づく Julia セットを使用します。生成されたマスター キーは、5 つの数値、0 ~ 1 の 4 つの倍精度浮動小数点値、および 1 ~ 1,000,000,000 の 1 つの整数で構成されます。最初の 2 つの double 値は、上記の式で C の実部と虚部を定義します。次の 2 つの double は、開始 Z を生成するために使用されるシード値の実部と虚部を定義します。
これらの値は両方とも (モジュラス演算を介して) (0.1, 0.1) から約 (0.55, 0.55) までの小さな正方形領域にマップされます。これは、フラクタル計算がオーバーフローまたはアンダーフローしないようにするために行われます (ただし、これがまだ可能でないかどうかはわかりません)。最後に、整数値はシーケンス値 (上記の式の「j」) のオフセットとして機能します。
メッセージは一度に 4 つの ASCII 文字でエンコードされます。最初に、シーケンス番号 (j) がシーケンス オフセットに追加されます。これは、4 バイト オフセットと共にメッセージに複素シード値を掛けた複素数として使用され、アクティブな四角形に再マップされて、開始 Z 値。次に、Julia セットの再帰 (Z = Z^2 + C) が 16 回適用され、最終結果が再びアクティブな四角形に再マップされます。
次に、この最終的な複素数値に 2^30 を掛けて、実数部と虚数部の両方を整数に変換し、それぞれの下位 16 ビットを使用してローカル キーの 32 ビット (4 バイト) を提供します。これは、送信側で対応する 4 つのメッセージ バイトに対して XOR されて暗号化されるか、受信側で暗号化されたテキストに対して XOR されて復号化されます。
プロセスの概要を説明する一般的な記事は次のとおりです。
http://www.techbriefs.com/content/view/2579/32/
これはより詳細で、アルゴリズムと例を提供します。
http://medwelljournals.com/fulltext/ajit/2007/567-575.pdf
(代替 URL): http://docsdrive.com/pdfs/medwelljournals/ajit/2007/567-575.pdf
sci.crypt グループでいくつかの議論があります:
コードとサンプルを提供している日本の会社は次のとおりです (パッケージの価格は 50 ドルのようです)。
http://www.summersoftlabs.com/intro.htm
これは数分間ぶらぶらした結果であるため、マイレージは異なる場合があります. しかし、トピックは面白そうです。すぐに実用化できるわけではありませんが、問題に対するさまざまなアプローチを考えている研究者がいるということは素晴らしいことです。
このアプローチについて聞いたことがあります。しかし、これは現実世界のアルゴリズムというよりも、おもちゃのようなものです。
「パッド」として設定されたマンデルブロの座標のウィンドウを使用し、入力などを xor するため、ウィンドウの座標 (およびサンプルの間隔) が「パスワード」になります。セット内で非常に深いウィンドウを選択すると、評価するために非常に多くの反復が必要になり、理論的には、これをブルート フォースすることは困難です。
実数の大きなバンドに注意してください..おそらくランレングスでエンコードされたマンドルブロットです。
これは反復的であるため、誰かがこれを「量子証明」であると考えていると思います。実際に反復せずに、マンドルブロットセット上の位置が収束するのにかかる反復回数を数えることはできません。それが本当かどうかはわかりません。
ただし、これを行うことに利点はないと思います (「フラクタル」と呼ぶ以外に)。多くの欠点と脆弱性を作成する機会があります。よく研究された公開/秘密鍵暗号化アルゴリズムを使用する方がはるかに良いでしょう。
多変量公開鍵暗号システム(しばしば MVKP と略される) をご覧になりたいと思われるかもしれません。これは、量子コンピューティングに耐性のある暗号化の分野で関心が高まっているもう 1 つの分野です。
何かがスタートレックで参照されているからといって、それが最良の選択になるわけではありません;)
現在、 Fractal EncryptionC#
の実装を主張するCode Project があります。
フラクタル暗号化アルゴリズムは、有名なマンデルブロ フラクタルを使用して、暗号化キー (ユーザーによって提供される) をより長いキーに変換し、その後、プレーン テキスト (ユーザーによって提供される) と XOR 演算して、暗号化されたテキストを生成します。以下で説明および実装されているアルゴリズムは新しく、私が創造的な瞬間 (つまり、昼食後、14 時 30 分頃、目を半分閉じた状態) で発明し、翌朝にコード化されたものです。強力な暗号化アルゴリズムですが、その逆 (encrAption アルゴリズムなど) の可能性もあるため、保証はありません。
もちろんコメントで:
フラクタルを使用してキーを生成するが、キーがメッセージと XOR されているだけの場合、暗号化は強力とは言えず、wikipedia ( http://en.wikipedia.org/wiki/XOR_cipher ) を引用します。
私が今まで聞いた中で最も安全な暗号化/復号化方法は、私の祖父が第二次世界大戦直後に米国空軍で働いていたものでした. これは、( SIGSALY )として知られるワンタイムパッドのバリエーションです。
準備
まず、ガイガー カウンターを使用して周囲の背景放射を検出します。近くの放射線源からの無音または人為的な反応のいずれかの大きなオーディオ セクションがない場所を使用します。統計についてはよくわかりませんが、宇宙マイクロ波背景放射を記録したのと同じでした。結果のサウンドトラックは、2 枚のビニール アルバム (キー) に同時に録音され、ラベルが付けられます。1 つのコピーを送信機に送信し、もう 1 つを受信機に送信します。完全にランダムな、したがって一意の記録を含む大量のディスク ペアを作成するのに、多くの時間や労力はかかりません。
実装
安全なメッセージを送信する段階になると、2 つのステーションはどちらのラベル付き録音を使用するかについて合意します。次に、ランダムノイズは送信機によってキャリアのように使用され、受信機は、キーのコピーが送信キーと同期していて、録音の同じ場所で同じ再生速度のときにノイズをキャンセルして無音を実現できます。
概要
この通信事業者が確立されると、メッセージの暗号化に使用されるツイン ディスクを取得しない限り、誰もメッセージを解読できないことを保証できます。これにより、メッセージのセキュリティが数学的なものから物理的なものに変換されます。レコードを保護し、各ペアを 1 回しか使用しない限り、完全なセキュリティが得られます。
ファローアップ
記録はアナログで行われるため、このタイプのメッセージを解読するために量子コンピューターが必要とする量子ビット数に影響しますか?