使用base64和Java中的未知密钥对字符串进行解码

时间:2019-07-28 23:32:41

标签: java encryption base64 encryption-symmetric

我陷入了这个作业问题,我有一个加密的字符串需要解密。

加密的消息: 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

没有英语。

1 个答案:

答案 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'