Java中异或操作和OTP算法

这篇具有很好参考价值的文章主要介绍了Java中异或操作和OTP算法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Java中异或操作和OTP算法,算法,玩意儿,java,算法,排序算法,异或,OTP

最近在研究加密算法,发现异或操作在加密算法中用途特别广,也特别好用。下面以Java语言为例,简单记录一下异或操作,以及在算法中的使用,包括常用的OTP算法。

一,异或操作特征

1, 相同出0,不同出1

换种说法是:无进位进行相加

0 ^ 0 = 0
0 ^ 1 = 1
1 ^ 0 = 1
1 ^ 1 = 0

比如
   101011
^ 110101
= 011110
即直接相加不需要关心进位

2, N ^ 0 = N (任何数异或上0都是自己)

可以用无进位相加来进行理解

3,N ^ N = 0 (因为二进制是一样的,相同出0)
4,异或符合 交换律 和 结合律

​ a ^ b = b ^ a 
(a ^ b) ^ c = a ^ (b ^ c)

5,自反性

a ^ b = c,c ^ b = a,即对同一个数字进行两次异或结果将回到最初的状态。


由此,通过明文和密钥异或得到的密文,再通过将密文和相同密钥再次异或操作得到明文。

二,算法应用

1,冒泡算法

冒泡排序中使用异或的方式交换数据的方式

public static void swap(int[] arr, int i, int j) {
    // 使用异或的方式进行交换
    arr[i] = arr[i] ^ arr[j];
    arr[j] = arr[i] ^ arr[j];
    arr[i] = arr[i] ^ arr[j];
}

解析:

arr[i] = "A";

arr[j] = "B";

(1)  arr[i] = arr[i] ^ arr[j];     arr[i] = "A" ^ "B";

(2)  arr[j] = arr[i] ^ arr[j];     arr[j] = "A" ^ "B" ^ "B" ==>  "A" ^ 0  ==> "A"

(3) arr[i] = arr[i] ^ arr[j];      arr[i] = "A" ^ "B" ^ "A"==> "A" ^ "A" ^ "B"  ==> "0" ^ "B" ==> "B"

最后结果  :   arr[i] = "B";     arr[j] = "A";

2,力扣算法实例1

有一堆数字,里面有一个数字的个数是奇数,其他数字的个数都是偶数,打印出这个奇数

public static void printOddNum1(int[] arr) {
    // 让这个数和所有的数进行异或
    int eor = 0;
    for (int num : arr) {
        eor ^= num;
    }
    // 最后出来就是那个奇数个的数
    System.out.println(eor);
}

解析:

1、无论异或的顺序是什么样的,最后的结果都是一样的

2、当两个相同的数进行异或,结果就是0,当0和一个数进行异或,结果就是这个数

3、所以异或到最后得到的那个数就是那个奇数

3,力扣算法实例2

有一堆数字,里面有两个数字的个数是奇数,其他数字的个数都是偶数,打印出这两个奇数

public static void printOddNum2(int[] arr) {
    // 让这个数和所有的数进行异或
    // 假如 第一个奇数为 a 第二个奇数为 b
    int eor = 0;
    for (int num : arr) {
        eor ^= num;
    }
    // 找到最右边的1的位置 异或不同才出1
    int rightNum = eor & (~eor + 1);
    // 将这个位置为1的数进行异或
    int eorOpen = 0;
    for (int num : arr) {
        // == 0 说明了在rightNum这个位置为 0
        if ((num & rightNum) == 0) {
            eorOpen ^= num;
        }
    }
    // eorOpen 不是 a 就是 b
    // 所以另一个数就是   eorOpen ^ eor
    System.out.println(eorOpen + " " + (eorOpen ^ eor));
}

解析:

1,先进行异或处理,将所有的数进行异或,当两个相同的数进行异或,结果就是0

2,因为0和任何数异或,得到的还是那个数,所以所有数异或之后得到的值就是两个奇数进行异或的值eor

3,因为这两个数字是不相同的,所以得到的值里面有一个数字为1

4,找到这个1的位置,再将这个位置为1的值进行异或,得到的值就是其中的一个此位置为1的数字eorOpen(个数是奇数的数字)

5,再将这个eorOpen值和之前第2步得到值eor进行异或得到的就是另一个奇数个数的数字

三,OTP算法

如果要说古典密码中,哪个最安全,那么一次性密码本一定会有一席之地。从理论层面上来说,它是牢不可破的(无法暴力破解),但在实际操作中却存在一些问题。

一次性密码本英文名为One-time Pad或者OTP,是在1882年被弗兰克·米勒(Frank Miller)发现并沿用至今,它是以随机的密钥(key)组成明文,且只使用一次,需要通信双方事先去沟通一个一次性的,与被加密信息长度相等或者更长的密钥。

Java中异或操作和OTP算法,算法,玩意儿,java,算法,排序算法,异或,OTP

加密过程:

就是将明文(待传信息的编码)和一串随机生成的二进制码进行XOR(异或)运算。

  1. 将明文编码,即转换为二进制。
  2. 随机生成和明文二进制位数相同的密钥。
  3. 将明文和密钥的二进制进行XOR操作,生成密文。

