/** \file tools/rc4_encrypt.cpp * MegEngine is Licensed under the Apache License, Version 2.0 (the "License") * * Copyright (c) 2014-2021 Megvii Inc. All rights reserved. * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. */ #include #include #include #include #include #include #include "../src/decryption/rc4/rc4_cryption_base.h" #include "../src/decryption/rc4_cryption.h" using namespace lite; std::shared_ptr read_file(std::string file_path, size_t& size) { FILE* fin = fopen(file_path.c_str(), "rb"); if (!fin) { printf("failed to open %s.", file_path.c_str()); }; fseek(fin, 0, SEEK_END); size = ftell(fin); fseek(fin, 0, SEEK_SET); void* ptr = malloc(size); std::shared_ptr buf{ptr, ::free}; fread(buf.get(), 1, size, fin); fclose(fin); return buf; } void write_file(std::string file_path, const std::vector& data) { FILE* fin = fopen(file_path.c_str(), "wb"); if (!fin) { printf("failed to open %s.", file_path.c_str()); }; fwrite(data.data(), 1, data.size(), fin); fclose(fin); } typedef int (*CommandHandler)(int, char**); const char* usage = "Usage:\n" " rc4_encryptor encrypt_predefined_rc4 \n" " rc4_encryptor encrypt_rc4 \n" " rc4_encryptor encrypt_predefined_sfrc4 \n" " rc4_encryptor encrypt_sfrc4 " "\n" " rc4_encryptor hash \n"; int command_encrypt_predefined_rc4(int argc, char** argv) { if (argc != 4) { printf("Invalid encrypt_predefined_rc4 arguments.\n"); return 1; } const char* input_file_path = argv[2]; const char* output_file_path = argv[3]; size_t size = 0; auto keys = RC4::get_decrypt_key(); auto input = read_file(input_file_path, size); printf("Reading input file ...\n"); auto output = RC4::encrypt_model(input.get(), size, keys); write_file(output_file_path, output); printf("Done.\n"); return 0; } int command_encrypt_rc4(int argc, char** argv) { if (argc != 6) { printf("Invalid encrypt_rc4 arguments.\n"); return 1; } uint64_t hash_key = std::stoull(argv[2], 0, 0); uint64_t enc_key = std::stoull(argv[3], 0, 0); const char* input_file_path = argv[4]; const char* output_file_path = argv[5]; std::vector keys(128, 0); uint64_t* data = reinterpret_cast(keys.data()); data[0] = hash_key; data[1] = enc_key; size_t size = 0; auto input = read_file(input_file_path, size); printf("Reading input file ...\n"); auto output = RC4::encrypt_model(input.get(), size, keys); printf("Encrypting ...\n"); write_file(output_file_path, output); printf("Done.\n"); return 0; } int command_encrypt_predefined_sfrc4(int argc, char** argv) { if (argc != 4) { printf("Invalid encrypt_predefined_rc4 arguments.\n"); return 1; } const char* input_file_path = argv[2]; const char* output_file_path = argv[3]; size_t size = 0; auto keys = SimpleFastRC4::get_decrypt_key(); auto input = read_file(input_file_path, size); printf("Reading input file ...\n"); auto output = SimpleFastRC4::encrypt_model(input.get(), size, keys); write_file(output_file_path, output); printf("Done.\n"); return 0; } int command_encrypt_sfrc4(int argc, char** argv) { if (argc != 6) { printf("Invalid encrypt_rc4 arguments.\n"); return 1; } uint64_t hash_key = std::stoull(argv[2], 0, 0); uint64_t enc_key = std::stoull(argv[3], 0, 0); const char* input_file_path = argv[4]; const char* output_file_path = argv[5]; std::vector keys(128, 0); uint64_t* data = reinterpret_cast(keys.data()); data[0] = hash_key; data[1] = enc_key; size_t size = 0; auto input = read_file(input_file_path, size); printf("Reading input file ...\n"); auto output = SimpleFastRC4::encrypt_model(input.get(), size, keys); printf("Encrypting ...\n"); write_file(output_file_path, output); printf("Done.\n"); return 0; } int command_hash(int argc, char** argv) { if (argc != 3) { printf("Invalid hash arguments.\n"); return 1; } const char* input_file_path = argv[2]; size_t len = 0; auto input = read_file(input_file_path, len); rc4::FastHash64 hasher(rc4::key_gen_hash_key()); auto start = static_cast(input.get()); auto ptr = reinterpret_cast(start); while (reinterpret_cast(ptr + 1) <= start + len) { hasher.feed(*ptr); ++ptr; } auto cptr = reinterpret_cast(ptr); if (cptr < start + len) { uint64_t v = 0; std::copy(cptr, start + len, reinterpret_cast(&v)); hasher.feed(v); } printf("%llx\n", static_cast(hasher.get())); return 0; } std::unordered_map commands = { {"encrypt_predefined_rc4", command_encrypt_predefined_rc4}, {"encrypt_rc4", command_encrypt_rc4}, {"encrypt_predefined_sfrc4", command_encrypt_predefined_sfrc4}, {"encrypt_sfrc4", command_encrypt_sfrc4}, {"hash", command_hash}, }; int main(int argc, char** argv) { if (argc == 1) { printf("%s", usage); return 1; } auto it = commands.find(argv[1]); if (it == commands.end()) { printf("Invalid command arguments.\n"); printf("%s", usage); return 1; } return it->second(argc, argv); } // vim: syntax=cpp.doxygen foldmethod=marker foldmarker=f{{{,f}}}