带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

相关文章

Redis客户端连接机制的实现方案

《Redis客户端连接机制的实现方案》本文主要介绍了Redis客户端连接机制的实现方案,包括事件驱动模型、非阻塞I/O处理、连接池应用及配置优化,具有一定的参考价值,感兴趣的可以了解一下... 目录1. Redis连接模型概述2. 连接建立过程详解2.1 连php接初始化流程2.2 关键配置参数3. 最大连

解密SQL查询语句执行的过程

《解密SQL查询语句执行的过程》文章讲解了SQL语句的执行流程,涵盖解析、优化、执行三个核心阶段,并介绍执行计划查看方法EXPLAIN,同时提出性能优化技巧如合理使用索引、避免SELECT*、JOIN... 目录1. SQL语句的基本结构2. SQL语句的执行过程3. SQL语句的执行计划4. 常见的性能优

Java获取当前时间String类型和Date类型方式

《Java获取当前时间String类型和Date类型方式》:本文主要介绍Java获取当前时间String类型和Date类型方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录Java获取当前时间String和Date类型String类型和Date类型输出结果总结Java获取

Python实现批量提取BLF文件时间戳

《Python实现批量提取BLF文件时间戳》BLF(BinaryLoggingFormat)作为Vector公司推出的CAN总线数据记录格式,被广泛用于存储车辆通信数据,本文将使用Python轻松提取... 目录一、为什么需要批量处理 BLF 文件二、核心代码解析:从文件遍历到数据导出1. 环境准备与依赖库

一文解密Python进行监控进程的黑科技

《一文解密Python进行监控进程的黑科技》在计算机系统管理和应用性能优化中,监控进程的CPU、内存和IO使用率是非常重要的任务,下面我们就来讲讲如何Python写一个简单使用的监控进程的工具吧... 目录准备工作监控CPU使用率监控内存使用率监控IO使用率小工具代码整合在计算机系统管理和应用性能优化中,监

使用zip4j实现Java中的ZIP文件加密压缩的操作方法

《使用zip4j实现Java中的ZIP文件加密压缩的操作方法》本文介绍如何通过Maven集成zip4j1.3.2库创建带密码保护的ZIP文件,涵盖依赖配置、代码示例及加密原理,确保数据安全性,感兴趣的... 目录1. zip4j库介绍和版本1.1 zip4j库概述1.2 zip4j的版本演变1.3 zip4

MySQL 迁移至 Doris 最佳实践方案(最新整理)

《MySQL迁移至Doris最佳实践方案(最新整理)》本文将深入剖析三种经过实践验证的MySQL迁移至Doris的最佳方案,涵盖全量迁移、增量同步、混合迁移以及基于CDC(ChangeData... 目录一、China编程JDBC Catalog 联邦查询方案(适合跨库实时查询)1. 方案概述2. 环境要求3.

SpringBoot3.X 整合 MinIO 存储原生方案

《SpringBoot3.X整合MinIO存储原生方案》本文详细介绍了SpringBoot3.X整合MinIO的原生方案,从环境搭建到核心功能实现,涵盖了文件上传、下载、删除等常用操作,并补充了... 目录SpringBoot3.X整合MinIO存储原生方案:从环境搭建到实战开发一、前言:为什么选择MinI

Knife4j+Axios+Redis前后端分离架构下的 API 管理与会话方案(最新推荐)

《Knife4j+Axios+Redis前后端分离架构下的API管理与会话方案(最新推荐)》本文主要介绍了Swagger与Knife4j的配置要点、前后端对接方法以及分布式Session实现原理,... 目录一、Swagger 与 Knife4j 的深度理解及配置要点Knife4j 配置关键要点1.Spri

go中的时间处理过程

《go中的时间处理过程》:本文主要介绍go中的时间处理过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1 获取当前时间2 获取当前时间戳3 获取当前时间的字符串格式4 相互转化4.1 时间戳转时间字符串 (int64 > string)4.2 时间字符串转时间