带IV的分组加密下密文分散存储且存在混淆密文片段的多项式时间解密方案

本文主要是介绍带IV的分组加密下密文分散存储且存在混淆密文片段的多项式时间解密方案,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在使用带IV的分组加密模式下,考虑这样一个场景:分组加密后,每组密文都被分散保存,且在恢复的时候,每组密文会和n个混淆的密文一起提供,此时,若想完整的恢复明文,需要一个多项式时间的方案来剔除所有混淆密文。本文提出了一种基于可密文前缀的方案,能够在多项式的时间内完成解密。
PS:文章的名字也太难取了,赶时间随便取了个。


文章目录

  • 1.背景
  • 2.Idea
  • 3.真实场景的问题
  • 4.应用场景


1.背景

使用非 E C B ECB ECB模式的分组加密(假设为 C B C CBC CBC),假设为加密算法为 A E S AES AES,初始向量为 I V IV IV,密钥为 k k k,明文为 M \mathcal M M,共分为了 n n n个组进行加密,加密后的密文为 C \mathcal C C

我们把密文分为 n n n个组,每组密文为 c 1 , c 2 . . . , c n c_{1},c_{2}...,c_{n} c1,c2...,cn,这 n n n组密文按顺序分散存储,且每组密文存在 t t t个混淆密文 c i 1 , c i 2 . . . , c i t c_{i_1},c_{i_2}...,c_{i_{t}} ci1,ci2...,cit

现在,按顺序的拿出所有密文分组(包含混淆密文分组),要恢复完整的明文 M \mathcal M M

2.Idea

所有分组的存储和给出都是按顺序进行的,所以难点在如何把 t t t个混淆密文去除。

想法:
1.对于第一个分组,可以很快速的确认出真实的密文片段 c 1 c_{1} c1,只需要将 c 1 1 , c 1 2 . . . , c 1 t c_{1_1},c_{1_2}...,c_{1_{t}} c11,c12...,c1t 依次放入解密中尝试解密即可 D e c ( c 1 i , k ) , i ∈ [ 1 , t + 1 ] Dec(c_{1_i}, k), i\in[1,t+1] Dec(c1i,k),i[1,t+1],由于 I V IV IV是确定的,所以只有真实的 c 1 c_{1} c1能够成功解密。

2.在确定了 c 1 c_{1} c1后,继续尝试 D e c ( c 1 + c j i , k ) , i ∈ [ 1 , t + 1 ] , j ∈ [ 2 , n ] Dec(c_{1} + c_{j_i}, k), i\in[1,t+1],j\in[2,n] Dec(c1+cji,k),i[1,t+1],j[2,n],从而可以确认 c j c_{j} cj

这样,通过一步步确认真实密文前缀的方式,能够区分开所有混淆密文,而且是在多项式的时间内。当然,前提条件是解密机能够准确判断是否解密成功。

3.真实场景的问题

在用JavaScript实现上述方案的时候,存在一个问题:如何判断解密机是否成功解密。

常见的思路是:加密之前会先对字符进行编码,密文解密后会进行解码,如果解码成功就意味着解密成功,解码出现异常就是解密失败。

这种思路在上文背景下,会有部分场景失效,考虑如下场景:一段中文字符经由UTF-8编码后,每个中文字符通常会占2-3个字节,假设分组的长度是32字节,那么一个密文分组解密后,很有可能会因为尾部存在一个不完整编码的中文字符而解码失败,导致解密机判断为解密失败。

解决上述问题的一个办法是,找一个能把需要使用到的各种字符都编码成不会被分组长度隔断的编码,例如,如果只存在中文,那么使用GB2312就可以完美解决这个问题,因为每个汉字占两个字节,不可能出现某个分组的尾部包含不完整编码的汉字。

但是这样的办法拓展性不强,如果需要用到各种各样字符的话,找一个合适的编码比较麻烦。于是有另一个思路:尝试去除(置0字节)解密后密文尾部的0-2个字节,即可完美的解决这个问题。例如,如果使用UTF-8编码汉字,某个分组尾部容易存在1-2不完整编码的字节,那么我们尝试去除尾部的0-2个字节,就可以保证所有情况都完整的考虑了。

使用其它的编码也类似,主要考虑某个分组尾部可能残留多少个不完整编码的字节。下面是一个JS实现的核心代码示例。

在这里插入图片描述

4.应用场景

