Rancher 1024 Decoding Challenge 解密解题全过程分析(附代码)

2022-11-29 17:34:50 浏览数 (2)

前言

在 2022-10-20 的时候 Rancher 公众号推送了一个1024程序员节日解密题,解密成功后将有机会获得SUSE Rancher 无线充 或者 最新周边棒球帽或飞盘一个,作为一个程序员,抱着试一试的心态尝试解下,这里就简单记录下自己整个通关过程以及自己的思路。

原题目如下:

1024 Decoding Challenge 共设有 2 个关卡,成功破解第 1 个关卡后,您将收到通往第 2 关的线索。

由于 2 个关卡是互相关联的,您必须先破解第 1 关才有办法进入第 2 关哦!

扫码进行开始闯关:

第一关

第一关截图如下:

分析

刚开始拿到第一关的时候就毫无头绪,唯一能看出的是轮盘逆时针旋转,key = 2 ,然后两个标红的A和a,应该最底部那串文字就是通第二关的暗语,并且不出意外应该是英文,所以就开始尝试,第一感觉就是这个k应该是对应英文里面的i,一般某个人说名言都是“我xxxxx这种”,于是看k 2逆时针旋转就是i,带着这个猜测,于是进行多翻译几个字,手工翻译出来第二个单词是hope,这下感觉应该没错,如果全手工操作工作量还是有点大,所以直接进行上代码批量翻译即可。

思路

  1. 将所有字母通过和ASCII码对应,然后进行判断即可;
  2. 根据观察圆盘中间逆时针并写着k=2,并且红色的外圈的A和内圈的a对应,初步猜测是外圈字母-2对应内圈字母,然后进行把密钥翻译成英文;
  3. 若是大写就直接-2,并且大写不能改变;
  4. 代码只需要特殊处理Aa、Bb这2个特殊的值-2后ASCII码会偏移到特殊符号,所以在这里必须 24进行逆转

代码

解题代码统一见文末。

第二关

通过第一关解密后可以直接跳转到第二关,截图如下:

分析

拿到第二关无非就是所有内容在源代码里面,需要通过审查元素查看网页源代码,按照步骤操作即可。

可以看到源代码里面的注释部分有一段中文“在下面的乱码中找到稀有字母。找到这些字母后,将他们按照顺序拼接起来就可以获取到答案(这些字母都是大写呦)! 然后将获取到的单词替换掉浏览器中的 "In............",即可获取通关密码!

分析到这其实已经知道目的了,这里就考察如何快速找到已知给出出现大写字母的值。这个乱码有很长,如果纯手工估计弄起很麻烦,然后还是老办法,用程序解决。

思路

  1. 直接遍历乱码中的每个字符,然后判断是否在‘A’和‘Z’之间,若在的话就进行打印拼接即可。
  2. 然后按照步骤直接替换url上的地址直接进入通关界面。

代码

解题代码统一见文末。

恭喜通关

通关代码

代码语言:javascript复制
import java.io.File;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;

/**
 * SUSE Rancher 1024 Decoding Challenge 解题
 * 游戏开始:https://games.rancher.cn/begin.html
 *
 * @author Lcry 2022年10月20日 16:48:56
 */
public class SUSE20221024Code {

    public static void main(String[] args) {
        //第一关
        one();
        System.out.println("n---------分割线---------");
        //第二关,参数修改为你的乱码所在文件地址
        two("F:\test\1024.txt");
    }

