Java 确保严格正多头上的XOR操作只产生严格正多头
我想确保严格正多头上的XOR操作只产生严格正多头 我的问题基于以下java代码:Java 确保严格正多头上的XOR操作只产生严格正多头,java,binary,binary-operators,Java,Binary,Binary Operators,我想确保严格正多头上的XOR操作只产生严格正多头 我的问题基于以下java代码: import java.nio.ByteBuffer; import java.util.ArrayList; import java.util.List; import java.util.ListIterator; import java.util.Random; public class Test { static Random r = new Random(); static clas
import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;
import java.util.Random;
public class Test {
static Random r = new Random();
static class Data {
long id = Math.abs(r.nextLong());
@Override
public String toString() {
return "Data {" + "id=" + id + '}';
}
}
public static void main(String[] args) {
List<Data> data = new ArrayList<>();
for (int i = 0; i < 10; i++) {
data.add(new Data());
}
final String password = "don't you ever tell them";
byte[] passwordBytes = password.getBytes();
long[] passwordLongs = new long[passwordBytes.length / 8];
for (int i = 0; i < passwordLongs.length; i++) {
ByteBuffer buffer = ByteBuffer.allocate(Long.BYTES);
byte[] chunk = new byte[Long.BYTES];
System.arraycopy(passwordBytes, i * Long.BYTES, chunk, 0, Long.BYTES);
buffer.put(chunk);
buffer.flip();//need flip
passwordLongs[i] = buffer.getLong();
}
System.out.println(data);
ListIterator<Data> encryptIterator = data.listIterator();
while (encryptIterator.hasNext()) {
Data next = encryptIterator.next();
next.id = next.id ^ passwordLongs[(encryptIterator.nextIndex() - 1) % passwordLongs.length];//XOR here
}
System.out.println(data);
}
}
导入java.nio.ByteBuffer;
导入java.util.ArrayList;
导入java.util.List;
导入java.util.ListIterator;
导入java.util.Random;
公开课考试{
静态随机r=新随机();
静态类数据{
long id=Math.abs(r.nextLong());
@凌驾
公共字符串toString(){
返回“数据{“+”id=“+id+'}”;
}
}
公共静态void main(字符串[]args){
列表数据=新的ArrayList();
对于(int i=0;i<10;i++){
添加(新数据());
}
final String password=“不要告诉他们”;
byte[]passwordBytes=password.getBytes();
long[]passwordLongs=new long[passwordBytes.length/8];
for(int i=0;i
任何人都可以提供一个可能有一些理论的答案吗?- 不变量1:正整数的最高有效位为零
- 不变量2:0或0=0
- 不变量1:正整数的最高有效位为零
- 不变量2:0或0=0
- 不变量1:正整数的最高有效位为零
- 不变量2:0或0=0
- 不变量1:正整数的最高有效位为零
- 不变量2:0或0=0
结论:正整数XOR正整数=正整数。鉴于Java中的长字符总是有符号的,您应该确保“密码”中的每个
长字符都不会切换符号位
也就是说,您的密码中的所有长
都应该类似于0B0XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
这会削弱“加密”(确切地说)一点,但您不应该对此太担心
但是应该注意的是,除非您想要比较它们是否大于0,否则没有理由这样做;实际数字总是相同的,也就是说,0xff
或0b11111111
总是相同的,只是它的十进制表示形式会根据您是使用无符号还是有符号短整数来存储它而变化(255
和-1
),您应该确保“密码”中的每一个长都不会切换符号位
也就是说,您的密码中的所有长
都应该类似于0B0XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
这会削弱“加密”(确切地说)一点,但您不应该对此太担心
但是应该注意的是,除非您想要比较它们是否大于0,否则没有理由这样做;实际数字总是相同的,也就是说,0xff
或0b11111111
总是相同的,只是它的十进制表示形式会根据您是使用无符号还是有符号短整数来存储它而变化(255
和-1
),您应该确保“密码”中的每一个长都不会切换符号位
也就是说,您的密码中的所有长
都应该类似于0B0XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
这会削弱“加密”(确切地说)一点,但您不应该对此太担心
但是应该注意的是,除非您想要比较它们是否大于0,否则没有理由这样做;实际数字总是相同的,也就是说,0xff
或0b11111111
总是相同的,只是它的十进制表示形式会根据您是使用无符号还是有符号短整数来存储它而变化(255
和-1
),您应该确保“密码”中的每一个长都不会切换符号位
也就是说,您的密码中的所有长
都应该类似于0B0XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
这会削弱“加密”(确切地说)一点,但您不应该对此太担心
但是应该注意的是,除非您想要比较它们是否大于0,否则没有理由这样做;实际数字总是相同的,也就是说,0xff
或0b11111111
总是相同的,只是它的十进制表示形式会根据您是使用无符号还是有符号短整数来存储它而变化(255
和-1
)我不确定您所说的不变1是什么意思<代码>长。toBinaryString(i)
始终以1开头表示正数。这是最重要的位吗