分形加密

2024-04-23

我听说可以使用 Mandlebrot 集的图来加密数据,并且这种加密算法是量子安全的(与许多常用算法不同,不能用量子计算机破解)。我在 Google 上查找更多信息,但只找到了一些针对非技术受众的文章。有谁有任何这方面的资源,我可以用它来了解更多关于这个迷人主题的信息吗?


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

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

因此,分形加密不能意味着消息本身是directly用分形加密。相反,它必须意味着分形被用作“主密钥”,以能够同时生成“本地”或“顺序”密钥,然后使用这些密钥来加密和解密实际消息。

在进一步讨论之前,让我们回顾一下加密的基础知识:

加密算法原理

假设您有一系列消息 M(j)(j=1 到 N),您希望能够安全地将其传输到接收方。您需要一个可逆加密函数 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)

and

X(j) XOR K(j) --> M(j)

这解决了一个问题,但引入了另一个问题,即我们如何确保发送者和接收者拥有相同的一组密钥?传输一系列密钥并不是解决方案,因为这让我们回到了安全传输一系列消息的原始问题。

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

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

H(MK, j) --> K(j);  M(j) XOR K(j) --> X(j)

and

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 http://www.codeplex.com/FractalEncryptDemo

此类使用基于复平面中的二次递归 Z(i+1) = Z(i)^2 - C 的 Julia 集。生成的主密钥由 5 个数字、4 个 0 到 1 之间的双精度浮点值和 1 个 1 到 1,000,000,000 之间的整数组成。前两个 double 值定义了上式中 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 个消息字节进行异或以对其进行加密,或者在接收方将其与加密文本进行异或以将其解密。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

