フラクタル暗号化 質問する

フラクタル暗号化 質問する

マンドルブロー集合の描画を使用してデータを暗号化できること、またこの暗号化アルゴリズムは量子耐性がある (多くの一般的なアルゴリズムとは異なり、量子コンピュータでは解読できない) と聞いたことがあります。詳細情報を得るために Google で検索しましたが、非技術的な読者向けの記事しか見つかりませんでした。この興味深いテーマについてさらに学ぶために使用できる情報源を持っている人はいませんか?

ベストアンサー1

まず、インターネット上の記事のほとんどが難解に見えるのは、それらすべてが少数の特許出願から引用されているように見えるからです。新しい数式やアルゴリズムの特許出願は、常に何かを隠しているように見えますが、実際そうなのです。そのようなものの無許可使用を取り締まるのは極めて困難で、出願者は特許保護と企業秘密保護の境界線をうまく乗り越えようとします。ここでのポイントは、必ずしもすべてがでたらめであるわけではないということです。

第二に、私が知っているすべてのフラクタル マッピングは、マッピングが厳密に 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 つの問題を解決しますが、別の問題も発生します。つまり、送信者と受信者の両方が同じキー セットを持っていることをどのように保証するかということです。一連のキーを送信することは解決策にはなりません。それは、一連のメッセージを安全に送信するという元の問題に戻るからです。

代わりに、送信者と受信者の両方で独立して一連の同一キーを生成したいと考えています。ただし、それ自体が暗号的に安全な一連のキーを生成できる必要があります。つまり、外部の観察者が前のキーをすべて知っていたとしても、一連の次のキーを正確に予測することはできません。また、毎回完全に異なる一連のキーが必要になるため (推測できないようにするため)、実際にはキー シリーズ自体がキーベースである必要があります。

この問題を解決するには、マスター キー 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' は必要ありません。そのため、マスター キーを持つフラクタル ベースの関数を自由に使用して、一連のローカル キーを生成できます。

実装例と説明

以下は、このアプローチ、つまりフラクタル暗号化の単純な実装を示す 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 に基づくジュリア セットを使用します。生成されるマスター キーは、5 つの数値、0 から 1 までの 4 つの倍精度浮動小数点値、および 1 から 1,000,000,000 までの 1 つの整数で構成されます。最初の 2 つの倍精度値は、上記の式の C の実数部と虚数部を定義します。次の 2 つの倍精度値は、開始 Z を生成するために使用されるシード値の実数部と虚数部を定義します。

これらの値は両方とも (係数演算によって) (0.1, 0.1) からおよそ (0.55, 0.55) までの小さな正方形領域にマッピングされます。これは、フラクタル計算がオーバーフローまたはアンダーフローしないようにするために行われます (ただし、これがまだ不可能ではないとは断言できません)。最後に、整数値はシーケンス値 (上記の式の「j」) のオフセットとして機能します。

メッセージは、一度に 4 つの ASCII 文字でエンコードされます。最初に、シーケンス番号 (j) がシーケンス オフセットに追加され、これが 4 バイトのオフセットとともにメッセージに使用され、複素数として複素シード値で乗算されて、アクティブ レクタングルに再マップされて開始 Z 値を取得します。次に、ジュリア セットの再帰 (Z = Z^2 + C) が 16 回適用され、最終結果がアクティブ レクタングルに再マップされます。

この最終的な複素数値は 2^30 倍され、実数部と虚数部の両方が整数に変換され、それぞれの下位 16 ビットが 32 ビット (4 バイト) のローカル キーを提供するために使用されます。次に、送信側で対応する 4 つのメッセージ バイトに対して XOR 演算されて暗号化され、受信側で暗号化されたテキストに対して XOR 演算されて復号化されます。

おすすめ記事