CTFを再生して暗号化2を学習する:Caesar(Caesarコード)、Morse(モールスコード)、セカンダリbase64 + UnicodeからASCiiコード

CTF暗号化2:

1.シーザーパスワード:

ここに画像の説明を挿入
私が言ったのではなく、私はこの質問の冒頭で本当に困惑しました。最初に:彼はランタンに1組の文字あると言いました。私は当初、この文字のペアはキーとプレーンテキストであると思っていました。アタッチメントを開くまで、それはキーであってはなりません。 Ah:
ここに画像の説明を挿入
添付ファイルが次のようになっていることがわかります。これは、プレーンテキストまたは暗号テキストの場合があります。前の質問を振り返ると、答えの形式は次のとおりです:cyberpeace {XXXX}、これはどういう意味ですか?これは、この添付ファイルの中括弧がサイバーピースであり、中括弧が暗号化または復号化されていないことを意味します。つまり、アルゴリズムは中括弧を制御できません。この質問のタイトルを追加します:Caesar、それがCaesarのアルゴリズムであることを示します。シーザー暗号化アルゴリズムは、シフトステップとしてキーを必要とする古典的な対称暗号化アルゴリズムであることはわかっていますが、この問題のキーはどうなりますか?答えの形式はサイバーピースである必要があることがわかっているため、最初の文字が比較されます。'o '-' c '= 12
なので、このシフトでは、各文字について12ステップ(円運動)後方に移動する必要があります。

解決策:
シーザー暗号化アルゴリズムは次のとおりです:C = E(k、p)=(p + k)mod 26
シーザー復号化アルゴリズムは次のとおりです:p = D(k、C)=(C-k)mod 26

上記の観察によれば、key = 12を逆にする必要があるため、これは復号化であり、コードは次のようになります。


public class Caesar {
    
    
	
	static String src = "oknqdbqmoq{kag_tmhq_xqmdzqp_omqemd_qzodkbfuaz}";
	
	public static void main(String[] args) {
    
    
		StringBuffer ans = new StringBuffer("");
		
		for(int i = 0;i < src.length();++i) {
    
    
			if(src.charAt(i) >= 'a' && src.charAt(i) <= 'z')
			{
    
    
				char iChar = (char)((src.charAt(i) - 'a' - 12 + 26) % 26 + 'a');
				ans.append(iChar);
			}
			else
				ans.append(src.charAt(i));
		}
		
		System.out.println(ans);
		
	}
}

さらに、CaesarパスワードにはオンラインソリューションのURLもあります。

シーザーパスワードオンライン暗号化/復号化

2.モールスパスワード:

ここに画像の説明を挿入

この質問を開いた後、添付ファイルは次のとおりです。
ここに画像の説明を挿入最初にこの01文字列取得しましたが、最初はバイナリであると思い、ASCiiコードを比較しました...次に、質問のタイトルを確認しました。モールスは、モールスコードであることを示しています。正直なところ、私はモールスパスワードを学んだことがないので、それを学びに行き、このモールスパスワード比較表を見ました。

ここに画像の説明を挿入
次に、このモールスパスワードの暗号文の比較が「-」と「。」で構成され、添付ファイルが0と1であることを確認できます。したがって、それはどのような対応ですか?わかりませんが、最終的な平文フォーマットはサイバーピースで始まることはわかっています。見てみましょう。最初の1は11で、これは文字「c」に対応するはずです。最初に、暗号文キーの長さは2です。残念ながら、パスワードテーブルの長さは2で、文字は同じです(結局、11は同じ文字です)。 )唯一の比較は次のとおりです。M......このソリューションはサイバーピースから始まっていませんか?
しかし、この方法で少なくとも1つのポイントを決定しました。1は「-」に対応し、0は「。」に対応します。

解決策:またはJavaプログラミング

import java.util.HashMap;
import java.util.Map.Entry;
import java.util.Set;

public class Morse {
    
    
	
	static String src = "11 111 010 000 0 1010 111 100 0 00 000 000 111 00 10 1 0 010 0 000 1 00 10 110";
	
