I hate encryption

This commit is contained in:
Ethan O'Brien 2024-02-21 13:50:18 -06:00
parent 4405b1ae22
commit 163f5956a1
7 changed files with 2048 additions and 13 deletions

14
.gitignore vendored
View file

@ -1,14 +1,2 @@
# Generated by Cargo
# will have compiled files and executables
debug/
a/
target/
# Remove Cargo.lock from gitignore if creating an executable, leave it for libraries
# More information here https://doc.rust-lang.org/cargo/guide/cargo-toml-vs-cargo-lock.html
Cargo.lock
# These are backup files generated by rustfmt
**/*.rs.bk
# MSVC Windows builds of rustc generate these, which store debugging information
*.pdb

1831
Cargo.lock generated Normal file

File diff suppressed because it is too large Load diff

10
Cargo.toml Normal file
View file

@ -0,0 +1,10 @@
[package]
name = "ew"
version = "0.0.1"
edition = "2021"
[dependencies]
actix-web = { version = "4.5.1", features = [ "openssl" ] }
openssl = { version = "0.10" }
base64 = "0.21.5"
reqwest = { version = "0.11", features = ["blocking"] }

29
cert.pem Normal file
View file

@ -0,0 +1,29 @@
-----BEGIN CERTIFICATE-----
MIIFCTCCAvGgAwIBAgIUPwpd0f3pYA4pKar2Qg9IGfuM4x0wDQYJKoZIhvcNAQEL
BQAwFDESMBAGA1UEAwwJbG9jYWxob3N0MB4XDTI0MDIyMTE2MTgwOFoXDTI1MDIy
MDE2MTgwOFowFDESMBAGA1UEAwwJbG9jYWxob3N0MIICIjANBgkqhkiG9w0BAQEF
AAOCAg8AMIICCgKCAgEAxVyaNyow4asd7WgL3b/3IwsNPUl+N/rilXD9PmGXgHaV
RwKXdCd0t5VUXhdvuf4a2amWWInQv+4E0n0x1D4JSgIoXacp3+The3njuKgSicdc
Xc2UuMOnw0IGovWYkz18zPahTiu+sba7nU+xUSK8ERKxurH3MyWAe6UXy4EDJO4A
X6l0EMMBY7ijJHjKuid6/xgg8NPkWZxs6u396LeYb0F//GfOhBXspUyog8g8eI3p
HJsWtnKPCiTEa6nIoLTsDYMJuaTHlyJU6J8f0hraAMEQu40F/bKrFJPQJ1pkM/zV
m2IjAdh5JYZWdZ7qGeSWhy06lnCsdEnJ9f+u/z9DwTG6gMNP+XL2GDmNj/K3iP5R
hsq2YAOrcOURvIdjUe5LWIG20VVvEKQ/IF9Kyrea/CGt5dtFSsaRVrOZ3S2ufKCf
FdiwUYAvBYeU6Pc0F2DJRWHfiIFws8o0GPsphKR2FKK+tu9Gbsd5Rdgzy0S4v8us
bgiuisv5CzBxAe/5QLuxHzKurnqDFnbA8QosllZZicDzxyqt8/gaQQZQoUF3clyq
tYbcSIL/72VuAKGdMvZsT68Mndz3K+ZSwei0WCj8enObPxQi3WUAzcOH/mfJZ8m5
hGSlJG3l+d/sL1QX+CAE2wVAXwJdGq9fBi4YAAybFOPbcxwNpXrmGAXVzZF4PsEC
AwEAAaNTMFEwHQYDVR0OBBYEFGcLwWZzlVdXk8WEIB1SB51pguHTMB8GA1UdIwQY
MBaAFGcLwWZzlVdXk8WEIB1SB51pguHTMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZI
hvcNAQELBQADggIBADuJV/QsTVmHmzKG33+LRjV9jJQkg7ItUDj9ScD9FZRI1nKd
7tiFkoKRE18LMyd0VqV8imc8cbeHALdZSbRc4U6IqI0yXPEZV+ANdP+6CKDsnE03
e0rDxYqvmfzTdB8tSwXQdnKxDj5f1TZufL+gYyZ6mLjktJ67GEF8CknjPLz8RWda
sFsumnJawklBau2hxH9Z4mDDdOVtZGpaEutxpSO8n3klnzKFD3mvqHcmoMa1QAFC
fn5opPtGo6xBIU3NgiEj2X7fcfvd/c/QZeJXcR0XSOvUKThQG6T7n6Ah7wyUef6u
Jmv3XotFh59qZTMbYzpjO3R7+ol1TS3bTOpWFWXTVdQqHHNdHsotUvNvmYTMkSey
hFLDbG172FXZMmeTZmmBIvWzgAIBAcdi4DBWl1jqHu38MSOiYN5Q5ooAlGuSd2Dt
B+J3a8Kcn6Un3d8A8MuBjSZkK4DCcDWwdvyvc36idSGyvGJATd7SrBuFuW1V5f29
16IxOSR4alllg5X6gujFyGKrLqQlamXyYTkMJxsURr0SQTBQ8or+pWAHNl2KFJ6P
nMWg9T+Ym76srFWxK0SGH1pDU0r4yQIKIOW01+tpo1w++2ZWe88v+R/Sr5VQfwII
vhyD2hWLAPVt2gGp0t/lF1NWwJy/xCJnti2lLYGc23BJJhKXmT5D8WnxMYnK
-----END CERTIFICATE-----

52
key.pem Normal file
View file

@ -0,0 +1,52 @@
-----BEGIN PRIVATE KEY-----
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
Ulo31znSDnAUYFEHQo/FadDUm5xCpiY=
-----END PRIVATE KEY-----

24
src/encryption.rs Normal file
View file

@ -0,0 +1,24 @@
use openssl::symm::{Cipher, Crypter, Mode};
use openssl::error::ErrorStack;
use base64::{Engine as _, engine::general_purpose};
const IV_LENGTH: usize = 16;
const KEY: &str = "3559b435f24b297a79c68b9709ef2125";
pub fn decrypt_packet(base64_input: &str) -> Result<String, ErrorStack> {
let base64_buffer = general_purpose::STANDARD.decode(base64_input).unwrap();
let decryption_iv = &base64_buffer[..IV_LENGTH];
let ciphertext = &base64_buffer[IV_LENGTH..];
let cipher = Cipher::aes_256_cbc();
let mut decrypter = Crypter::new(cipher, Mode::Decrypt, KEY.as_bytes(), Some(decryption_iv))?;
let mut decrypted_data = vec![0u8; ciphertext.len() + cipher.block_size()];
let mut decrypted_len = decrypter.update(ciphertext, &mut decrypted_data)?;
decrypted_len += decrypter.finalize(&mut decrypted_data[decrypted_len..])?;
decrypted_data.truncate(decrypted_len);
Ok(String::from_utf8(decrypted_data).unwrap())
}

101
src/main.rs Normal file
View file

@ -0,0 +1,101 @@
mod encryption;
use actix_web::{
// post,
// get,
HttpResponse,
HttpRequest,
http::header::HeaderMap,
web,
dev::Service
};
use openssl::ssl::{SslAcceptor, SslFiletype, SslMethod};
async fn make_post_request(url: &str, body: &str, headers: &HeaderMap) -> Result<String, reqwest::Error> {
let client = reqwest::Client::new();
let mut response = client
.post(url)
.body(body.to_string());
for (name, value) in headers.iter() {
if name == "Accept-Encoding" {continue;};
if name == "host" {
response = response.header("host", "api.app.lovelive-sif2.bushimo.jp");
continue;
};
response = response.header(name, value.to_str().unwrap());
}
let response_body = response.send().await?.text().await?;
Ok(response_body)
}
async fn make_get_request(url: &str, headers: &HeaderMap) -> Result<String, reqwest::Error> {
let client = reqwest::Client::new();
let mut response = client.get(url);
for (name, value) in headers.iter() {
if name == "Accept-Encoding" {continue;};
if name == "host" {
response = response.header("host", "api.app.lovelive-sif2.bushimo.jp");
continue;
};
response = response.header(name, value.to_str().unwrap());
}
let response_body = response.send().await?.text().await?;
Ok(response_body)
}
async fn log_unknown_request(req: HttpRequest, body: String) -> HttpResponse {
if body != String::new() {
println!("req: {}", encryption::decrypt_packet(&body).unwrap_or(String::new()));
let resp = make_post_request(&format!("https://api.app.lovelive-sif2.bushimo.jp{}", req.path()), &body, req.headers()).await.unwrap();
//println!("Unhandled request: {} {}", req.path(), body);
println!("resp: {}", encryption::decrypt_packet(&resp).unwrap_or(String::new()));
HttpResponse::Ok().body(resp)
} else {
let resp = make_get_request(&format!("https://api.app.lovelive-sif2.bushimo.jp{}", req.path()), req.headers()).await.unwrap();
//println!("Unhandled request: {} {}", req.path(), body);
println!("resp: {}", encryption::decrypt_packet(&resp).unwrap_or(String::new()));
HttpResponse::Ok().body(resp)
}
}
#[actix_web::main]
async fn main() -> std::io::Result<()> {
use actix_web::{App, HttpServer};
let mut builder = SslAcceptor::mozilla_intermediate(SslMethod::tls()).unwrap();
builder
.set_private_key_file("key.pem", SslFiletype::PEM)
.unwrap();
builder.set_certificate_chain_file("cert.pem").unwrap();
let rv = HttpServer::new(|| App::new()
.wrap_fn(|req, srv| {
println!("Request: {}", req.path());
srv.call(req)
})
.default_service(web::route().to(log_unknown_request)))
.bind_openssl("0.0.0.0:8080", builder)?
.run();
println!("Server started: http://127.0.0.1:{}", 8080);
rv.await
}
/*
fn main() {
let base64_input = "MX2tzmKTxY7EsV46rYFZuAfxeY0tPHuZ0etG15WsK1MAzs/U0WUXE4bJZINrEvCxqqUbvCYxhDtXp3HoeH/zDXtnW183aF/aYycmUW3aAF6zyio4/PJoqFl7EGET37ruotoQ9Teof2PXpXraF94diw==";
match decrypt_packet(base64_input) {
Ok(decrypted_json) => {
// Process the decrypted JSON
println!("Decrypted JSON: {}", decrypted_json);
}
Err(err) => {
eprintln!("Error decrypting packet: {}", err);
}
}
}
*/