我正在尝试设置替代密码。对于我的密钥,我使用的是一个随机的256字节数组,它是256个可能字节值的排列。
这是通过以下方式设置的:
public Substitute()
{
key = new byte[256];
List<Byte> list = new ArrayList<Byte>();
for(int i = -128; i < 128; i++)
{
list.add((byte)i);
}
Collections.shuffle(list);
Byte[] tmp = new Byte[256];
tmp = list.toArray(tmp);
for(int i = 0; i < 256; i++)
{
key[i] = tmp[i];
}
}
然后我使用以下方法对消息进行编码/解码:
public byte [] encode(String S)
{
byte[] plain = S.getBytes();
byte[] encoded = new byte[plain.length];
for(int i = 0; i < plain.length; i++)
encoded[i] = (byte)(key[plain[i]]);
return encoded;
}
public String decode(byte [] bytes)
{
byte[] plain = new byte[bytes.length];
for(int i = 0; i < bytes.length; i++)
plain[i] = (byte)(Arrays.asList(key).indexOf(bytes[i]));
return new String(plain);
}
在此过程中出现了问题,我解码的任何内容都会以ÿ
我不确定我哪里出错了,或者这是否是最有效的做事方式。我必须保留相同的函数签名和一般方法,但实现细节由我决定。
感谢任何和所有帮助。
答案 0 :(得分:1)
您的问题 - 正如我所期待您猜测的那样 - 来自:
plain[i] = (byte)(Arrays.asList(key).indexOf(bytes[i]));
您需要做的是在key
中找到再见,并将其替换为偏移量。
像
这样的东西plain[i] = key.indexof(byes[i]);
但这当然不会奏效 - 而且你需要折叠你添加到编码中的-128
。
尝试将一些测试代码放在一起 - 会回复给您。
答案 1 :(得分:1)
这个问题,而OldCurmudegeon说,问题是:
plain[i] = (byte)(Arrays.asList(key).indexOf(bytes[i]));
所以我修改了我的程序以包含一个decryptKey
,它与键的反面相反,允许我为每个值找到索引。
反过来就是:
public byte [] reverseKey(byte[] key)
{
byte[] reverse = new byte[key.length];
for(int i = 0; i < 256; i++)
{
reverse[key[i] + 128] = (byte)i; //makes sure to account for negative values.
}
return reverse;
}
然后我调整了我的解码方法以使用这个新的decryptKey
:
public String decode(byte [] bytes)
{
byte[] plain = new byte[bytes.length];
for(int i = 0; i < bytes.length; i++)
plain[i] = (byte)decryptKey[bytes[i] + 128];
return new String(plain);
}
据我所知,这是有用的。