首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >分形加密

分形加密
EN

Stack Overflow用户
提问于 2009-08-01 06:51:34
回答 7查看 12.1K关注 0票数 18

我听说人们可以使用Mandlebrot集的图形来加密数据,并且这种加密算法是量子安全的(与许多常用算法不同,量子计算机是无法破解的)。我在谷歌上四处寻找更多信息,但我只看到了一些面向更多非技术受众的文章。有谁在这方面有什么来源,我可以用来了解更多关于这个有趣的主题的信息?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2009-08-09 02:09:09

下面是一篇概述这一过程的一般文章:

http://www.techbriefs.com/content/view/2579/32/

这是更深入的,提供了算法和示例:

http://medwelljournals.com/fulltext/ajit/2007/567-575.pdf

(备用网址):http://docsdrive.com/pdfs/medwelljournals/ajit/2007/567-575.pdf

在sci.crypt组上有一些关于它的讨论:

http://groups.google.com/group/sci.crypt/browse_thread/thread/f7ce14c1f6c0df3f/559895f2f267644?hl=en&ie=UTF-8&q=mandelbrot+fractal+encryption+algorithm

这里有一家日本的公司提供代码和示例(看起来包的价格是50美元):

http://www.summersoftlabs.com/intro.htm

这是闲逛几分钟的结果,所以你的里程数可能会有所不同。不过,这个话题听起来很有趣。即使它不是立即实际的,但有研究人员考虑不同的方法来解决这个问题是很好的。

票数 14
EN

Stack Overflow用户

发布于 2009-08-10 06:22:39

首先,互联网上的大多数文章看起来如此迟钝的原因是它们似乎都是从少数几个专利申请中提取出来的。新公式和算法的专利申请似乎总是隐藏着一些东西,因为它们确实是隐藏的。众所周知,监管未经许可使用这类东西是很困难的,申请者试图跨越专利保护和商业秘密保护之间的界限。这里的重点是,这并不一定意味着它都是胡说八道。

其次,我所知道的所有分形映射在某种程度上都是“有损的”,因为映射不是严格意义上的1对1。虽然这是一个很好的理由来相信没有有效的方法来破解代码,但这也意味着任何由有损分形直接“加密”的东西也无法解密,即使使用密钥也是如此。因此,任何类型的直接分形散列都是不可逆的。

因此,Fratcal加密并不意味着消息本身就是直接用分形加密的。相反,它必须意味着分形被用作“主密钥”,以支持同时生成“本地”或“连续”密钥,然后使用这些密钥对实际消息进行加密和解密。

在我们继续之前,让我们回顾一下加密的基础知识:

加密算法原理

假设您有一系列针对j=1到N的消息M(j),您希望能够将这些消息安全地传输给接收方。你需要一个可逆的加密函数E,如下所示:

代码语言:javascript
复制
E(M(j), k) --> X(j)

其中(k)是加密密钥,而X(j)是相应的加密消息。然后,该消息被发送到我们的接收者,该接收者具有互补函数E‘以解密加密的消息:

代码语言:javascript
复制
E'(X(j), k) --> M(j)

但是,AFAIK您不能使用Fractals同时创建E()和E'()函数。另一方面,有一些函数,比如XOR,它们是它们自己的补充:

代码语言:javascript
复制
( M(j) XOR k ) --> X(j)  *and also* ( X(j) XOR k ) --> M(j)

但XOR也是一种弱加密函数,尽管它对于单个消息是完全安全的,但如果我们使用相同的密钥(k)多次使用它,则很容易对(k)进行反向工程,从而使XOR对于单密钥加密系统不安全。这可以通过每次使用不同的密钥来解决:

代码语言:javascript
复制
M(j) XOR K(j) --> X(j)

代码语言:javascript
复制
X(j) XOR K(j) --> M(j)

这解决了一个问题,但也引入了另一个问题,那就是,我们如何确保发送者和接收者都具有相同的密钥集?传输一系列密钥并不是解决方案,因为这会将我们带回到最初的安全传输一系列消息的问题。

相反,我们希望在发送方和接收方上独立生成一系列相同的密钥。但我们需要能够生成一系列的密钥,这些密钥本身是加密安全的。也就是说,即使外部观察者知道前面的所有关键字,他们仍然无法准确地预测序列中的下一个关键字。因为我们每次都需要一个完全不同的键系列(使它们不可猜测),所以我们实际上需要键系列本身是基于键的。

对此的解决方案是使用主密钥MK和不同的加密函数H来为每个消息生成特定密钥:

代码语言:javascript
复制
H(MK, j) --> K(j);  M(j) XOR K(j) --> X(j)

代码语言:javascript
复制
H(MK, j) --> K(j);  X(j) XOR K(j) --> M(j)

这就是我们的分形的用武之地,因为我们可以在上面看到,H函数不需要互补函数H‘。因此,我们可以自由地使用基于分形的函数和主密钥来生成我们的一系列本地密钥。

示例实现和解释

下面是一个演示此方法的VB.NET类,它是Fractal加密的一个简单实现:

代码语言:javascript
复制
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

可以在http://www.codeplex.com/FractalEncryptDemo上找到完整的Visual Studio Windows项目和Windows exe

该类使用基于复平面上的二次递归Z(i+1) = Z(i)^2 -C的Julia集。生成的主密钥包含5个数字,4个0到1的双精度浮点值,1个1到100,000,000的整数。前两个双精度值定义了上面等式中C的实部和虚部。第二个双精度数定义用于生成起始Z的种子值的实部和虚部。

这两个值都被映射(通过模运算)到一个从(0.1,0.1)到大约(0.55,0.55)的小正方形区域。这样做是为了确保我们的分形计算不会溢出或下溢(尽管我不确定这是否仍然可能)。最后,整数值用作我们的序列值(上面公式中的"j“)的偏移量。

消息一次编码四个ascii字符。首先,将序列号(j)添加到序列偏移量中,该偏移量与4字节偏移量一起用作消息中的复数,该复数乘以复数种子值,然后重新映射回活动矩形,以获得起始Z值。然后,Julia集递归(Z = Z^2 + C)被应用16次,最终结果再次被重新映射回活动矩形。

最后的复数值乘以2^30,实数部分和虚数部分都转换为整数,然后每个部分的底部16位用于提供本地密钥的32位(4字节)。然后在发送方对相应的4个消息字节进行XOR运算以对其进行加密,或者在接收方对加密文本进行XOR运算以对其进行解密。

票数 22
EN

Stack Overflow用户

发布于 2009-08-06 01:18:50

我听说过这种方法。但它更像是一个玩具,而不是一个现实世界的算法:

您将mandelbrot的坐标窗口设置为"pad",对您的输入或其他内容进行异或运算,因此该窗口的坐标(以及样本的间距)将成为您的“密码”。如果你在集合中选择一个非常深的窗口,你将需要非常多的迭代来评估,理论上很难强行实现这一点。

注意大段的实数..也许是一个游程编码的mandlebrot。

我猜有人认为这可能是“量子证明”,因为它是迭代的,你无法计算在mandlebrot集合上的一个位置在没有实际迭代的情况下需要多少次迭代才能收敛。我不知道这是不是真的。

然而,我不认为这样做有任何好处(除了称之为“分形”),而且有大量的缺点和机会,以创造漏洞。您最好使用经过充分研究的公钥/私钥加密算法。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1216002

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档