    /**
     * 第一关解题:
     * 思路:
     * 1、根据观察圆盘中间逆时针并写着k=2,并且红色的外圈的A和内圈的a对应,初步猜测是外圈字母-2对应内圈字母,然后进行把密钥翻译成英文
     * 2、若是大写就直接-2,并且大写不能改变
     * 3、代码只需要特殊处理Aa、Bb这2个特殊的值-2后ASCII码会偏移到特殊符号,所以在这里必须 24进行逆转
     * 最终翻译出结果就是:
     * i hope you didnt translate it by hand. thats what computers are for. doing it in by hand is inefficient and that's why this text is so long.
     * please replace "begin" in your browser with "InnovateEverywhere" and move on to the next level.
     * (我希望你不是手工翻译的。这就是电脑的用途。用手做是没有效率的,这就是为什么这篇文章这么长。请将浏览器中的“begin”替换为“InnovateEverywhere”,然后进入下一关。)
     */
    public static void one() {
        //第一关:
        String s1 = "k jqrg aqw fkfpv vtcpuncvg kv da jcpf. vjcvu yjcv eqorwvgtu ctg hqt. fqkpi kv kp da jcpf ku kpghhkekgpv cpf vjcv'u yja vjku vgzv ku uq nqpi. rngcug tgrnceg "dgikp" kp aqwt dtqyugt ykvj "KppqxcvgGxgtayjgtg" cpf oqxg qp vq vjg pgzv ngxgn.";
        int key = 2;
        for (int i = 0; i < s1.length(); i  ) {
            //65-90 A-Z
            //97-122 a-z

            if ((s1.charAt(i) >= 'A' && s1.charAt(i) <= 'Z')) {
                if ((int) s1.charAt(i) - key < 'A') {
                    System.out.print((char) (s1.charAt(i)   24));
                } else {
                    System.out.print((char) (s1.charAt(i) - key));
                }
            } else if (s1.charAt(i) >= 'a' && s1.charAt(i) <= 'z') {
                if ((int) s1.charAt(i) - key < 'a') {
                    System.out.print((char) (s1.charAt(i)   24));
                } else {
                    System.out.print((char) (s1.charAt(i) - key));
                }
            } else {
                //不是字母,直接原样打印
                System.out.print(s1.charAt(i));
            }
        }
    }
    /**
     * 第二关解题
     * 思路:
     * 1、通过第一关输入网址:https://games.rancher.cn/InnovateEverywhere
     * 2、然后根据图中显示,直接点击查看源代码,看到一句中文说明:
     * <--
     * 在下面的乱码中找到稀有字母。找到这些字母后,将他们按照顺序拼接起来就可以获取到答案(这些字母都是大写呦)!
     * 然后将获取到的单词替换掉浏览器中的 "InnovateEverywhere",即可获取通关密码!
     * -->
     * 3、题目非常明确,就是找到大写字母=稀有字母,然后拼接即可,所以这里采用遍历的方式,找到ASCII码是‘A’到‘Z’范围内的打印即可
     *
     * @param twoFilePath 网页源代码中的乱码文件
     */
    public static void two(String twoFilePath) {
        //第二关 https://games.rancher.cn/InnovateEverywhere 右击查看网页源代码乱码中找到稀有字母(稀有字母=字母都是大写的)
        String str = getStr(twoFilePath);
        for (int i = 0; i < str.length(); i  ) {
            if ( str.charAt(i) >= 'A' && (int) str.charAt(i) <= 'Z') {
                System.out.print(str.charAt(i));
            }
        }
    }


    private static String getStr(String filePath) {
        StringBuilder stringBuilder = new StringBuilder();
        try {
            File file = new File(filePath);
            if (file.isFile() && file.exists()) {
                InputStreamReader inputStreamReader = new InputStreamReader(Files.newInputStream(file.toPath()), StandardCharsets.UTF_8);
                char[] ca = new char[1024];
                int count;
                while ((count = inputStreamReader.read(ca)) != -1) {
                    stringBuilder.append(new String(ca, 0, count));
                }
                return stringBuilder.toString();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "";
    }
}

总结

在无意之中的看到公众号推送的消息,当时只是抱着试一试的心态尝试解题,没想到解出来了,前前后后耗时差不多1小时左右吧,乐于其中,感兴趣的同学也扫码文章开头的二维码进行体验,这个游戏来源来自 pythonchallenge ,里面一共有33关。

最后在此预祝大家1024程序员节日快乐~

0 人点赞