	public static void main(String[] args) {
    
    
		src = src.replace('1', '-');
		src = src.replace('0', '.');
		
		HashMap<String, String> mp = new HashMap<>();
		mp.put("a", ".-");
		mp.put("b", "-...");
		mp.put("c", "-.-.");
		mp.put("d", "-..");
		mp.put("e", ".");
		mp.put("f", "..-.");
		mp.put("g", "--.");
		mp.put("h", "....");
		mp.put("i", "..");
		mp.put("j", ".---");
		mp.put("k", "-.-");
		mp.put("l", ".-..");
		mp.put("m", "--");
		mp.put("n", "-.");
		mp.put("o", "---");
		mp.put("p", ".-");
		mp.put("q", "--.-");
		mp.put("r", ".-.");
		mp.put("s", "...");
		mp.put("t", "-");
		mp.put("u", "..-");
		mp.put("v", "...-");
		mp.put("w", ".--");
		mp.put("x", "-..-");
		mp.put("y", "-.--");
		mp.put("z", "--..");
		mp.put("0", "-----");
		mp.put("1", ".----");
		mp.put("2", "..---");
		mp.put("3", "...--");
		mp.put("4", "....-");
		mp.put("5", ".....");
		mp.put("6", "-....");
		mp.put("7", "--...");
		mp.put("8", "---..");
		mp.put("9", "----.");
		
		HashMap<String, String> MorseDec = new HashMap<>();
		Set<Entry<String, String> > entrySet = mp.entrySet();
		for(Entry<String, String> entry : entrySet) 
			MorseDec.put(entry.getValue(), entry.getKey());
		
		StringBuffer StrTemp = new StringBuffer("");
		StringBuffer ans = new StringBuffer("");
		for(int i = 0;i < src.length();++i) {
    
    
			if(' ' == src.charAt(i))
			{
    
    
				ans.append(MorseDec.get(StrTemp.toString()));
				StrTemp = new StringBuffer("");
			}
			else
				StrTemp.append(src.charAt(i));
		}
		ans.append(MorseDec.get(StrTemp.toString()));
		System.out.println(ans);
	}
}

結果を計算し
ここに画像の説明を挿入
ます次に、彼が言った形式に従うことを忘れないでください。答えは次のとおりです。

cyberpeace {morsecodeissointeringing}

3、包括的な質問:混合コーディング

ここに画像の説明を挿入
まず、添付ファイルを取得して確認しましたが、これは複雑なものでした:
ここに画像の説明を挿入
まず、これはニマです...しかし、最後の暗号化ブログを覚えていますか?base64暗号化について説明したとき、6桁未満の場合は0のセットを後ろに追加し、追加された0で完全に構成される文字 '='で表される6ビットのエンコーディングについて説明しました。最後に等号が2つあります。復号化にbase64を使用する必要がありますか?これはとても長いので、試してみましょう(幸い、昨日Javaプログラムを作成しました)。この
ここに画像の説明を挿入
プログラムは、非常に多くのことを実行してしまい、少し迷惑になりました。しかし、見てみましょう。これらの数値は定期的です。それがASCiiコードである場合、それは素晴らしいですが、よく見ると、タイトルは回答がすべて小文字であることを示しています...しかし、これらはすでにASCiiコード(97-122)の小文字の範囲を超えています。それはUnicodeエンコーディングです... Unicodeエンコーディングの特徴は何ですか?それまでに、どのエンコーディング形式であるかがわかります!

エンコーディングフォーマットコンバーター:優れたツール!

エンコード形式コンバーター!

ここに画像の説明を挿入

Unicodeエンコード:最初の128文字はASCIIコードで、その後に拡張コードが続きます。Unicodeコードでは、各文字ブロックは同じ標準に基づいています。中国語、韓国語、および日本語の象形文字は、0X3000〜0X9FFFのコードを使用します。
Unicodeから変換されたASCiiエンコーディングを取得したので、引き続き見てみましょう。なぜそれがまだ長い暗号文なのか...
base64を二次復号化してみて
ここに画像の説明を挿入
ください。この数値は次のようになります...そしてASCiiコードに対応する小文字は相対的です!
このASCiiコードの解析を続けます。
ここに画像の説明を挿入
私が言ったのではありません。包括的な質問はまだ少し難しいです。CTF初心者のように、私はフラグを取得します!
ようやく答えが出ました:
cyberpeace {welcometoattackanddefenceworld}

この質問の私の完全なコード:

import java.util.Base64;

