只有大写的 XOR 加密
XOR encryption with only uppercase
有没有办法从异或加密中只接收大写字母和数字?或者更好的是只有大写字母?或者我必须使用其他东西吗?
static private byte[] encryption(byte[] input, byte[] key){
byte[] out = new byte[input.length];
for(int i = 0; i < input.length; i++){
out[i] = (byte) (input[i] ^ key[i%key.length]);
}
return out;
}
我也想再解密回来
您可以在加密后添加额外的编码步骤。如果您只想接收可打印字符并使用标准方法,可以使用 Base64
编码。
如果您只需要大写字母或其他自定义格式,则需要制作自己的编码器和解码器。
您必须创建一种 "custom XOR" - 将允许的输入映射到前 X 个数字,异或,然后将它们映射回来。
请注意,如果您只允许在结果中使用大写字母,则输入时只能允许这么多不同的 "letters"(输入和输出字母表的大小必须相同)。
另请注意,XOR 非常不安全,除非与一次性一密一起使用。如果攻击者可以猜出部分输入,他可以将其与加密文本进行异或,并将以明文形式看到(部分)您的密码 - 只要您的密码,他们所需要做的就是正确猜出部分输入。
对于大写和数字,Base32 是一种可能。或者,使用 Hex(即 Base16),但将 16 个十六进制数字映射到字母表的前 16 个字母。这只会以一些额外的编程和双倍的存储要求为代价为您提供大写字母。 8位数据是16位十六进制字符。
有没有办法从异或加密中只接收大写字母和数字?或者更好的是只有大写字母?或者我必须使用其他东西吗?
static private byte[] encryption(byte[] input, byte[] key){
byte[] out = new byte[input.length];
for(int i = 0; i < input.length; i++){
out[i] = (byte) (input[i] ^ key[i%key.length]);
}
return out;
}
我也想再解密回来
您可以在加密后添加额外的编码步骤。如果您只想接收可打印字符并使用标准方法,可以使用 Base64
编码。
如果您只需要大写字母或其他自定义格式,则需要制作自己的编码器和解码器。
您必须创建一种 "custom XOR" - 将允许的输入映射到前 X 个数字,异或,然后将它们映射回来。
请注意,如果您只允许在结果中使用大写字母,则输入时只能允许这么多不同的 "letters"(输入和输出字母表的大小必须相同)。
另请注意,XOR 非常不安全,除非与一次性一密一起使用。如果攻击者可以猜出部分输入,他可以将其与加密文本进行异或,并将以明文形式看到(部分)您的密码 - 只要您的密码,他们所需要做的就是正确猜出部分输入。
对于大写和数字,Base32 是一种可能。或者,使用 Hex(即 Base16),但将 16 个十六进制数字映射到字母表的前 16 个字母。这只会以一些额外的编程和双倍的存储要求为代价为您提供大写字母。 8位数据是16位十六进制字符。