一次性密码本(绝对无法破译)

简介: 一次性密码本加密解密绝对无法破译缺点


一次性密码本


 一次性密码本即Vernam Cipher,是由Gilbert Vernam在1917年,开发的一种加密算法。是一种通过在文本的二进制级别上进行工作来对纯文本进行加密的密码技术。之所以叫做一次性密码本,是因为加密所用的密钥是一次性的,即密钥只会使用一次,不会出现因为密钥泄露导致之前的加密内容被解密。即使密钥不小心被泄露,也只会影响一次通信过程。


加密


    众所周知,任何信息在计算机内部都是由0,1两个数字保存,在进行传输时需要将传输的信息转化为对应二进制码传输,例如,传输文本消息,就需要利用特定的编码方式编码,比如常用的ASCII,Unicode等。


    一次性密码本的加密方式非常简单,就是将明文(待传信息的编码)和一串随机生成的二进制码进行XOR(异或)运算。


 1、将明文编码,即转换为二进制。

 2、随机生成和明文二进制位数相同的密钥。

 3、将明文和密钥的二进制进行XOR操作,生成密文。




解密


      解密过程依靠的是XOR操作的自反性,先简单介绍一下异或操作,如果异或的两个bit相同结果为0,异或的两个bit不同结果为1。例如:


 0 XOR 0 = 0

 0 XOR 1 = 1

 1 XOR 0 = 1

 1 XOR 1 = 0


      异或还有一个非常重要的性质:自反性,a XOR b = c,c XOR b = a即对同一数进行两次异或结果将回到最初的状态。


      由此,通过明文和密钥异或得到的密文,再通过将密文和密钥再次异或操作得到明文。以此实现一次性密码本的解密过程。





绝对无法破译


     虽然一次性密码本非常简单,但是一次性密码本是绝对无法破解的,这个破解并不是指现有的计算能力不够,而是指即使拥有无穷大的计算能力也无法破解。


     假设我们拿到了密文并进行暴力破解,也就是将所有顺序的密钥尝试一遍,假设密文长度是32bit,那么我们将得到232数量的明文,那么我们怎么判断哪一个明文是正确的呢?显然我们无法判断哪一个是正确的明文,因为在所有的组合排列中可能生成多个有意义的文字。所以这种解密是无意义的,就像是我知道了原文的长度,然后自己构造这个长度的原文。因此一次性密码本是无法破译的。


缺点


既然一次性密码本无法破解,那为什么现实中一次性密码本没有被使用呢?


1、密钥配送问题


     密钥和原文以及密文都是等长的,目标端如果想解密就必须拿到密钥,如果能有一种方法将密钥安全地发送出去,那么岂不是也可以用同样的方法来安全发送明文吗?


2、密钥保存问题


     如果有办法安全保存与明文一样长的密钥,那不是也有办法安全保存明文本身吗?也就是说,从一开始我们根本就不需要密码。


3、密钥的重用


     在一次性密码本中绝对不能重用过去用过的随机比特序列,一次性密码本中的“一次性”也正是由此而来。这是因为作为密钥的比特序列一旦泄密,过去所有的机密通信内容将全部被解密。每个密钥只用一次,这即是缺点也是优点。意味着我们每次都要不停的更换密钥,增加了复杂性。


4、密钥的同步


 当明文很长时,一次性密码本也会跟着变长。如果明文是一个大小为100MB的文件,则密钥的大小也一定是100MB。而且在通信过程中,发送者和接收者的密钥的比特序列不允许任何错位,否则错位的比特后的所有信息将无法解密。


5、密钥的生成


     在一次性密码本中,需要生成大量的随机数。这里的随机数并不是通过计算机程序生成的伪随机数,而必须是无重复性的真正随机数。


      最后,虽然一次性密码本无法在现实中使用,但是它为很多其他的加密算法以启发,由此产生了很多个变种。

————————————————

版权声明:本文为CSDN博主「Acx7」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/Acx77/article/details/116810247

相关文章
|
前端开发 JavaScript Java
网易音乐网站系统|前后端分离springboot+vue实现在线音乐网站
网易音乐网站系统|前后端分离springboot+vue实现在线音乐网站
1577 0
|
10月前
|
存储 设计模式 算法
命令模式(Command Pattern)
命令模式是一种行为型设计模式,将请求封装为对象,实现参数化请求、支持撤销操作和记录日志。适用于需要解耦发送者和接收者的场景,如智能家居系统中的遥控器控制电灯开关并支持撤销功能。优点包括解耦、支持撤销与恢复操作,但过度使用会增加系统复杂度。
163 7
|
网络协议 Java Go
技术笔记:KCP协议学习
技术笔记:KCP协议学习
610 0
|
Python
Python三种标准输出重定向方法
Python 提供了标准库中的 sys.stdout 对象来代表标准输出。如果我们想将输出重定向到其他位置,例如内存、文件或自定义类,我们可以通过一些技巧来实现。
403 2
|
监控 Java
Java一分钟之-NIO:非阻塞IO操作
【5月更文挑战第14天】Java的NIO(New IO)解决了传统BIO在高并发下的低效问题,通过非阻塞方式提高性能。NIO涉及复杂的选择器和缓冲区管理,易出现线程、内存和中断处理的误区。要避免这些问题,可以使用如Netty的NIO库,谨慎设计并发策略,并建立标准异常处理。示例展示了简单NIO服务器,接收连接并发送欢迎消息。理解NIO工作原理和最佳实践,有助于构建高效网络应用。
281 2
|
Web App开发 前端开发 JavaScript
Spring Boot整合 mybatisplus(后端) Vue+echarts+Element UI+axios(前端)---前后端项目实例demo
Spring Boot整合 mybatisplus(后端) Vue+echarts+Element UI+axios(前端)---前后端项目实例demo
617 1
|
移动开发 Ubuntu 前端开发
用xshell5 ssh连接eve-ng时报错
用xshell5 ssh连接eve-ng时报错
156 2
|
SQL 安全 网络安全
网络安全与信息安全:从漏洞防护到加密技术的深度解析
本篇文章将深入探讨网络安全与信息安全的核心领域,重点关注网络安全漏洞的识别与防护、先进的加密技术以及提升安全意识的策略。通过详细分析各个方面的知识和实际应用,我们旨在帮助读者更好地理解并应对日益复杂的网络威胁。
1210 0
|
Web App开发 Ubuntu Linux
手把手教你Windows+Linux双系统的安装与卸载(一)
后台突然有很多小伙伴留言想看 Linux+Windows 双系统的安装,本想自己写一个,但看了一眼自己那台服役快6年的老古董,想想还是不折腾它了。 于是上网搜索找到了这篇教程,已经征得原作者同意转载至本公众号,并且征得他的同意标注为原创。如果觉得本文对你有帮助,欢迎赞赏,所得款项全部归还原作者。
1383 0
手把手教你Windows+Linux双系统的安装与卸载(一)
|
Web App开发 数据采集 前端开发
Selenium超级详细的教程
Selenium是一个用于自动化测试的工具,它可以模拟用户在浏览器中的各种操作。除了用于测试,Selenium还可以用于爬虫,特别是在处理动态加载页面时非常有用。本文将为您提供一个超级详细的Selenium教程,以帮助您快速入门并了解其各种功能和用法。