尝试进行简单的加密/解密,以便在简单的通信协议中使用它。 似乎我不能使我的解密方法工作,或者可能是加密方法,输出文本不是原始方法。 我做错了什么?
String s1 = encrypt("Hello World!");
String s2 = decrypt(s1);
public static String encrypt(String decStr) {
byte[] key = new byte[]{
92, -33, 70, 90, 42, -22, -76, 38,
37, 109, 26, -113, 125, 105, 66, 81,
17, 22, 21, -30, 87, -124, -85, 58,
40, -116, -100, 28, 37, 127, 51, 36
};
byte[] encBytes = decStr.getBytes();
int n = encBytes.length + 5;
int k = key[encBytes.length % key.length] & 255;
for (int i = 0; i < encBytes.length; i++) {
encBytes[i] ^= key[(n + i) % key.length];
encBytes[i] ^= key[(k + i) % key.length];
}
return new BigInteger(encBytes).toString(36);
}
public static String decrypt(String encStr) {
byte[] key = new byte[]{
92, -33, 70, 90, 42, -22, -76, 38,
37, 109, 26, -113, 125, 105, 66, 81,
17, 22, 21, -30, 87, -124, -85, 58,
40, -116, -100, 28, 37, 127, 51, 36
};
byte[] encBytes = new BigInteger(encStr, 36).toByteArray();
byte[] decBytes = Arrays.copyOfRange(encBytes, 1, encBytes.length);
int n = decBytes.length + 5;
int k = key[decBytes.length % key.length] & 255;
for (int i = 0; i < decBytes.length; i++) {
decBytes[i] ^= key[(n + i) % key.length];
decBytes[i] ^= key[(k + i) % key.length];
}
return new String(decBytes);
}
答案 0 :(得分:2)
byte[] decBytes = Arrays.copyOfRange(encBytes, 1, encBytes.length);
你是从第二个角色开始的。将1更改为0
byte[] decBytes = Arrays.copyOfRange(encBytes, 0, encBytes.length);
将指定数组的指定范围复制到新数组中。 范围的初始索引(from)必须介于0和original.length之间,包括在内。原始[from]的值被放入副本的初始元素中(除非来自== original)。长度或从==到)。原始数组中后续元素的值将放入副本中的后续元素中。范围(to)的最终索引(必须大于或等于from)可能大于original.length,在这种情况下,(byte)0放在索引大于或等于的副本的所有元素中到original.length - 来自。返回数组的长度为 - from。
此外,您正在创建一个新的字节数组,然后立即将其复制到第二个数组中,但从不使用原始数组。似乎没有必要首先执行此副本
测试:
Hello World!
zxj9kxukhtsdmoll41
Hello World!