我陷入了这个作业问题,我有一个加密的字符串需要解密。
加密的消息: YVxcGVRATVhWXxlOXFhVGUZAWEtBFFZXFWBMXEZQWEAVWVZLW11XXg ==
键: 长度为4的字符串,仅包含数字。
加密算法:
import org.apache.commons.codec.binary.Base64;
import java.util.*;
public class encrypt2Java {
public static String encrypt2(String message, String key)
{
String st="";
for (int i=0;i<message.length(); i++)
{
st=st+(char)((int)(message.charAt(i))^(int)(key.charAt(i%key.length())));
}
byte[] encodedBytes = Base64.encodeBase64(st.getBytes());
String encodedString=new String(encodedBytes);
return encodedString;
}
我找到了一种使用与加密算法相同的密钥的解密算法,因此我尝试将该算法与所有可能的密钥一起使用,并且搜索了所有英文文本,但没有找到任何
。我几乎可以确定消息应该是英语短语,但是当我尝试使用所有可能的键时,我只会得到以下短语:
Ydl / lx} nng)xd`e /〜xh} y,fa-X | j〜hhv-af} cegh
没有英语。
答案 0 :(得分:0)
首先,我花了一点时间;我实现了一些decrypt
方法,可能有更有效的方法,但是首先使用Base64
解码器将消息解码为字节。然后,循环执行与加密中相同的异或运算的字节。
public static String decrypt2(String message, String key) {
byte[] bytes = Base64.getDecoder().decode(message);
StringBuilder sb = new StringBuilder();
for (int i = 0; i < bytes.length; i++) {
char ch = (char) (((int) bytes[i]) ^ (int) (key.charAt(i % key.length())));
sb.append(ch);
}
return sb.toString();
}
然后我做了一些猜测,并假设消息可能以一个普通的单词开头。我尝试了一些,例如“ You”,“ Good”和 finally “ The”。
public static void main(String[] args) {
for (int i = 0; i < 10000; i++) {
String k = String.format("%04d", i);
String d = decrypt2("YVxcGVRATVhWXxlOXFhVGUZAWEtBFFZXFWBMXEZQWEAVWVZLW11XXg==", k);
if (d.startsWith("The")) {
System.out.printf("key='%s', msg='%s'%n", k, d);
}
}
}
tl; dr
key='5499', msg='The attack will start on Tuesday morning'