分形加密 的相关文章

  • 如何找到最长的回文子序列(不是它的长度)

    我想找出字符串中最长的回文子序列 我到处都找到了找出子序列长度的算法 并声明该算法也可以扩展以返回子序列 但我没有找到如何实现的 有人能解释一下我怎样才能得到序列吗 既然你提到了链接最长回文子序列 http www geeksforgeek
  • 4 x 3 锁图案

    我遇到了这个 它要求计算在 4x3 网格中可以制作特定长度的锁定图案的方式数 并遵循规则 可能有些点不能包含在路径中 有效的模式具有以下属性 图案可以使用第一次接触的点序列来表示 与绘制图案的顺序相同 从 1 1 到 2 2 的图案与图案不
  • Bellman-Ford 算法检测什么?负重还是负循环?

    如果给定一个图 现在我们要从源头计算最短路径 现在 如果一条边具有负权重 但在到达目的地时有边到后边返回到该边 我的意思是如果没有循环 那么我们就没有负循环 但是here http en wikipedia org wiki Bellman
  • 使用 CryptUnprotectData 解密 WEP wlan 配置文件密钥

    我正在尝试使用解密 WEP 配置文件的密钥加密解除数据保护 http msdn microsoft com en us library windows desktop aa380882 28v vs 85 29 aspx 我获取配置文件密钥
  • 两个非嵌套循环的大 O 表示法

    对于两个非嵌套的 for 循环 大 O 表示法是什么 Example for int i 0 i
  • 在无向图中查找强连通分量

    我想在无向图中找到强连接的组件 即如果我从节点开始A然后我会回到节点A并且每条边都被恰好访问一次 对于有向图可以使用Tarjan算法来寻找强连通分量 但是对于无向图怎么办 我认为您错过了强连通分量的含义 强连接组件 如果所有顶点对之间都存在
  • Java:如何实现3和?

    我正在研究 3 Sum 来自己实现它 并遇到了以下规则的实现 给定一个由 n 个整数组成的数组 S S 中是否存在满足 a b c 0 的元素 a b c 查找数组中所有总和为零的唯一三元组 注意 三元组 a b c 中的元素必须按非降序排
  • 在关键服务器上对字符串进行内存受限的外部排序,并合并和计算重复项(数十亿个文件名)

    我们的服务器生成如下文件 c521c143 2a23 42ef 89d1 557915e2323a sign xml在其日志文件夹中 第一部分是GUID 第二部分是名称模板 我想计算具有同名模板的文件的数量 例如 我们有 c521c143
  • C 中的菱形数组排序

    我有以下 C 语言作业 我基本上需要一种方法而不是解决方案 我们有一个 13 x 13 的数组 在数组中 我们有一个需要考虑的菱形形状 该菱形之外的所有内容都初始化为 1 不重要 下面的 5 x 5 数组示例 x x 1 x x x 2 2
  • Python 给定 k 个分区的整数分区

    我正在尝试寻找或开发Python 的整数分区代码 仅供参考 整数分区将给定整数 n 表示为小于 n 的整数之和 例如 整数5可以表示为4 1 3 2 3 1 1 2 2 1 2 1 1 1 1 1 1 1 1 我为此找到了许多解决方案 ht
  • 字符串排序真的是 O(n^2logn) 吗? [复制]

    这个问题在这里已经有答案了 我读了以下内容 排序需要 O NlogN 那么它怎么是 O N 2logN 我们在这里想念的是 两个字符串的比较不是 O 1 在最坏的情况下 需要 在 所以最终的复杂度是O N 2logN 它是否正确 我一直认为
  • 如何在给定目标索引数组的情况下对数组进行就地排序?

    你如何对给定的数组进行排序arr in place给定目标索引数组ind 例如 var arr A B C D E F var ind 4 0 5 2 1 3 rearrange arr ind console log arr gt B E
  • 使用主方法求解 T(n) = 2T(n/2) + n/log n 和 T(n) = 4T(n/2) + n/log n 之间的差异

    我最近偶然发现了一个资源 其中 2T n 2 n log ntypeMM 宣布复发无法解决 我接受它作为一个引理 直到今天 另一种资源被证明是矛盾的 在某种意义上 根据资源 下面的链接 其中的 Q7 和 Q18 是建议 分别在问题中的1和2
  • 通过分布式数据库聚合作业优化网络带宽

    我有一个分布式 联合数据库 结构如下 数据库分布在三个地理位置 节点 每个节点集群有多个数据库 关系数据库是 PostgreSQL MySQL Oracle 和 MS SQL Server 的混合体 非关系数据库是 MongoDB 或 Ca
  • 高维最近邻搜索的最佳数据结构

    我实际上正在处理高维数据 50 000 100 000 个特征 并且必须对其执行最近邻搜索 我知道随着维度的增长 KD 树的性能很差 而且我还了解到 一般来说 所有空间分区数据结构都倾向于对高维数据执行详尽的搜索 此外 还有两个重要事实需要
  • 固定大小集以包含给定集的最大数量

    我有大约 1000 组尺寸 1 4 1 3 3 5 6 4 5 6 7 5 25 42 67 100 是否有可能找到包含最大数量的给定集合的大小为 20 的集合 检查每一个100 80 20 集 效率低下 我不太确定这是 NP 完全的 考虑
  • 如何确定算法函数的复杂度?

    您如何知道算法函数对于特定操作是否需要线性 常数 对数时间 它取决于CPU周期吗 您可以通过三种方式 至少 做到这一点 在网上查找算法 看看它是如何描述其时间复杂度的 根据输入大小 自己检查算法 查看嵌套循环和递归条件等内容 以及每个循环运
  • 找到一系列间隔的最有效分组

    我有一个应用程序 其中有一系列不重叠的固定宽度间隔 每个间隔都有一个给定的键 每个间隔具有相同的宽度 并且可以存在连续的间隔 本质上 我想以最小化单独间隔的数量的方式对间隔和键进行分组 这可以通过合并具有相同键的连续间隔或查找匹配间隔并将它
  • 加密 mongodb 中的密码字段

    我有以下代码 它插入userName and password进入数据库 但密码以纯文本格式存储 我的意思是 当我查看数据库时 我可以看到插入的密码 我想存储password in encrypted format MongoClient
  • 解释一下从 N 个给定集合中的每一个中给出第 K 个最大数字的示例?

    今天我尝试解决一个Facebook 编程挑战赛 https facebook interviewstreet com recruit challenges 我遇到的挑战是 酒吧问题 可以找到here https github com alo