如果我们需要把分组加密后的东西放入区块链中,每个交易或者每个块中放入一个分组,同时存在可能混淆的一些其它条件,那么这就是一个很明显的应用。目前该方案已经应用于一些项目中。


ATFWUS 2023-10-31

这篇关于带IV的分组加密下密文分散存储且存在混淆密文片段的多项式时间解密方案的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/318541

相关文章

如何利用Java获取当天的开始和结束时间

《如何利用Java获取当天的开始和结束时间》:本文主要介绍如何使用Java8的LocalDate和LocalDateTime类获取指定日期的开始和结束时间,展示了如何通过这些类进行日期和时间的处... 目录前言1. Java日期时间API概述2. 获取当天的开始和结束时间代码解析运行结果3. 总结前言在J

修改若依框架Token的过期时间问题

《修改若依框架Token的过期时间问题》本文介绍了如何修改若依框架中Token的过期时间,通过修改`application.yml`文件中的配置来实现,默认单位为分钟,希望此经验对大家有所帮助,也欢迎... 目录修改若依框架Token的过期时间修改Token的过期时间关闭Token的过期时js间总结修改若依

Go Mongox轻松实现MongoDB的时间字段自动填充

《GoMongox轻松实现MongoDB的时间字段自动填充》这篇文章主要为大家详细介绍了Go语言如何使用mongox库,在插入和更新数据时自动填充时间字段,从而提升开发效率并减少重复代码,需要的可以... 目录前言时间字段填充规则Mongox 的安装使用 Mongox 进行插入操作使用 Mongox 进行更

Redis存储的列表分页和检索的实现方法

《Redis存储的列表分页和检索的实现方法》在Redis中,列表(List)是一种有序的数据结构,通常用于存储一系列元素,由于列表是有序的,可以通过索引来访问元素,因此可以很方便地实现分页和检索功能,... 目录一、Redis 列表的基本操作二、分页实现三、检索实现3.1 方法 1:客户端过滤3.2 方法

使用Python在Excel中创建和取消数据分组

《使用Python在Excel中创建和取消数据分组》Excel中的分组是一种通过添加层级结构将相邻行或列组织在一起的功能,当分组完成后,用户可以通过折叠或展开数据组来简化数据视图,这篇博客将介绍如何使... 目录引言使用工具python在Excel中创建行和列分组Python在Excel中创建嵌套分组Pyt

Redis 多规则限流和防重复提交方案实现小结

《Redis多规则限流和防重复提交方案实现小结》本文主要介绍了Redis多规则限流和防重复提交方案实现小结,包括使用String结构和Zset结构来记录用户IP的访问次数,具有一定的参考价值,感兴趣... 目录一:使用 String 结构记录固定时间段内某用户 IP 访问某接口的次数二:使用 Zset 进行

解读Redis秒杀优化方案(阻塞队列+基于Stream流的消息队列)

《解读Redis秒杀优化方案(阻塞队列+基于Stream流的消息队列)》该文章介绍了使用Redis的阻塞队列和Stream流的消息队列来优化秒杀系统的方案,通过将秒杀流程拆分为两条流水线,使用Redi... 目录Redis秒杀优化方案(阻塞队列+Stream流的消息队列)什么是消息队列?消费者组的工作方式每

对postgresql日期和时间的比较

《对postgresql日期和时间的比较》文章介绍了在数据库中处理日期和时间类型时的一些注意事项,包括如何将字符串转换为日期或时间类型,以及在比较时自动转换的情况,作者建议在使用数据库时,根据具体情况... 目录PostgreSQL日期和时间比较DB里保存到时分秒,需要和年月日比较db里存储date或者ti

C++中使用vector存储并遍历数据的基本步骤

《C++中使用vector存储并遍历数据的基本步骤》C++标准模板库(STL)提供了多种容器类型,包括顺序容器、关联容器、无序关联容器和容器适配器,每种容器都有其特定的用途和特性,:本文主要介绍C... 目录(1)容器及简要描述‌php顺序容器‌‌关联容器‌‌无序关联容器‌(基于哈希表):‌容器适配器‌:(

MySQL分表自动化创建的实现方案

《MySQL分表自动化创建的实现方案》在数据库应用场景中,随着数据量的不断增长,单表存储数据可能会面临性能瓶颈,例如查询、插入、更新等操作的效率会逐渐降低,分表是一种有效的优化策略,它将数据分散存储在... 目录一、项目目的二、实现过程(一)mysql 事件调度器结合存储过程方式1. 开启事件调度器2. 创