有没有一种密码方式,如果破译者持有错误的密钥,那么会解译出错误但是意义通顺的明文?
- 20 个点赞 👍
您是否在寻找:一次性密码本.
一次性密码本[编辑]
维基百科,自由的百科全书
(重定向自一次性密码本)
跳到导航跳到搜索此条目介绍的是加密通讯协议中的一次性密码本(one-time pad)。关于身份验证系统中的一次性密码(One-time password),请见“一次性密码”。
一次性密码本节录
一次性密码本(英语:one-time pad,缩写为OTP)是古典密码学中的一种加密算法。是以随机的密钥(key)组成明文,且只使用一次。
目录
安全性[编辑]
在理论上,此种密码具有完善保密性,是牢不可破的。它的安全性已由克劳德·艾尔伍德·香农所证明。
虽然它在理论上的安全性无庸置疑,但在实际操作上却有着以下的问题:- 用以加密的文本,也就是一次性密码本,必须确实是随机产生的。
- 它至少必须和被加密的文件等长。
- 用以加密的文本只能用一次,且必须对非关系人小心保密,不再使用时,用以加密的文本应当要销毁,以防重复使用。
加密方法[编辑]
首先手上要有一本一次性密码本用以加密查看全文>>
芜湖精神病院院长 - 77 个点赞 👍
这种类型的对象通称可抵赖 (deniable) 加密,风格多种多样,其中一些是适应性安全多方安全计算的重要工具之一。风格的维度包括公钥/私钥、公开/非公开抵赖、发送者/接收者/二者之一/二者协调/完全抵赖、有准备/无准备、多重算法/单一算法、交互/非交互,这个回答里不可能完全介绍每一种,我就挑其中一个简单说说。
公钥、公开抵赖、非交互、发送者、单一算法可抵赖加密. 是指这样一组概率多项式时间算法:
- 密钥生成算法 \mathsf{Gen}(1^{\lambda}) 输出一对公私钥 (\mathsf{pk},\mathsf{sk})。
- 加密随机数长度算法 \mathsf{EncRandLen}(\mathsf{pk},1^{\ell}) 是确定性算法,输出 1^L。
- 加密算法 \mathsf{Enc}(\mathsf{pk},m;r) 输入 m\in{\{0,1\}^{\ell}},使用随机数 r\in{\{0,1\}}^L,其中 1^L=\mathsf{EncRandLen}(\mathsf{pk},1^{\ell}),算法输出密文 \mathsf{ct}。
- 解密算法 \mathsf{Dec}(\mathsf{sk},\mathsf{ct}) 输出一串消息。
- 解释算法 \mathsf{Explain}(\mathsf{pk},\mathsf{ct},m') 输出一串随机数 r'。
(指数误差)正确性是说对任意 \lambda\in\mathbb{N} 和 m\in{\{0,1\}^\ast} 都有
\rule[2.2em]{0pt}{0pt}\Pr\left[\begin{aligned} (\mathsf{pk},\mathsf{sk})&\overset{\smash{{\,}_\$}}{\gets}\mathsf{Gen}(1^{\lambda})\\ \mathsf{ct}&\overset{\smash{{\,}_\$}}{\gets}\mathsf{Enc}(\mathsf{pk},m)\\ \end{aligned}\::\:\mathsf{Dec}(\mathsf{sk},\mathsf{ct})\neq m\right]\leq 2^{-\lambda}.IND-CPA 安全性取通常定义。解释不可区分性是指 E_0\approx E_1,其中 E_b 是这样的:
- 运行 (\mathsf{pk},\mathsf{sk})\overset{\smash{{\,}_\$}}{\gets}\mathsf{Gen}(1^{\lambda}) 并把 \mathsf{pk} 发送给使坏者。
- 使坏者选择 m,运行
\begin{aligned}\rule[1.4em]{0pt}{0pt} 1^L&{}\gets\mathsf{EncRandLen}(\mathsf{pk},1^{|m|})\\ r_0&{}\overset{\smash{{\,}_\$}}{\gets}\{0,1\}^L\\ \mathsf{ct}&{}\gets\mathsf{Enc}(\mathsf{pk},m;r_0)\\ r_1&{}\overset{\smash{{\,}_\$}}{\gets}\mathsf{Explain}(\mathsf{pk},\mathsf{ct},m)\rule[-1em]{0pt}{0pt}\end{aligned}
然后把 r_b 发送给使坏者。 - 使坏者输出 b',这就是 E_b 的输出。
下面是使用方法:已经传输了密文之后,如果被要求公开加密时曾经使用的随机数,可以找另一条相同长度的消息,用 \mathsf{Explain} 算法编造随机数。当然,由于使坏者已经知道我们在使用这个算法,要求交出随机数是无意义行为——它自己也可以编造出随机数的。
我挑这个版本主要是它的定义简单且不平凡,研究这个对象的重要文章之一就是 How to Use Indistinguishability Obfuscation: Deniable Encryption, and More。
现在说说各个维度的含义:
- 公钥/私钥:这很好理解,就是对称加密还是非对称加密。
- 公开/非公开抵赖:仅对公钥加密适用,即上面的 \mathsf{Explain} 算法只用公钥,还是需要私钥。
- 发送者/接收者/二者之一/二者协调/完全抵赖:发送者就是指可以编造加密随机数;接收者是指可以编造密钥生成算法的随机数;二者之一是指可以选择要编造哪个,但是只能选一个;二者协调是指都可以编造,但是编造的时候要用同一条假消息 m';完全抵赖是指都可以编造,且编造加密随机数和编造密钥生成算法随机数的时候的假消息不需要有特殊关系。
- 有准备/无准备:有准备是说需要被编造随机数的密文需要特殊准备(例如通过加密算法的一个开关控制);无准备没有特殊要求。
- 多重算法/单一算法:多重算法是指允许有两套完全不同的密钥生成、加密算法,其中一套是日常使用的,另一套是专门用来编造的(这样不好,因为使坏者或许不相信用户使用的是用来编造的那一套);单一算法是指只有一套算法。
- 交互/非交互:这也很好理解,就是发消息和接收消息的是否需要多轮交互。
考虑接收者、无准备、单一算法、非交互可抵赖加密,可以证明此时算法必然是私钥、非公开抵赖,而且密钥长度和明文长度一样长,也就是说只有一次一密。
考虑接收者、有准备、单一算法、非交互可抵赖加密,此时算法依然需要私钥和明文一样长,但是可以用任何(定长消息、单密文)模拟安全的加密算法,这类算法很多,例如用 ALS IPFE 就可以(这里打个广告 Succinct and Adaptively Secure ABE for ABP from k-Lin)。
在多方安全计算里,参与者互相通信的时候通常会用加密算法,在适应性安全里,使坏者可以动态(在查看了一些加密过的消息之后)查看参与方的内部状态(包括它使用的所有的随机数),这样就会揭示之前发的密文里面包含了什么消息。如果从模拟算法的角度考虑,模拟算法需要先给出密文,然后使坏者会选择消息,然后模拟算法需要给出随机数,让这些密文看起来是使坏者所选择的消息加密而来的,这个需求正好就是可抵赖加密的功能(模拟算法需要编造随机数)。当然,在这里可以用交互式加密。
编辑于 2023-03-21 07:58・IP 属地美国查看全文>>
Gee Law - 7 个点赞 👍
#误导式加密#
一个圆柱,从头顶看是圆形,从侧面看是方形。
只有正确的密钥会让你从头顶看,其它所有的密钥都会让你从侧面看。
基本上就是这么回事。
编辑于 2023-03-20 03:57・IP 属地新加坡真诚赞赏,手留余香还没有人赞赏,快来当第一个赞赏的人吧!查看全文>>
q9adg - 3 个点赞 👍
这其实是个跟加解密算法关联不大的问题,实际上很多加解密算法包括基本的AES都会在密钥(或iv)不正确的情况下解密出数据而不报错,能发现解密失败有时是加解密算法特别设计的功能,例如有专门的校验字段。问题在于,敌人对你要发送的数据的内容是有预期的,解密失败产生的随机内容和真正有意义的内容很容易区分出来。本质上来说,这是因为你真正可能发送的数据的集合只是加密算法可以接受的数据集合中的一个很小的子集,因而是否解密成功是一个可以高概然判断出的事情。
所以你可以看出,解决方案其实不在于加解密算法,而是在你实际发送的内容上,我有几个方案可以参考:
- 在可能被敌人截获的信道上,本身就大量发送随机二进制数据,它和真正有效的数据在加密之后是无法区分的,但解密之后可以通过校验字段简单区分出来。敌人截获数据时无法判断出到底是有效的数据还是随机数据,因而通过穷举密钥的方式尝试解密也无法判断密钥是否正确,除非每一个密钥都尝试所有的数据。缺点是如果敌人的确尝试解密所有数据的话仍有可能判断出哪个密钥是正确的。
- 在可能被敌人截获的信道上直接发送明文数据——其中既有真的信息也有假的信息,互相矛盾,算法并不进行解密,而是通过特殊的校验算法判断哪一些是真的哪一些是假的,例如只有和特定密钥做HMAC之后最后4个二进制都是0的才是真消息,这可以通过微调措辞或者附加随机内容来达成。缺点在于即便是混在假消息当中真实数据也会包含一定信息量,仍然可能造成泄密。
- 结合一下两个方案,在可能被敌人截获的信道上发送包含随机二进制数据、真消息、假消息的信息,并采用复数个密钥,真消息有一组不同的密钥,假消息有更多备选的密钥,每个密钥无论对应真假消息加密的信息数量大致相同。接收方只尝试用真密钥解密,任意一个密钥解密之后校验字段匹配即成功。敌人即便尝试对每一个消息用不同密钥解密,并找出了所有可能的解密方案,也仍然无法区分真假。
需要指出的是这样的方案实用性不算很强,首先它只适合单向发送加密数据的场景,这种场景汇总只能采用某种形式的固定密钥(即使使用某种密钥滚动策略,滚动序列也是根据初始参数唯一确定的)。对于可以双向通信的场景,已经有实用的完美前向安全性的方案,它可以每次都协商一个新的密钥用于双方通信,敌人对于每次协商的密钥都需要重新暴力破解。其次,现在的加解密算法本身强度都很高,暴力穷举密钥尝试解密本身就不可行。因此通常直接使用常见的加密方案如TLS就足够了。
发布于 2023-03-24 12:58・IP 属地北京真诚赞赏,手留余香还没有人赞赏,快来当第一个赞赏的人吧!查看全文>>
灵剑 - 0 个点赞 👍
已知的错误密钥,比如故意泄露给对方错误密钥的话,可以,但其实这样就不需要设计加密方式了,只要给对方错误密钥能解开的信息就好了,正确密钥和密文走另一个途径不香吗?未知错误密钥的话,大概不可能,敌人随便试几组密钥,如果得到同样通顺的明文,那一定是假的,如果得到不同但通顺的明文,一定也是假的,如果只有一个得到通顺的明文,其它得到乱码,你不如去买彩票,设计个算法刚好被敌人随手抓到一个正确的假密钥。
发布于 2023-03-24 23:12・IP 属地北京查看全文>>
小书虫