随机推荐

  • 实体类型 不是当前上下文模型的一部分

    这是模型优先的方法 我已经对此进行了广泛的研究 但还没有得出答案 我已尝试以下链接中的所有建议 这似乎是同样的问题 但没有解决方案实体类型 不是当前上下文模型的一部分 https stackoverflow com questions 49
  • 欧拉项目 #16 - C# 2.0

    我一直在与欧拉计划搏斗在 C 2 0 中 问题的关键在于 您必须计算并迭代 604 位长 或大约 的数字中的每个数字 然后将这些数字相加即可得出答案 这提出了一个问题 C 2 0没有可以处理这种计算精度的内置数据类型 我可以用一个第三方库
  • 在 TypeScript 中将数组作为参数传递

    我有两种方法 static m1 args any using args as array static m2 str string args any do something call to m1 m1 args 致电给m1 1 2 3
  • Azure Blob 存储与 Azure 驱动器

    我正在考虑迁移到 Windows Azure 而不是典型的托管 但我不确定如何最好地存储图像 经过搜索 我发现有 2 种可能的解决方案 Blob 存储或 Azure 驱动器 我研究了 Blob 存储 尽管我已经开始习惯这个想法 但它需要对我
  • 将证书文件加载到证书对象中

    我正在尝试将证书文件加载到证书对象中 但出现以下异常 java security cert CertificateParsingException invalid DER encoded certificate data at sun se
  • 我需要有关如何在 Windows Azure 上部署 ASP.NET 网站的演练或步骤

    我需要有关如何在 Windows Azure 上部署 ASP NET 网站的演练或步骤 以下是在 Windows Azure 上部署 ASP NET 网站的步骤 假设 gt 1 您已经创建了一个 ASP Net 网站 Step 1 在你的机
  • 如何检测android中某个渲染器区域内的触摸事件?

    在android中我举了一个旋转球体的例子在这里给出 https bitbucket org jimcornmell opengltexturedsphere 它创建了一个简单的应用程序 显示一个旋转球体 地球 现在 如果在手机显示屏上按下
  • 加密字段的部分搜索

    最近我被分配了一个问题 加密数据库字段 例如SSN 但仍然必须保持 部分搜索 工作 例如 SSN 123 45 6789 在数据库中被加密为 abcdxyz 当用户在搜索框中输入 2345 时 它必须出现在结果中 我们的数据库中有数百万条记
  • 截断表后序列不会重置

    我在截断表后使用 SELECT lastval 来获取错误的序列号 当我截断表时 我使用 SELECT lastval 我得到了错误的 ID Use the TRUNCATESQL 命令 对于单个表 语法如下 TRUNCATE TABLE
  • 如何处理特定类型集合的操作?

    在我的申请中的几个不同地方 我需要采取Seq SalesRow 并返回一个Map String SalesRow 其中字符串是国家 地区的名称 我需要在几个地方使用它 例如 我获取所有 SalesRows 的列表 并获取按国家 地区划分的全
  • Cygwin - 如何安装 ansible?

    如何使用 Cygwin 获取 安装 ansible 我尝试了以下步骤 但在第 5 条期间 运行时 python setup py 安装 步骤取自 取自https servercheck in blog running ansible wit
  • 为什么自动布局中的CGAffineTransform Rotate会移动动画视图?

    我想使用以下代码旋转 imageView UIView animateWithDuration 25 animations self imageView transform CGAffineTransformRotate self plus
  • 筛选提取-opencv

    我正在尝试开始使用 C OpenCv 进行筛选特征提取 我需要使用 SIFT 提取特征 将它们在原始图像 例如一本书 和场景之间进行匹配 然后计算相机姿势 到目前为止我已经找到了这个算法 http opencv itseez com doc
  • 如何在 Cucumber-JVM 中并行运行场景? [复制]

    这个问题在这里已经有答案了 我有一组为 Cucumber JVM 编写的验收测试 为了减少反馈时间 我想并行运行 功能的 场景 我该如何以最简单 最方便的方式做到这一点 我希望能够在 Java 代码中表达这一点 作为常规的 JUnit 测试
  • 带有不使用索引的查询变量的 SELECT

    我正在尝试 出于兴趣 通过使用局部变量的递归查询来检索简单邻接列表中的节点树 到目前为止我的解决方案很有趣 但我想知道 这是我唯一的问题 为什么 MySQL 拒绝使用任何INDEX来优化这个查询 MySQL 不应该能够通过使用INDEX 我
  • 由两个向量 (n,1) 构建的 R 距离矩阵

    我有两个向量 x n 1 and y n 1 真实值 我想创建一个矩阵M n n 这些向量包含每两对之间的距离 您可以使用outer功能 x lt sample 5 y lt sample 5 x 1 1 5 3 4 2 y 1 2 3 5
  • 这是在 Django 中进行依赖注入的正确方法吗?

    我正在尝试将依赖项注入到我的 Django 视图 控制器 中 这是一些背景知识 通常情况下 urls py文件是处理路由的 通常是这样的 urlpatterns path views get all posts name get all p
  • ngx-translate 在延迟加载模块中不显示任何文本

    我们在应用程序中使用 Angular 6 我们最近开始为我们的应用程序准备延迟加载 应用程序有多个延迟加载的路由 我们希望对所有路由使用单一语言文件 不需要将其分成块 但在引导程序上加载所有翻译 我尝试的第一件事就是在 AppModule
  • 使用 C# 进行 ECDHE 密钥交换

    我正在尝试使用 net 通过 TLS 1 2 进行 ECDHE 密钥交换 服务器正在响应 server key exchange 消息 该消息以 04 开头 所以我猜它是未加密的 根据我的理解 消息的前 32 位被视为值 X 接下来的 32
  • 分形加密

    我听说可以使用 Mandlebrot 集的图来加密数据 并且这种加密算法是量子安全的 与许多常用算法不同 不能用量子计算机破解 我在 Google 上查找更多信息 但只找到了一些针对非技术受众的文章 有谁有任何这方面的资源 我可以用它来了解