diff --git a/problems/p19/Cargo.toml b/problems/p19/Cargo.toml new file mode 100644 index 0000000..7802d2d --- /dev/null +++ b/problems/p19/Cargo.toml @@ -0,0 +1,7 @@ +[package] +name = "p19" +version = "0.1.0" +edition = "2024" + +[dependencies] +base64 = { workspace = true } diff --git a/problems/p19/src/main.rs b/problems/p19/src/main.rs new file mode 100644 index 0000000..a1b31db --- /dev/null +++ b/problems/p19/src/main.rs @@ -0,0 +1,123 @@ +// 使用瞪眼法判断 +// 结合gpt很快可以猜出来。 +use base64::{Engine as _, engine::general_purpose::STANDARD}; +use std::io::{Write, stdin, stdout}; + +fn guess(idx: usize, seq: &str) { + let ciphers = [ + "SSBoYXZlIG1ldCB0aGVtIGF0IGNsb3NlIG9mIGRheQ==", + "Q29taW5nIHdpdGggdml2aWQgZmFjZXM=", + "RnJvbSBjb3VudGVyIG9yIGRlc2sgYW1vbmcgZ3JleQ==", + "RWlnaHRlZW50aC1jZW50dXJ5IGhvdXNlcy4=", + "SSBoYXZlIHBhc3NlZCB3aXRoIGEgbm9kIG9mIHRoZSBoZWFk", + "T3IgcG9saXRlIG1lYW5pbmdsZXNzIHdvcmRzLA==", + "T3IgaGF2ZSBsaW5nZXJlZCBhd2hpbGUgYW5kIHNhaWQ=", + "UG9saXRlIG1lYW5pbmdsZXNzIHdvcmRzLA==", + "QW5kIHRob3VnaHQgYmVmb3JlIEkgaGFkIGRvbmU=", + "T2YgYSBtb2NraW5nIHRhbGUgb3IgYSBnaWJl", + "VG8gcGxlYXNlIGEgY29tcGFuaW9u", + "QXJvdW5kIHRoZSBmaXJlIGF0IHRoZSBjbHViLA==", + "QmVpbmcgY2VydGFpbiB0aGF0IHRoZXkgYW5kIEk=", + "QnV0IGxpdmVkIHdoZXJlIG1vdGxleSBpcyB3b3JuOg==", + "QWxsIGNoYW5nZWQsIGNoYW5nZWQgdXR0ZXJseTo=", + "QSB0ZXJyaWJsZSBiZWF1dHkgaXMgYm9ybi4=", + "VGhhdCB3b21hbidzIGRheXMgd2VyZSBzcGVudA==", + "SW4gaWdub3JhbnQgZ29vZCB3aWxsLA==", + "SGVyIG5pZ2h0cyBpbiBhcmd1bWVudA==", + "VW50aWwgaGVyIHZvaWNlIGdyZXcgc2hyaWxsLg==", + "V2hhdCB2b2ljZSBtb3JlIHN3ZWV0IHRoYW4gaGVycw==", + "V2hlbiB5b3VuZyBhbmQgYmVhdXRpZnVsLA==", + "U2hlIHJvZGUgdG8gaGFycmllcnM/", + "VGhpcyBtYW4gaGFkIGtlcHQgYSBzY2hvb2w=", + "QW5kIHJvZGUgb3VyIHdpbmdlZCBob3JzZS4=", + "VGhpcyBvdGhlciBoaXMgaGVscGVyIGFuZCBmcmllbmQ=", + "V2FzIGNvbWluZyBpbnRvIGhpcyBmb3JjZTs=", + "SGUgbWlnaHQgaGF2ZSB3b24gZmFtZSBpbiB0aGUgZW5kLA==", + "U28gc2Vuc2l0aXZlIGhpcyBuYXR1cmUgc2VlbWVkLA==", + "U28gZGFyaW5nIGFuZCBzd2VldCBoaXMgdGhvdWdodC4=", + "VGhpcyBvdGhlciBtYW4gSSBoYWQgZHJlYW1lZA==", + "QSBkcnVua2VuLCB2YWluLWdsb3Jpb3VzIGxvdXQu", + "SGUgaGFkIGRvbmUgbW9zdCBiaXR0ZXIgd3Jvbmc=", + "VG8gc29tZSB3aG8gYXJlIG5lYXIgbXkgaGVhcnQs", + "WWV0IEkgbnVtYmVyIGhpbSBpbiB0aGUgc29uZzs=", + "SGUsIHRvbywgaGFzIHJlc2lnbmVkIGhpcyBwYXJ0", + "SW4gdGhlIGNhc3VhbCBjb21lZHk7", + "SGUsIHRvbywgaGFzIGJlZW4gY2hhbmdlZCBpbiBoaXMgdHVybiw=", + "VHJhbnNmb3JtZWQgdXR0ZXJseTo=", + "QSB0ZXJyaWJsZSBiZWF1dHkgaXMgYm9ybi4=", + ] + .map(|x| STANDARD.decode(x).unwrap()); + let seq = seq.as_bytes(); + let key_stream: Vec = ciphers[idx].iter().zip(seq).map(|(a, b)| a ^ b).collect(); + let plaintexts: Vec> = ciphers + .iter() + .map(|cipher| { + cipher + .iter() + .zip(key_stream.iter()) + .map(|(&a, &b)| a ^ b) + .collect::>() + }) + .collect(); + for (k, v) in plaintexts.iter().enumerate() { + let v_str = String::from_utf8_lossy(v); + println!("{k}: {v_str}"); + } +} + +fn main() { + loop { + print!("> "); + stdout().flush().unwrap(); + let mut input = String::new(); + stdin().read_line(&mut input).expect("Failed to read input"); + let input = input.trim_end_matches(['\n', '\r']); + let Some((idx, seq)) = input.split_once(" ") else { + println!("Please enter two parts separated by space"); + continue; + }; + + guess(idx.parse().unwrap(), seq); + } + + // 0: I have met them at close of day + // 1: Coming with vivid faces + // 2: From counter or desk among grey + // 3: Eighteenth-century houses. + // 4: I have passed with a nod of the head + // 5: Or polite meaningless words, + // 6: Or have lingered awhile and said + // 7: Polite meaningless words, + // 8: And thought before I had done + // 9: Of a mocking tale or a gibe + // 10: To please a companion + // 11: Around the fire at the club, + // 12: Being certain that they and I + // 13: But lived where motley is worn: + // 14: All changed, changed utterly: + // 15: A terrible beauty is born. + // 16: That woman's days were spent + // 17: In ignorant good will, + // 18: Her nights in argument + // 19: Until her voice grew shrill. + // 20: What voice more sweet than hers + // 21: When young and beautiful, + // 22: She rode to harriers? + // 23: This man had kept a school + // 24: And rode our winged horse. + // 25: This other his helper and friend + // 26: Was coming into his force; + // 27: He might have won fame in the end, + // 28: So sensitive his nature seemed, + // 29: So daring and sweet his thought. + // 30: This other man I had dreamed + // 31: A drunken, vain-glorious lout. + // 32: He had done most bitter wrong + // 33: To some who are near my heart, + // 34: Yet I number him in the song; + // 35: He, too, has resigned his part + // 36: In the casual comedy; + // 37: He, too, has been changed in his turn + // 38: Transformed utterly: + // 39: A terrible beauty is born. +}