public class base64 {
    
    
	static String src = "JiM3NjsmIzEyMjsmIzY5OyYjMTIwOyYjNzk7JiM4MzsmIzU2OyYjMTIwOyYjNzc7JiM2ODsmIzY5OyYjMTE4OyYjNzc7JiM4NDsmIzY1OyYjNTI7JiM3NjsmIzEyMjsmIzEwNzsmIzUzOyYjNzY7JiMxMjI7JiM2OTsmIzEyMDsmIzc3OyYjODM7JiM1NjsmIzEyMDsmIzc3OyYjNjg7JiMxMDc7JiMxMTg7JiM3NzsmIzg0OyYjNjU7JiMxMjA7JiM3NjsmIzEyMjsmIzY5OyYjMTIwOyYjNzg7JiMxMDU7JiM1NjsmIzEyMDsmIzc3OyYjODQ7JiM2OTsmIzExODsmIzc5OyYjODQ7JiM5OTsmIzExODsmIzc3OyYjODQ7JiM2OTsmIzUwOyYjNzY7JiMxMjI7JiM2OTsmIzEyMDsmIzc4OyYjMTA1OyYjNTY7JiM1MzsmIzc4OyYjMTIxOyYjNTY7JiM1MzsmIzc5OyYjODM7JiM1NjsmIzEyMDsmIzc3OyYjNjg7JiM5OTsmIzExODsmIzc5OyYjODQ7JiM5OTsmIzExODsmIzc3OyYjODQ7JiM2OTsmIzExOTsmIzc2OyYjMTIyOyYjNjk7JiMxMTk7JiM3NzsmIzY3OyYjNTY7JiMxMjA7JiM3NzsmIzY4OyYjNjU7JiMxMTg7JiM3NzsmIzg0OyYjNjU7JiMxMjA7JiM3NjsmIzEyMjsmIzY5OyYjMTE5OyYjNzc7JiMxMDU7JiM1NjsmIzEyMDsmIzc3OyYjNjg7JiM2OTsmIzExODsmIzc3OyYjODQ7JiM2OTsmIzExOTsmIzc2OyYjMTIyOyYjMTA3OyYjNTM7JiM3NjsmIzEyMjsmIzY5OyYjMTE5OyYjNzc7JiM4MzsmIzU2OyYjMTIwOyYjNzc7JiM4NDsmIzEwNzsmIzExODsmIzc3OyYjODQ7JiM2OTsmIzEyMDsmIzc2OyYjMTIyOyYjNjk7JiMxMjA7JiM3ODsmIzY3OyYjNTY7JiMxMjA7JiM3NzsmIzY4OyYjMTAzOyYjMTE4OyYjNzc7JiM4NDsmIzY1OyYjMTE5Ow==";
	
	static String NextSrc = "LzExOS8xMDEvMTA4Lzk5LzExMS8xMDkvMTAxLzExNi8xMTEvOTcvMTE2LzExNi85Ny85OS8xMDcvOTcvMTEwLzEwMC8xMDAvMTAxLzEwMi8xMDEvMTEwLzk5LzEwMS8xMTkvMTExLzExNC8xMDgvMTAw";
	public static void main(String[] args) {
    
    
		
		/* 加密 */
//		String Encode = Base64.getEncoder().encodeToString(src.getBytes());
//		System.out.println(Encode);
		
		
		/* 解密 */
		byte[] Decode1 = Base64.getDecoder().decode(src);
		System.out.println(new String(Decode1));
		
		/* 二次解密 */
		byte[] Decode2 = Base64.getDecoder().decode(NextSrc);
		
		String ansAscii = new String(Decode2);
		System.out.println(ansAscii);
		
//		String dec2 = Decode1.toString();
//		byte[] Decode2 = Base64.getDecoder().decode(dec2);
//		System.out.println(new String(Decode2));
		
		StringBuffer Temp = new StringBuffer(""), res = new StringBuffer("");
		for(int i = 0;i < ansAscii.length();++i) {
    
    
			if('/' == ansAscii.charAt(i) && 0 != i)
			{
    
    
				int resTemp = Integer.parseInt(Temp.toString());
				res.append((char)(resTemp));
				Temp = new StringBuffer("");
			}
			else if('0' <= ansAscii.charAt(i) && ansAscii.charAt(i) <= '9')
				Temp.append(ansAscii.charAt(i));
		}
		int resTemp = Integer.parseInt(Temp.toString());
		res.append((char)(resTemp));
		System.out.println(res);
		
	}
	
}

おすすめ

転載: blog.csdn.net/qq_44274276/article/details/105385951