伪量子加密算法

量子加密

什么是量子加密

  任何一串信息都可以表示成一串二进制字符,也就是由0或1组成的字符串。对于由01组成的字符串的每位数字a,我们都可以给它一个对应的密钥k,这个k也是一个0或1的数字,根据a和k就可以算出对应的密文b,它也是一个0或1的数字。这对应的规则就是,如果k = 0,那么b就等于a,如果k = 1,那么b就等于0和1当中不等于a的那一个。

  也就是说,如果k等于0,那么就把0变成0,1变成1;而k等于1,则把0变成1,1变成0。

  再简单来说就是k等于0不变,则k等于1就0,1互换。其也被称为“异或”或者“模为2的加法”等。

  量子加密虽然其原理简单,但是它却可实现高保密性,其诀窍不在于算法,而在于密钥。

  实际上,对于原文的每一位,都相应的有一位密钥,也就是说如果原文的长度是n位,则密钥的长度也是n位。

  这还没有完,这串字符串还必须是个随机的字符串,也就是说每一位都是随机的0或者1任何的两位数之间没有任何联系。而这仍然没完,而这么长的密钥还只能用一次。也就是说,你这次用n位的秘钥传输了n位的原文,下次你传同样的内容,还必须从头再来,重新构造n位的密钥。千万不能把原来的密钥再用一次,这就叫做一次一密。

量子加密的特点

  总结而言,量子密码中的密钥是满足这么三种条件的字符串:

  • 长度跟明文相等
  • 随机
  • 一次一密

  之所以这么做,是因为其绝对不会被任何数学方法破译。因为这样一段密文,可能对应一段跟它等长的任何一段明文,而且概率相等。

  在密码学当中一个重要的定理就是:用一次性便笺加密的密文是绝对不可破译的。而这条信息的定理是克劳德·香农证明的。

量子加密的使用方法

  量子加密的具体使用就是:将明文用量子秘钥进行加密,生成密文,然后密文通过普通途径传输,而与此同时,秘钥通过量子信道传输。由于发送方与接收方是通过量子纠缠现象保证双方秘钥的一致性,而该秘钥由于在产生过程中没有经过信使,因而其本身就保证了秘钥无法被截获,因而量子通信是通过物理手段保证是绝对安全的。

伪量子加密

  通过上面的说明,我们就不难理解什么是量子加密,由于量子加密是通过同时在不同线路上传输密文与秘钥,进而实现的超强加密功能。

  量子加密的流程如下:

发送方:明文->二进制->加密->传输
接收方:传入->解密->二进制->明文

  而伪量子加密算法(姑且我这么定义),与其类似,也是分别通过密文与秘钥来实现的加密,只是与真正的量子加密不同之处在于,我这里的秘钥指的是当前系统的时间戳,由于时间的单向流动性,因而通过时间戳来保证生成的密文永远唯一,不会重复

  当然,说完了这一特点,我们就不难理解,伪量子加密算法要想破解,必须得满足三个条件,那就是:

  • 知晓加密规则
  • 通信的双方,必须同时在线
  • 其两端的电子设备,其时间是一致的,差一秒都不行

  而我这里的伪量子加密算法流程与其类似

发送方:明文->二进制->扰码->传输
接收方:传入->扰码->二进制->明文

  而这种加密算法也符合量子加密算法的如下特点,只是此处的随机是依赖的通信时间的随机且不重复的特点(时间的单向流动性)。

  • 长度跟明文相等
  • 随机
  • 一次一密

源码

  Binary

package com.lyc.pseudoQuantumCryptography.core;

/**
 * @author: zhangzhenyi
 * @date: 2019/4/7 8:43
 * @description: 字符串与二进制互转
 **/
public class Binary {
   

    /**
     * 将字符串转换成二进制
     * @param str 输入字符串
     * @return
     */
    public String toBinary(String str){
   
        // 将字符串转换成char数组
        char[] strCharArray = str.toCharArray();
        StringBuilder result = new StringBuilder();
        for (char aStrCharArray : strCharArray) {
   
            // 获取系统的当前时间
            String currentTime = MappingTable.newMappingTable().getCurrentTime();
            // 以字符乘以当前时间戳进行加密操作
            Long currentStr = aStrCharArray * Long.valueOf(currentTime);
            // 将加密后的信息转换成字节码
            result.append(Long.toBinaryString(currentStr));
            result.append(" ");
        }
        int lastIndexOfSpace = result.lastIndexOf(" ");
        // 取消结尾处的空格
        result.delete(lastIndexOfSpace,lastIndexOfSpace + 1);
        return result.toString();
  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值