Java中异或操作和OTP算法,算法,玩意儿,java,算法,排序算法,异或,OTP

解密过程:

依靠的是XOR(异或)操作的自反性,通过明文和密钥异或得到的密文,再通过将密文和密钥再次异或操作得到明文。

Java中异或操作和OTP算法,算法,玩意儿,java,算法,排序算法,异或,OTP

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

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

当然OTP密码也有缺点,比如密钥太长,无法重复使用等问题。

码字不易,记得点赞关注哟!文章来源地址https://www.toymoban.com/news/detail-684240.html

到了这里,关于Java中异或操作和OTP算法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 02-异或算法

    0^N == N N^N == 0; 记为无进位相加即可,1+1 = 0; 异或运算满足交换律和结合。 解法:a b a = b,a b b = a。 1. 题目 ​一个数组中有一种数出现了奇数次,其他数都出现了偶数次,怎么找到并打印这种数。 2. 思路 ​数组里每个元素都异或,两两相消,就只剩下奇数次的那个数 3

    2024年02月05日
    浏览(36)
  • C# 异或校验算法

    本文介绍 C# 异或校验算法 BCC(Block Check Character/信息组校验码),因校验码是将所有数据异或得出,故俗称异或校验。具体算法是:将每一个字节的数据(一般是两个16进制的字符)进行异或后即得到校验码。 例如16进制数据:01 A0 7C FF 02 计算:01 xor A0 xor 7C xor FF xor 02 = 20 校验码

    2024年02月16日
    浏览(27)
  • 异或运算在算法中的神奇应用

    两个二进制数进行异或运算时,每一位上的数相同则结果为0,不同则结果为1。 简单记:异或就是二进制的无进位相加。 还有个同或运算:相同为1,不同为0,和异或是反的。 任何数与0异或,结果还是这个数:0^n=n 任何数与自身异或,结果都是0:n^n=0 异或运算满足交换律和

    2024年04月08日
    浏览(46)
  • 【c语言操作符系列1】^(异或操作符)讲解和多种例题详解

    目录 一、^ 是什么(^称为异或) 二、^的规律(特点) 三、可利用^秒杀的常见例题(重点) 1、消失的数字  2、不一样的人生密码 3、交换两个数(不能创建中间变量) 4、找出只出现一个的两个数字 是一种操作符, 针对二进制异或而言的 ,两个数对应的二进制位相同,异或

    2024年02月16日
    浏览(69)
  • C#的几种位操作运算,与、或、非、异或、左移、右移

    C#的常见几种位操作运算,与($)、或(|)、非(~)、异或(^)、左移()、右移() 位操作一般来说比加减乘除计算要快一些 与()操作符的位都为1时,才为1,其他都为0,因此与()操作符的结果范围在[0, Math.Min(x,y)],x,y均为正整数 或(|)操作符的位都为0时,才为0,其他都为1,因此或(|)操作

    2024年02月16日
    浏览(38)
  • java异或运算

            在Java中,异或运算是以二进制的形式进行计算的,当进行异或运算时,会先把两个数值转换成二进制,在进行异或运算。         运算规则:在 同位上 的数值,相同则为0(都是0或者都是1),不同则为1(一个为0一个为1)         运算定理:         1、结合律:

    2024年03月13日
    浏览(45)
  • Java-异或运算详解

    异或运算,符号为XOR或者^,是二进制的运算,运算法则为相同为0,不同为1,我记得时候反正总会忘(和同或记反),所以这里直接把异或理解为\\\" 不进位的二进制相加 \\\".举个栗子: 1000111 和 1110001 异或 按照不进位相加的运算方法:最小位都是1 相加为2也就是10(二进制运算), 因为是不进位的

    2024年02月07日
    浏览(46)
  • C++字典树算法:找出强数对的最大异或值 II

    数学 字典树 给你一个下标从 0 开始的整数数组 nums 。如果一对整数 x 和 y 满足以下条件,则称其为 强数对 : |x - y| = min(x, y) 你需要从 nums 中选出两个整数,且满足:这两个整数可以形成一个强数对,并且它们的按位异或(XOR)值是在该数组所有强数对中的 最大值 。 返回数

    2024年02月05日
    浏览(49)
  • 【什么是OTP?OTP介绍?】

    OTP:one time programmable,sensor芯片内部存在一部分OTP存储空间,意即一次性可编程序。(多是采用融丝结构,编程过程是不可逆的破坏活动。) EEPROM:Electrically-Erasable Programmable Read-Only Memory带电可擦可编程只读存储器 OTP数据一般存在两个地方:在sensor本身的芯片中OTP空间或者外挂

    2024年02月09日
    浏览(40)
  • Stata中异方差检验(代码直接食用)

    在线性回归模型的经典假设下,运用最小二乘法回归估计得到的才是最优线性无偏估计量(BLUE)。在实际问题中,完全满足基本假设的情况并不多,不满足的基本假设的情况下称为 基本假定违背 ,而 异方差 就是其中一种。 对于异方差的检验有很多种,这里我们介绍3种方法

    2024年02月02日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包