From 40204ca7c8e37564b498585bfb0f86ae026d22ef Mon Sep 17 00:00:00 2001 From: DOSAYGO Development Team Date: Mon, 23 Dec 2024 23:10:29 +0800 Subject: [PATCH 01/22] Fast mining --- docs/app.js | 93 ++++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 82 insertions(+), 11 deletions(-) diff --git a/docs/app.js b/docs/app.js index 9edf9f0..6341bfd 100644 --- a/docs/app.js +++ b/docs/app.js @@ -1,4 +1,6 @@ + const SPLIT = 50; const sleep = ms => new Promise(res => setTimeout(res, ms)); + const nextAnimationFrame = () => new Promise(res => requestAnimationFrame(res)); const STORM_TV = [ [ "e3ea5f8885f7bb16468d08c578f0e7cc15febd31c27e323a79ef87c35756ce1e", "" ], @@ -21,6 +23,7 @@ ]; class HashError extends Error {} + let lastTask; let inHash = false; window.onunhandledrejection = (...x) => { @@ -44,11 +47,22 @@ inHash = true; submission?.preventDefault?.(); submission?.stopPropagation?.(); - const task = submission.type == 'submit' ? submission.submitter.value : 'hash'; - submission.submitter.disabled = true; + const task = submission.submitter ? submission.submitter.value : 'hash'; + if ( submission.submitter ) { + console.log(submission.submitter); + submission.submitter.disabled = true; + } if ( task == 'test' ) { + if ( lastTask == 'mine' ) { + form.input.value = ''; + } + lastTask = task; form.output.value = await testVectors(); } else if ( task == 'hash' ) { + if ( lastTask == 'mine' ) { + form.input.value = ''; + } + lastTask = task; const algo = form.algo.value; const size = parseInt(form.size.value); const seed = BigInt(form.seed.value); @@ -85,27 +99,69 @@ const hashValue = await globalThis[algo](size, seed, input); form.output.value = hashValue; } - } else if ( task == 'mine' ) { + } else if (task === 'mine') { + lastTask = task; const algo = form.algo.value; const size = parseInt(form.size.value); const seed = BigInt(form.seed.value); - submission.submitter.value = 'Mining...'; + submission.submitter.innerText = 'Mining...'; + await nextAnimationFrame(); + const start = Date.now(); let count = 0; const mp = form.mp.value; - while ( !form.output.value.startsWith(mp) ) { - form.input.value += `${currentHash}\n`; - form.output.value = await globalThis[algo](size, seed, form.input.value); + + // Instead of storing a huge string, store a typed array for the input: + let inputBytes = new Uint8Array(); + + // Optionally, if form.input has an initial value, + // convert that to bytes too. + if (form.input.value) { + // If it’s text, you could do your own “text->Uint8Array”: + // (But if you want to allow both text or hex input, handle that too!) + const textEncoder = new TextEncoder(); + inputBytes = textEncoder.encode(form.input.value); + } + + // Now do the iterative mining: + let outputHex = form.output.value; + + while (!outputHex.startsWith(mp)) { + // 1. Convert outputHex -> bytes: + const outputBytes = hexToU8Array(outputHex); + + // 2. Append them to inputBytes + inputBytes = concatU8Arrays(inputBytes, outputBytes); + + // 3. Get next hash + outputHex = await globalThis[algo](size, seed, inputBytes); + form.output.value = outputHex; + count++; + if (count % SPLIT === 0) { + await nextAnimationFrame(); // keep UI responsive + } } + const end = Date.now(); - const duration = end - start; - submission.submitter.value = `Found after ${count} hashes. In ${duration} seconds.`; + const duration = ((end - start)/1000).toFixed(3); + + // If you truly want to see the entire chain, you can decode or represent it here, + // but careful — it could be huge! For demonstration only: + form.input.value = `Found after ${count} hashes in ${duration}s! Final output: ${outputHex}`; + + submission.submitter.innerText = `Found after ${count} hashes. In ${duration} seconds.`; } else { + if ( lastTask == 'mine' ) { + form.input.value = ''; + } + lastTask = task; alert(`Unknown task: ${task}`); } inHash = false; - submission.submitter.disabled = false; + if ( submission.submitter ) { + submission.submitter.disabled = false; + } return false; } catch(e) { console.error(e); @@ -117,8 +173,23 @@ return (typeof window.orientation !== "undefined") || (navigator.userAgent.indexOf('IEMobile') !== -1); }; - async function mine() { + function concatU8Arrays(a, b) { + const c = new Uint8Array(a.length + b.length); + c.set(a, 0); + c.set(b, a.length); + return c; + } + + function hexToU8Array(hex) { + if (hex.length % 2 !== 0) { + throw new Error('Invalid hex string'); + } + const out = new Uint8Array(hex.length / 2); + for (let i = 0; i < hex.length; i += 2) { + out[i >> 1] = parseInt(hex.slice(i, i + 2), 16); + } + return out; } async function testVectors() { From af60a907bed276d8828833d6b058bacacae4c09e Mon Sep 17 00:00:00 2001 From: DOSAYGO Development Team Date: Mon, 23 Dec 2024 23:47:43 +0800 Subject: [PATCH 02/22] Good fun --- docs/app.js | 199 +++++++++++++++++---- docs/index.html | 464 ++++++++++++++++++++++++++++-------------------- 2 files changed, 439 insertions(+), 224 deletions(-) diff --git a/docs/app.js b/docs/app.js index 6341bfd..7be953b 100644 --- a/docs/app.js +++ b/docs/app.js @@ -1,6 +1,11 @@ const SPLIT = 50; const sleep = ms => new Promise(res => setTimeout(res, ms)); const nextAnimationFrame = () => new Promise(res => requestAnimationFrame(res)); + const rapidTask = new Set([ + 'chain', + 'nonceInc', + 'nonceRand', + ]); const STORM_TV = [ [ "e3ea5f8885f7bb16468d08c578f0e7cc15febd31c27e323a79ef87c35756ce1e", "" ], @@ -48,18 +53,26 @@ submission?.preventDefault?.(); submission?.stopPropagation?.(); const task = submission.submitter ? submission.submitter.value : 'hash'; + const hashrateEl = document.getElementById('hashrate'); + if ( submission.submitter ) { - console.log(submission.submitter); submission.submitter.disabled = true; } + + if (rapidTask.has(task)) { + setTimeout(() => { + scrollIntoView(form.fileInput); + }, 50); + } + if ( task == 'test' ) { - if ( lastTask == 'mine' ) { + if (rapidTask.has(lastTask)) { form.input.value = ''; } lastTask = task; form.output.value = await testVectors(); } else if ( task == 'hash' ) { - if ( lastTask == 'mine' ) { + if (rapidTask.has(lastTask)) { form.input.value = ''; } lastTask = task; @@ -99,60 +112,171 @@ const hashValue = await globalThis[algo](size, seed, input); form.output.value = hashValue; } - } else if (task === 'mine') { + } else if (task === 'chain') { + if (rapidTask.has(lastTask)) { + form.input.value = ''; + } lastTask = task; const algo = form.algo.value; const size = parseInt(form.size.value); const seed = BigInt(form.seed.value); - submission.submitter.innerText = 'Mining...'; - await nextAnimationFrame(); + submission.submitter.innerText = 'Chain Mining...'; + + await requestAnimationFrame(() => {}); // just to yield - const start = Date.now(); - let count = 0; const mp = form.mp.value; + let count = 0; + const start = Date.now(); + let lastTime = start; - // Instead of storing a huge string, store a typed array for the input: + // Convert existing input to bytes let inputBytes = new Uint8Array(); - - // Optionally, if form.input has an initial value, - // convert that to bytes too. if (form.input.value) { - // If it’s text, you could do your own “text->Uint8Array”: - // (But if you want to allow both text or hex input, handle that too!) - const textEncoder = new TextEncoder(); - inputBytes = textEncoder.encode(form.input.value); + inputBytes = new TextEncoder().encode(form.input.value); } - // Now do the iterative mining: - let outputHex = form.output.value; + // Start hashing + let outputHex = await globalThis[algo](size, seed, inputBytes); + form.output.value = outputHex; while (!outputHex.startsWith(mp)) { - // 1. Convert outputHex -> bytes: + // Convert outputHex -> bytes const outputBytes = hexToU8Array(outputHex); - - // 2. Append them to inputBytes + // Append inputBytes = concatU8Arrays(inputBytes, outputBytes); - // 3. Get next hash + // Next hash outputHex = await globalThis[algo](size, seed, inputBytes); form.output.value = outputHex; + count++; + + if (count % SPLIT === 0) { + const now = Date.now(); + const elapsed = (now - lastTime) / 1000; + const hps = SPLIT / elapsed; + hashrateEl.innerText = formatHashRate(hps); + lastTime = now; + await nextAnimationFrame(); + } + } + + // Found + form.output.value = outputHex; + // Set input to the final chain (or just the final input bytes in hex, your call): + // For memory reasons, let's just put the final input in hex: + form.input.value = Array.from(inputBytes) + .map((x) => x.toString(16).padStart(2, '0')) + .join(''); + + const end = Date.now(); + const duration = ((end - start) / 1000).toFixed(3); + submission.submitter.innerText = `Found after ${count} hashes in ${duration}s.`; + } else if (task === 'nonceInc') { + if (rapidTask.has(lastTask)) { + form.input.value = ''; + } + lastTask = task; + const algo = form.algo.value; + const size = parseInt(form.size.value); + const seed = BigInt(form.seed.value); + submission.submitter.innerText = 'Nonce Inc...'; + await nextAnimationFrame(); + + const mp = form.mp.value; + const baseInput = form.input.value || ""; + + let nonce = 0n; + let count = 0; + const start = Date.now(); + let lastTime = start; + let outputHex = ""; + while (true) { + const thisInput = baseInput + nonce.toString(); + outputHex = await globalThis[algo](size, seed, thisInput); count++; + + if (outputHex.startsWith(mp)) { + form.output.value = outputHex; + // put final winning input in the form input + form.input.value = thisInput; + break; + } + nonce++; + if (count % SPLIT === 0) { - await nextAnimationFrame(); // keep UI responsive + const now = Date.now(); + const elapsed = (now - lastTime) / 1000; + const hps = SPLIT / elapsed; + hashrateEl.innerText = formatHashRate(hps); + lastTime = now; + // Show intermediate output + form.output.value = outputHex; + await nextAnimationFrame(); } } const end = Date.now(); - const duration = ((end - start)/1000).toFixed(3); + const duration = ((end - start) / 1000).toFixed(3); + submission.submitter.innerText = `Found after ${count} hashes in ${duration}s. (Nonce = ${nonce - 1n})`; + } else if (task === 'nonceRand') { + if (rapidTask.has(lastTask)) { + form.input.value = ''; + } + lastTask = task; + const algo = form.algo.value; + const size = parseInt(form.size.value); + const seed = BigInt(form.seed.value); + submission.submitter.innerText = 'Nonce Rand...'; + await nextAnimationFrame(); + + const mp = form.mp.value; + const baseInput = form.input.value || ""; + + let count = 0; + const start = Date.now(); + let lastTime = start; + let outputHex = ""; + + // Helper to get random bytes as a hex string + function randomHex(len = 8) { + const buf = new Uint8Array(len); + crypto.getRandomValues(buf); + return Array.from(buf) + .map((b) => b.toString(16).padStart(2, '0')) + .join(''); + } + + while (true) { + const randPart = randomHex(8); // 8 bytes => 16 hex chars + const thisInput = baseInput + randPart; + outputHex = await globalThis[algo](size, seed, thisInput); + count++; + + if (outputHex.startsWith(mp)) { + form.output.value = outputHex; + // put final input in the form input + form.input.value = thisInput; + break; + } - // If you truly want to see the entire chain, you can decode or represent it here, - // but careful — it could be huge! For demonstration only: - form.input.value = `Found after ${count} hashes in ${duration}s! Final output: ${outputHex}`; + if (count % SPLIT === 0) { + const now = Date.now(); + const elapsed = (now - lastTime) / 1000; + const hps = SPLIT / elapsed; + hashrateEl.innerText = formatHashRate(hps); + lastTime = now; + // show intermediate + form.output.value = outputHex; + await nextAnimationFrame(); + } + } - submission.submitter.innerText = `Found after ${count} hashes. In ${duration} seconds.`; + const end = Date.now(); + const duration = ((end - start) / 1000).toFixed(3); + submission.submitter.innerText = `Found after ${count} hashes in ${duration}s. (Random mode)`; } else { - if ( lastTask == 'mine' ) { + if (rapidTask.has(lastTask)) { form.input.value = ''; } lastTask = task; @@ -173,9 +297,18 @@ return (typeof window.orientation !== "undefined") || (navigator.userAgent.indexOf('IEMobile') !== -1); }; + function formatHashRate(hps) { + if (hps >= 1e6) { + return (hps / 1e6).toFixed(2) + ' MH/s'; + } else if (hps >= 1e3) { + return (hps / 1e3).toFixed(2) + ' KH/s'; + } else { + return hps.toFixed(2) + ' H/s'; + } + } function concatU8Arrays(a, b) { - const c = new Uint8Array(a.length + b.length); + const c = new Uint8Array(a.length + b.length + 1); c.set(a, 0); c.set(b, a.length); return c; @@ -192,6 +325,12 @@ return out; } + function scrollIntoView(el) { + if (el) { + el.scrollIntoView({ behavior: 'smooth', block: 'start' }); + } + } + async function testVectors() { let comment; let s = ''; diff --git a/docs/index.html b/docs/index.html index 65d192a..34446e1 100644 --- a/docs/index.html +++ b/docs/index.html @@ -1,196 +1,272 @@ - -Rain Hashes - - - - - - - - -
-
- - -
-
- - -
- -
- - -
-
- - -
-
- - -
- - -
- - - - - -

Get the code

-

Rainstorm Crypto Note (PDF)

-

Rainstorm Formal Spec (PDF)

+ + + Rain Hashes + + + + + + + + + + + + +
+
+ + +
+ +
+ + +
+ + +
+ +
+
0 H/s
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ + + + +
+ + +
+ + +
+ + + +
+
+ + + +

Get the code

+

Rainstorm Crypto Note (PDF)

+

Rainstorm Formal Spec (PDF)

+ + From d9f449a9ea935279b232af87906c64fa1c9a7d31 Mon Sep 17 00:00:00 2001 From: DOSAYGO Development Team Date: Thu, 26 Dec 2024 14:36:37 +0800 Subject: [PATCH 03/22] works fairly well --- src/common.h | 2 +- src/rainsum.cpp | 376 +++++++++++++++++++++++++++++++++++++----------- src/tool.h | 162 +++++++++++++-------- 3 files changed, 401 insertions(+), 139 deletions(-) diff --git a/src/common.h b/src/common.h index 80e1825..2023d30 100644 --- a/src/common.h +++ b/src/common.h @@ -1,6 +1,6 @@ #pragma once -#define __ENDIAN_H_VERSION__ "1.0.1" +#define __ENDIAN_H_VERSION__ "1.3.0" #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ constexpr bool bswap = false; diff --git a/src/rainsum.cpp b/src/rainsum.cpp index c28416d..82a0f1e 100644 --- a/src/rainsum.cpp +++ b/src/rainsum.cpp @@ -4,11 +4,39 @@ #include #include #include +#include +#include +#include + #include "tool.h" +// ------------------------------------------------------------------ +// Helper functions for mining +// ------------------------------------------------------------------ +static std::vector hexToBytes(const std::string& hexstr) { + if (hexstr.size() % 2 != 0) { + throw std::runtime_error("Hex prefix must have even length."); + } + std::vector bytes(hexstr.size() / 2); + for (size_t i = 0; i < bytes.size(); ++i) { + unsigned int val = 0; + std::stringstream ss; + ss << std::hex << hexstr.substr(i * 2, 2); + ss >> val; + bytes[i] = static_cast(val); + } + return bytes; +} + +inline bool hasPrefix(const std::vector& hash_output, const std::vector& prefix_bytes) { + if (prefix_bytes.size() > hash_output.size()) return false; + return std::equal(prefix_bytes.begin(), prefix_bytes.end(), hash_output.begin()); +} + template -void invokeHash(HashAlgorithm algot, uint64_t seed, std::vector& buffer, std::vector& temp_out, int hash_size) { - if(algot == HashAlgorithm::Rainbow) { +void invokeHash(HashAlgorithm algot, uint64_t seed, std::vector& buffer, + std::vector& temp_out, int hash_size) { + if (algot == HashAlgorithm::Rainbow) { switch(hash_size) { case 64: rainbow::rainbow<64, bswap>(buffer.data(), buffer.size(), seed, temp_out.data()); @@ -22,7 +50,7 @@ void invokeHash(HashAlgorithm algot, uint64_t seed, std::vector& buffer default: throw std::runtime_error("Invalid hash_size for rainbow"); } - } else if(algot == HashAlgorithm::Rainstorm) { + } else if (algot == HashAlgorithm::Rainstorm) { switch(hash_size) { case 64: rainstorm::rainstorm<64, bswap>(buffer.data(), buffer.size(), seed, temp_out.data()); @@ -44,26 +72,177 @@ void invokeHash(HashAlgorithm algot, uint64_t seed, std::vector& buffer } } -void hashBuffer(Mode mode, HashAlgorithm algot, std::vector& buffer, uint64_t seed, uint64_t output_length, std::ostream& outstream, uint32_t hash_size) { +// ------------------------------------------------------------------ +// Mining Implementations +// ------------------------------------------------------------------ +static void chainAppend(std::vector& inputBuffer, const std::vector& hash_output) { + // Just append the new hash to the existing buffer + inputBuffer.insert(inputBuffer.end(), hash_output.begin(), hash_output.end()); +} + +void mineChain(HashAlgorithm algot, uint64_t seed, uint32_t hash_size, const std::vector& prefix_bytes) { + std::vector inputBuffer; + std::vector hash_output(hash_size / 8); + + uint64_t iterationCount = 0; + auto start_time = std::chrono::steady_clock::now(); + + while (true) { + iterationCount++; + invokeHash(algot, seed, inputBuffer, hash_output, hash_size); + + if (hasPrefix(hash_output, prefix_bytes)) { + auto end_time = std::chrono::steady_clock::now(); + double elapsed = std::chrono::duration(end_time - start_time).count(); + double hps = iterationCount / elapsed; + + std::cerr << "\n[mineChain] Found after " << iterationCount << " iterations, ~" + << hps << " H/s\n"; + + // Print final hash to stdout + std::cout << "Final Hash: "; + for (auto b : hash_output) { + std::cout << std::hex << std::setw(2) << std::setfill('0') << static_cast(b); + } + std::cout << std::dec << std::endl; + return; + } + chainAppend(inputBuffer, hash_output); + + if (iterationCount % 1000 == 0) { + auto now = std::chrono::steady_clock::now(); + double elapsed = std::chrono::duration(now - start_time).count(); + double hps = iterationCount / elapsed; + std::cerr << "\r[mineChain] " << iterationCount << " iterations, ~" + << hps << " H/s " << std::flush; + } + } +} + +void mineNonceInc(HashAlgorithm algot, uint64_t seed, uint32_t hash_size, + const std::vector& prefix_bytes, + const std::string& baseInput) { + std::vector hash_output(hash_size / 8); + uint64_t iterationCount = 0; + uint64_t nonce = 0; + + auto start_time = std::chrono::steady_clock::now(); + + while (true) { + iterationCount++; + + // Build input = baseInput + numeric nonce as text + std::stringstream ss; + ss << baseInput << nonce; + std::string inputStr = ss.str(); + + // Convert to bytes + std::vector buffer(inputStr.begin(), inputStr.end()); + invokeHash(algot, seed, buffer, hash_output, hash_size); + + if (hasPrefix(hash_output, prefix_bytes)) { + auto end_time = std::chrono::steady_clock::now(); + double elapsed = std::chrono::duration(end_time - start_time).count(); + double hps = iterationCount / elapsed; + + std::cerr << "\n[mineNonceInc] Found after " << iterationCount + << " iterations, ~" << hps << " H/s\n" + << "Winning nonce: " << nonce << "\n"; + + std::cout << "Final Hash: "; + for (auto b : hash_output) { + std::cout << std::hex << std::setw(2) << std::setfill('0') << static_cast(b); + } + std::cout << std::dec << "\n"; + return; + } + + if (iterationCount % 1000 == 0) { + auto now = std::chrono::steady_clock::now(); + double elapsed = std::chrono::duration(now - start_time).count(); + double hps = iterationCount / elapsed; + std::cerr << "\r[mineNonceInc] " << iterationCount << " iterations, ~" + << hps << " H/s " << std::flush; + } + + nonce++; + } +} + +void mineNonceRand(HashAlgorithm algot, uint64_t seed, uint32_t hash_size, + const std::vector& prefix_bytes, + const std::string& baseInput) { + std::vector hash_output(hash_size / 8); + uint64_t iterationCount = 0; + + static std::mt19937_64 rng(std::random_device{}()); + std::uniform_int_distribution dist(0, 255); + + auto start_time = std::chrono::steady_clock::now(); + + while (true) { + iterationCount++; + + // Build input = baseInput + random bytes + std::vector buffer(baseInput.begin(), baseInput.end()); + // e.g. 16 random bytes appended + for (int i = 0; i < 16; i++) { + buffer.push_back(dist(rng)); + } + + invokeHash(algot, seed, buffer, hash_output, hash_size); + + if (hasPrefix(hash_output, prefix_bytes)) { + auto end_time = std::chrono::steady_clock::now(); + double elapsed = std::chrono::duration(end_time - start_time).count(); + double hps = iterationCount / elapsed; + + std::cerr << "\n[mineNonceRand] Found after " << iterationCount + << " iterations, ~" << hps << " H/s\n"; + + std::cout << "Final Hash: "; + for (auto b : hash_output) { + std::cout << std::hex << std::setw(2) << std::setfill('0') << static_cast(b); + } + std::cout << std::dec << "\n"; + return; + } + + if (iterationCount % 1000 == 0) { + auto now = std::chrono::steady_clock::now(); + double elapsed = std::chrono::duration(now - start_time).count(); + double hps = iterationCount / elapsed; + std::cerr << "\r[mineNonceRand] " << iterationCount << " iterations, ~" + << hps << " H/s " << std::flush; + } + } +} + +// ------------------------------------------------------------------ +// Original hashBuffer +// ------------------------------------------------------------------ +void hashBuffer(Mode mode, HashAlgorithm algot, std::vector& buffer, + uint64_t seed, uint64_t output_length, std::ostream& outstream, + uint32_t hash_size) { int byte_size = hash_size / 8; std::vector temp_out(byte_size); - - if(mode == Mode::Digest) { + + if (mode == Mode::Digest) { invokeHash(algot, seed, buffer, temp_out, hash_size); - + for (const auto& byte : temp_out) { outstream << std::hex << std::setw(2) << std::setfill('0') << static_cast(byte); } } - else if(mode == Mode::Stream) { - while(output_length > 0) { + else if (mode == Mode::Stream) { + while (output_length > 0) { invokeHash(algot, seed, buffer, temp_out, hash_size); uint64_t chunk_size = std::min(output_length, (uint64_t)byte_size); outstream.write(reinterpret_cast(temp_out.data()), chunk_size); output_length -= chunk_size; - if(output_length == 0) { + if (output_length == 0) { break; } @@ -73,15 +252,21 @@ void hashBuffer(Mode mode, HashAlgorithm algot, std::vector& buffer, ui } } -void hashAnything(Mode mode, HashAlgorithm algot, const std::string& inpath, std::ostream& outstream, uint32_t size, bool use_test_vectors, uint64_t seed, uint64_t output_length) { +// ------------------------------------------------------------------ +// Original hashAnything +// ------------------------------------------------------------------ +void hashAnything(Mode mode, HashAlgorithm algot, const std::string& inpath, + std::ostream& outstream, uint32_t size, bool use_test_vectors, + uint64_t seed, uint64_t output_length) { + std::vector buffer; std::vector chunk(CHUNK_SIZE); if (use_test_vectors) { for (const auto& test_vector : test_vectors) { - buffer.assign(test_vector.begin(), test_vector.end()); - hashBuffer(mode, algot, buffer, seed, output_length, outstream, size); - outstream << ' ' << '"' << test_vector << '"' << '\n'; + buffer.assign(test_vector.begin(), test_vector.end()); + hashBuffer(mode, algot, buffer, seed, output_length, outstream, size); + outstream << ' ' << '"' << test_vector << '"' << '\n'; } } else { std::istream* in_stream = nullptr; @@ -90,61 +275,58 @@ void hashAnything(Mode mode, HashAlgorithm algot, const std::string& inpath, std uint64_t input_length = 0; if (!inpath.empty()) { - infile.open(inpath, std::ios::binary); - if (infile.fail()) { - throw std::runtime_error("Cannot open file for reading: " + inpath); - } - in_stream = &infile; - input_length = getFileSize(inpath); - - std::unique_ptr state; - if(algot == HashAlgorithm::Rainbow) { - state = std::make_unique(rainbow::HashState::initialize(seed, input_length, size)); - } else if(algot == HashAlgorithm::Rainstorm) { - state = std::make_unique(rainstorm::HashState::initialize(seed, input_length, size)); - } else { - throw std::runtime_error("Invalid algorithm: " + hashAlgoToString(algot)); - } + infile.open(inpath, std::ios::binary); + if (infile.fail()) { + throw std::runtime_error("Cannot open file for reading: " + inpath); + } + in_stream = &infile; + input_length = getFileSize(inpath); + + std::unique_ptr state; + if (algot == HashAlgorithm::Rainbow) { + state = std::make_unique( + rainbow::HashState::initialize(seed, input_length, size)); + } else if (algot == HashAlgorithm::Rainstorm) { + state = std::make_unique( + rainstorm::HashState::initialize(seed, input_length, size)); + } else { + throw std::runtime_error("Invalid algorithm: " + hashAlgoToString(algot)); + } - // Stream the file in 16384-byte chunks - while (*in_stream) { - in_stream->read(reinterpret_cast(chunk.data()), CHUNK_SIZE); - if (in_stream->fail() && !in_stream->eof()) { - throw std::runtime_error("Input file could not be read after " + std::to_string(state->len) + " bytes processed."); - } - std::streamsize bytes_read = in_stream->gcount(); - if (bytes_read > 0 || input_length == 0) { - // Update the state with the new chunk of data - state->update(chunk.data(), bytes_read); - } + // Stream the file + while (*in_stream) { + in_stream->read(reinterpret_cast(chunk.data()), CHUNK_SIZE); + if (in_stream->fail() && !in_stream->eof()) { + throw std::runtime_error( + "Input file could not be read after " + + std::to_string(state->len) + " bytes processed."); } - - // Close the file if it's open - if (infile.is_open()) { - infile.close(); + std::streamsize bytes_read = in_stream->gcount(); + if (bytes_read > 0 || input_length == 0) { + state->update(chunk.data(), bytes_read); } + } - // Finalize the hash - std::vector output(output_length); - state->finalize(output.data()); - - //std::cout << "Length : " << state.len << std::endl; - //std::cout << "File length : " << input_length << std::endl; - + if (infile.is_open()) { + infile.close(); + } - // Write the output to the outstream + // Finalize + std::vector output(output_length); + state->finalize(output.data()); - if (mode == Mode::Digest) { - for (const auto& byte : output) { - outstream << std::hex << std::setw(2) << std::setfill('0') << static_cast(byte); - } - outstream << ' ' << (inpath.empty() ? "stdin" : inpath) << '\n'; - } else { - outstream.write(reinterpret_cast(output.data()), output_length); + if (mode == Mode::Digest) { + for (const auto& byte : output) { + outstream << std::hex << std::setw(2) << std::setfill('0') << static_cast(byte); } - } else { + outstream << ' ' << (inpath.empty() ? "stdin" : inpath) << '\n'; + } else { + outstream.write(reinterpret_cast(output.data()), output_length); + } + } + else { + // Read from stdin fully in_stream = &getInputStream(); - // Read all data into the buffer buffer = std::vector(std::istreambuf_iterator(*in_stream), {}); input_length = buffer.size(); hashBuffer(mode, algot, buffer, seed, output_length, outstream, size); @@ -153,6 +335,9 @@ void hashAnything(Mode mode, HashAlgorithm algot, const std::string& inpath, std } } +// ------------------------------------------------------------------ +// Main +// ------------------------------------------------------------------ int main(int argc, char** argv) { try { cxxopts::Options options("rainsum", "Calculate a Rainbow or Rainstorm hash."); @@ -165,8 +350,11 @@ int main(int argc, char** argv) { ("s,size", "Specify the size of the hash", cxxopts::value()->default_value("256")) ("o,output-file", "Output file for the hash", cxxopts::value()->default_value("/dev/stdout")) ("t,test-vectors", "Calculate the hash of the standard test vectors", cxxopts::value()->default_value("false")) - ("l,output-length", "Output length in hashes", cxxopts::value()->default_value("1000000")) + ("l,output-length", "Output length in hashes (stream mode only)", cxxopts::value()->default_value("1000000")) ("seed", "Seed value", seed_option) + // The new mining options: + ("mine-mode", "Mining mode: chain, nonceInc, nonceRand", cxxopts::value()->default_value("None")) + ("match-prefix", "Hex prefix to match in mining tasks", cxxopts::value()->default_value("")) ("h,help", "Print usage"); auto result = options.parse(argc, argv); @@ -180,38 +368,37 @@ int main(int argc, char** argv) { return 0; } + // Convert seed (either numeric or hash string) std::string seed_str = result["seed"].as(); uint64_t seed; - // If the seed_str can be converted to uint64_t, use it as a number; otherwise, hash it (with rainstorm, seed 0, 64-bit) if (!(std::istringstream(seed_str) >> seed)) { - seed = hash_string_to_64_bit(seed_str); + seed = hash_string_to_64_bit(seed_str); } - //std::cout << "Seed : " << seed << std::endl; Mode mode = result["mode"].as(); - // Check for output-length in Digest mode after parsing all options + // If user attempts --output-length in digest mode: if (mode == Mode::Digest && result.count("output-length")) { std::cerr << "Error: --output-length is not allowed in digest mode.\n"; return 1; } std::string algorithm = result["algorithm"].as(); - HashAlgorithm algot = getHashAlgorithm(algorithm); uint32_t size = result["size"].as(); - if ( algot == HashAlgorithm::Rainbow ) { + // Validate sizes + if (algot == HashAlgorithm::Rainbow) { switch (size) { case 64: case 128: case 256: break; default: - throw std::runtime_error("Invalid hash_size for rainbow. Allowed sizes: 64, 128, 256"); + throw std::runtime_error("Invalid hash_size for rainbow. Allowed: 64, 128, 256"); } - } else if ( algot == HashAlgorithm::Rainstorm ) { + } else if (algot == HashAlgorithm::Rainstorm) { switch (size) { case 64: case 128: @@ -219,28 +406,56 @@ int main(int argc, char** argv) { case 512: break; default: - throw std::runtime_error("Invalid hash_size for rainstorm. Allowed sizes: 64, 128, 256, 512"); + throw std::runtime_error("Invalid hash_size for rainstorm. Allowed: 64,128,256,512"); } } + bool use_test_vectors = result["test-vectors"].as(); uint64_t output_length = result["output-length"].as(); - - if ( mode == Mode::Digest ) { + if (mode == Mode::Digest) { + // In digest mode, the final output is always exactly size/8 output_length = size / 8; } else { + // In stream mode, output_length is multiplied by the hash size output_length *= size; } + // Extract mining-related args + MineMode mine_mode = result["mine-mode"].as(); + std::string prefixHex = result["match-prefix"].as(); + + // Check unmatched for potential filename or base input + std::string baseInput; std::string inpath; + if (!result.unmatched().empty()) { + baseInput = result.unmatched().front(); + inpath = baseInput; // up to you whether you treat it as file vs base input + } - // Check if unmatched arguments exist (indicating there was a filename provided) - if(!result.unmatched().empty()) { - inpath = result.unmatched().front(); - } else { - // No filename provided, read from stdin + // If user selected a mining mode: + if (mine_mode != MineMode::None) { + if (prefixHex.empty()) { + throw std::runtime_error("You must specify --match-prefix for mining modes."); + } + std::vector prefixBytes = hexToBytes(prefixHex); + + switch (mine_mode) { + case MineMode::Chain: + mineChain(algot, seed, size, prefixBytes); + return 0; + case MineMode::NonceInc: + mineNonceInc(algot, seed, size, prefixBytes, baseInput); + return 0; + case MineMode::NonceRand: + mineNonceRand(algot, seed, size, prefixBytes, baseInput); + return 0; + default: + throw std::runtime_error("Unknown mining mode encountered."); + } } + // No mining: proceed with normal hashing std::string outpath = result["output-file"].as(); if (outpath == "/dev/stdout") { @@ -261,13 +476,14 @@ int main(int argc, char** argv) { } else { hashAnything(Mode::Stream, algot, inpath, outfile, size, use_test_vectors, seed, output_length); } - outfile.close(); } return 0; - } catch (const std::runtime_error& e) { + } + catch (const std::runtime_error& e) { std::cerr << "An error occurred: " << e.what() << std::endl; + return 1; } } diff --git a/src/tool.h b/src/tool.h index 5b7d3c7..84dbc37 100644 --- a/src/tool.h +++ b/src/tool.h @@ -1,3 +1,5 @@ +#pragma once + #include #include @@ -6,25 +8,32 @@ #include #endif - #include "rainbow.cpp" #include "rainstorm.cpp" #include "cxxopts.hpp" #include "common.h" -#define VERSION "1.2.2" +#define VERSION "1.3.0" enum class Mode { Digest, Stream }; +// Mining mode enum +enum class MineMode { + None, + Chain, + NonceInc, + NonceRand +}; + std::string modeToString(const Mode& mode) { - switch(mode) { - case Mode::Digest: return "Digest"; - case Mode::Stream: return "Stream"; - default: throw std::runtime_error("Unknown hash mode (expected digest or stream)"); - } + switch(mode) { + case Mode::Digest: return "Digest"; + case Mode::Stream: return "Stream"; + default: throw std::runtime_error("Unknown hash mode (expected digest or stream)"); + } } std::istream& operator>>(std::istream& in, Mode& mode) { @@ -39,55 +48,87 @@ std::istream& operator>>(std::istream& in, Mode& mode) { return in; } +// ------------------------------------------------------------------ +// Mining Mode Operator>>(std::istream&, MineMode&) Implementation +// (If you haven't placed this in tool.h, it can go here) +// ------------------------------------------------------------------ +std::istream& operator>>(std::istream& in, MineMode& mode) { + std::string token; + in >> token; + if (token == "chain") { + mode = MineMode::Chain; + } else if (token == "nonceInc") { + mode = MineMode::NonceInc; + } else if (token == "nonceRand") { + mode = MineMode::NonceRand; + } else { + mode = MineMode::None; + } + return in; +} + +// Stream retrieval (stdin vs file) std::istream& getInputStream() { - #ifdef _WIN32 - // On Windows, use std::cin - return std::cin; - #else - // On Unix-based systems, use std::ifstream with /dev/stdin - static std::ifstream in("/dev/stdin"); - return in; - #endif +#ifdef _WIN32 + // On Windows, use std::cin + return std::cin; +#else + // On Unix-based systems, use std::ifstream with /dev/stdin + static std::ifstream in("/dev/stdin"); + return in; +#endif } enum class HashAlgorithm { - Rainbow, - Rainstorm, - Unknown + Rainbow, + Rainstorm, + Unknown }; std::string hashAlgoToString(const HashAlgorithm& algo) { - switch(algo) { - case HashAlgorithm::Rainbow: return "Rainbow"; - case HashAlgorithm::Rainstorm: return "Rainstorm"; - default: throw std::runtime_error("Unknown hash algorithm value (expected rainbow or rainstorm)"); - } + switch(algo) { + case HashAlgorithm::Rainbow: return "Rainbow"; + case HashAlgorithm::Rainstorm: return "Rainstorm"; + default: + throw std::runtime_error("Unknown hash algorithm value (expected rainbow or rainstorm)"); + } } - +// Convert string -> HashAlgorithm HashAlgorithm getHashAlgorithm(const std::string& algorithm) { - if (algorithm == "rainbow" || algorithm == "bow") { - return HashAlgorithm::Rainbow; - } else if (algorithm == "rainstorm" || algorithm == "storm") { - return HashAlgorithm::Rainstorm; - } else { - return HashAlgorithm::Unknown; - } + if (algorithm == "rainbow" || algorithm == "bow") { + return HashAlgorithm::Rainbow; + } else if (algorithm == "rainstorm" || algorithm == "storm") { + return HashAlgorithm::Rainstorm; + } else { + return HashAlgorithm::Unknown; + } } -// Prototype of functions +// Prototypes void usage(); -void hashBuffer(Mode mode, HashAlgorithm algot, std::vector& buffer, uint64_t seed, uint64_t output_length, std::ostream& outstream, uint32_t hash_size); -void hashAnything(Mode mode, HashAlgorithm algot , const std::string& inpath, const std::string& outpath, uint32_t size, bool use_test_vectors, uint64_t seed, uint64_t output_length); + +void hashBuffer(Mode mode, HashAlgorithm algot, + std::vector& buffer, uint64_t seed, + uint64_t output_length, std::ostream& outstream, + uint32_t hash_size); + +void hashAnything(Mode mode, HashAlgorithm algot, + const std::string& inpath, std::ostream& outstream, + uint32_t size, bool use_test_vectors, + uint64_t seed, uint64_t output_length); + std::string generate_filename(const std::string& filename); + uint64_t hash_string_to_64_bit(const std::string& seed_str); +// For cxxopts: getFileSize usage uint64_t getFileSize(const std::string& filename) { - struct stat st; - if(stat(filename.c_str(), &st) != 0) { - return 0; // You may want to handle this error differently - } - return st.st_size; + struct stat st; + if(stat(filename.c_str(), &st) != 0) { + return 0; // You may want to handle this error differently + } + return st.st_size; } #ifdef USE_FILESYSTEM @@ -102,7 +143,8 @@ std::string generate_filename(const std::string& filename) { // Handle filename collision int counter = 1; while (std::filesystem::exists(new_filename)) { - new_filename = p.stem().string() + timestamp + "-" + std::to_string(counter++) + p.extension().string(); + new_filename = p.stem().string() + timestamp + "-" + std::to_string(counter++) + + p.extension().string(); } } else { new_filename = filename; @@ -110,21 +152,21 @@ std::string generate_filename(const std::string& filename) { return new_filename; } - #else -// If filesystem isn't available, just return the filename as it is +// If filesystem isn't available, just return the filename as is std::string generate_filename(const std::string& filename) { return filename; } #endif uint64_t hash_string_to_64_bit(const std::string& seed_str) { - std::vector buffer(seed_str.begin(), seed_str.end()); - std::vector hash_output(8); // 64 bits = 8 bytes - rainstorm::rainstorm<64, bswap>(buffer.data(), buffer.size(), 0, hash_output.data()); // assuming bswap is defined elsewhere - uint64_t seed = 0; - std::memcpy(&seed, hash_output.data(), 8); - return seed; + std::vector buffer(seed_str.begin(), seed_str.end()); + std::vector hash_output(8); // 64 bits = 8 bytes + // We'll use 64-bit rainstorm for string -> seed + rainstorm::rainstorm<64, bswap>(buffer.data(), buffer.size(), 0, hash_output.data()); + uint64_t seed = 0; + std::memcpy(&seed, hash_output.data(), 8); + return seed; } void usage() { @@ -132,7 +174,7 @@ void usage() { << "Calculate a Rainbow or Rainstorm hash.\n\n" << "Options:\n" << " -m, --mode [digest|stream] Specifies the mode, where:\n" - << " digest mode (the default) gives a fixed length hash in hex, or\n" + << " digest mode (the default) gives a fixed length hash in hex,\n" << " stream mode gives a variable length binary feedback output\n" << " -a, --algorithm [bow|storm] Specify the hash algorithm to use. Default: storm\n" << " -s, --size [64-256|64-512] Specify the bit size of the hash. Default: 256\n" @@ -141,15 +183,19 @@ void usage() { << " -l, --output-length HASHES Set the output length in hash iterations (stream only)\n" << " -v, --version Print out the version\n" << " --seed Seed value (64-bit number or string). If string is used,\n" - << " it is hashed with Rainstorm to a 64-bit number\n"; + << " it is hashed with Rainstorm to a 64-bit number\n" + << " --mine-mode [chain|nonceInc|nonceRand] Perform 'mining' tasks until prefix is matched\n" + << " --match-prefix Hex prefix to match for mining tasks\n"; } -// test vectors -std::vector test_vectors = {"", - "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789", - "The quick brown fox jumps over the lazy dog", - "The quick brown fox jumps over the lazy cog", - "The quick brown fox jumps over the lazy dog.", - "After the rainstorm comes the rainbow.", - std::string(64, '@')}; +// Standard test vectors +std::vector test_vectors = { + "", + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789", + "The quick brown fox jumps over the lazy dog", + "The quick brown fox jumps over the lazy cog", + "The quick brown fox jumps over the lazy dog.", + "After the rainstorm comes the rainbow.", + std::string(64, '@') +}; From e0da489f695c20b59d940a724ca9a45eba73edfd Mon Sep 17 00:00:00 2001 From: DOSAYGO Development Team Date: Fri, 27 Dec 2024 01:30:17 +0800 Subject: [PATCH 04/22] Proof of concept block cipher based on hash mining --- HITHERE.txt | 9 + HITHERE.txt.rc | Bin 0 -> 144 bytes HITHERE.txt.rc.dec | 1 + src/rainsum.cpp | 411 ++++++++++++++++++++++++++++++++++++++------- src/tool.h | 47 ++++-- 5 files changed, 388 insertions(+), 80 deletions(-) create mode 100644 HITHERE.txt create mode 100644 HITHERE.txt.rc create mode 100644 HITHERE.txt.rc.dec diff --git a/HITHERE.txt b/HITHERE.txt new file mode 100644 index 0000000..b232be5 --- /dev/null +++ b/HITHERE.txt @@ -0,0 +1,9 @@ +Hi There + +I am awesome + +I am Cris + +I love LOVE + + diff --git a/HITHERE.txt.rc b/HITHERE.txt.rc new file mode 100644 index 0000000000000000000000000000000000000000..d8fd903cb777d3868ee88cc7410f7a0263ca7ac5 GIT binary patch literal 144 zcmV;B0B`>>000000002=tze=MeIkYCQ$haUPK=u+1n<+`U%hm)Op!ghqV0>S&Qsnl z$t)d)lkuI)ZrG*Nxh!=cv*B*ojp?;dVY>zldXsEm+Fee|joLu*EWxmq&nf6NsV5w; y*}fsc%aP|6JjcOLeWLu|srv0Y(%*0t@WArT1m>k>m%XoNOsZd0q1&ox4OvW7YfKve literal 0 HcmV?d00001 diff --git a/HITHERE.txt.rc.dec b/HITHERE.txt.rc.dec new file mode 100644 index 0000000..39d1944 --- /dev/null +++ b/HITHERE.txt.rc.dec @@ -0,0 +1 @@ +߅g+vIg!! !a7Hv[xuwBx \ No newline at end of file diff --git a/src/rainsum.cpp b/src/rainsum.cpp index 82a0f1e..43f83cf 100644 --- a/src/rainsum.cpp +++ b/src/rainsum.cpp @@ -1,18 +1,26 @@ #include #include -#include #include #include +#include +#include +#include #include #include #include #include +#include +#include +#include +#include + #include "tool.h" // ------------------------------------------------------------------ // Helper functions for mining // ------------------------------------------------------------------ +/* static std::vector hexToBytes(const std::string& hexstr) { if (hexstr.size() % 2 != 0) { throw std::runtime_error("Hex prefix must have even length."); @@ -27,6 +35,7 @@ static std::vector hexToBytes(const std::string& hexstr) { } return bytes; } +*/ inline bool hasPrefix(const std::vector& hash_output, const std::vector& prefix_bytes) { if (prefix_bytes.size() > hash_output.size()) return false; @@ -335,30 +344,277 @@ void hashAnything(Mode mode, HashAlgorithm algot, const std::string& inpath, } } + // ------------------------------------------------------------------ -// Main +// Helper for password (key) prompt - disabling echo on POSIX systems // ------------------------------------------------------------------ +#ifdef _WIN32 +static std::string promptForKey(const std::string &prompt) { + std::cerr << prompt; + std::string key; + std::getline(std::cin, key); + return key; +} +#else +#include +#include +static std::string promptForKey(const std::string &prompt) { + std::cerr << prompt; + // Disable echo + termios oldt; + tcgetattr(STDIN_FILENO, &oldt); + termios noEcho = oldt; + noEcho.c_lflag &= ~ECHO; + tcsetattr(STDIN_FILENO, TCSANOW, &noEcho); + + std::string key; + std::getline(std::cin, key); + + // Restore echo + tcsetattr(STDIN_FILENO, TCSANOW, &oldt); + std::cerr << std::endl; + return key; +} +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "tool.h" // for invokeHash, etc. + +static void puzzleEncryptFile( + const std::string &inFilename, + const std::string &outFilename, + const std::string &key, + HashAlgorithm algot, + uint32_t hash_size, + uint64_t seed, + size_t blockSize +) { + // 1) Read input file + std::ifstream fin(inFilename, std::ios::binary); + if (!fin.is_open()) { + throw std::runtime_error("Cannot open input file: " + inFilename); + } + std::vector plainData((std::istreambuf_iterator(fin)), + (std::istreambuf_iterator())); + fin.close(); + + // 2) Prepare output + std::ofstream fout(outFilename, std::ios::binary); + if (!fout.is_open()) { + throw std::runtime_error("Cannot open output file: " + outFilename); + } + + // Write 8-byte original size + uint64_t originalSize = plainData.size(); + fout.write(reinterpret_cast(&originalSize), sizeof(originalSize)); + + // 3) Partition into blocks + size_t totalBlocks = (plainData.size() + blockSize - 1) / blockSize; + std::vector hashOut(hash_size / 8); + std::vector keyBuf(key.begin(), key.end()); + + // Use a random 64-bit generator + std::mt19937_64 rng(std::random_device{}()); + std::uniform_int_distribution dist; // full 64-bit range + + // Increase MAX_TRIES significantly for 3+ byte blocks + const uint64_t MAX_TRIES = 10'000'000'000; + size_t offset = 0; + + auto startTime = std::chrono::steady_clock::now(); + + for (size_t blockIndex = 0; blockIndex < totalBlocks; blockIndex++) { + size_t thisBlockSize = std::min(blockSize, plainData.size() - offset); + std::vector block( + plainData.begin() + offset, + plainData.begin() + offset + thisBlockSize + ); + offset += thisBlockSize; + + bool found = false; + uint64_t chosenNonce = 0; + + for (uint64_t tries = 1; tries <= MAX_TRIES; tries++) { + uint64_t candidateNonce = dist(rng); + + // Build trial = key || candidateNonce + std::vector trial(keyBuf); + trial.reserve(keyBuf.size() + 8); // small optimization + for (int i = 0; i < 8; i++) { + trial.push_back(static_cast((candidateNonce >> (8 * i)) & 0xFF)); + } + + // Hash it + invokeHash(algot, seed, trial, hashOut, hash_size); + + // Check prefix + if (thisBlockSize <= hashOut.size() && + std::equal(block.begin(), block.end(), hashOut.begin())) { + chosenNonce = candidateNonce; + found = true; + break; + } + + // Optional: show progress every so often + if (tries % 1'000'000 == 0) { + auto now = std::chrono::steady_clock::now(); + double elapsed = std::chrono::duration(now - startTime).count(); + double hps = tries / elapsed; + std::cerr << "\r[EncRand] Block " << blockIndex << ", " + << tries << " tries, ~" << static_cast(hps) + << " H/s " << std::flush; + } + } + + if (!found) { + std::cerr << "\n[EncRand] WARNING: puzzle not solved for block " << blockIndex + << " within " << MAX_TRIES << " tries.\n"; + } + + // Write the chosen nonce (8 bytes) + for (int i = 0; i < 8; i++) { + uint8_t c = (chosenNonce >> (8 * i)) & 0xFF; + fout.write(reinterpret_cast(&c), 1); + } + std::cerr << "\n[EncRand] Block " << blockIndex << " done.\n"; + } + + fout.close(); + std::cout << "[EncRand] Encryption finished: " << inFilename + << " => " << outFilename << "\n"; +} + + +// puzzleDecryptFile: reads [8-byte originalSize][(N) x 8-byte nonces], +// recovers each block via hash(key||nonce). +static void puzzleDecryptFile( + const std::string &inFilename, + const std::string &outFilename, + const std::string &key, + HashAlgorithm algot, + uint32_t hash_size, + uint64_t seed, + size_t blockSize +) { + // 1) Read entire ciphertext + std::ifstream fin(inFilename, std::ios::binary); + if (!fin.is_open()) { + throw std::runtime_error("Cannot open ciphertext for decryption: " + inFilename); + } + // First 8 bytes = original size + uint64_t originalSize = 0; + fin.read(reinterpret_cast(&originalSize), sizeof(originalSize)); + + // The rest are 8-byte nonces + std::vector cipherData( + (std::istreambuf_iterator(fin)), + (std::istreambuf_iterator()) + ); + fin.close(); + + if (cipherData.size() % 8 != 0) { + throw std::runtime_error("[Dec] Cipher data not multiple of 8 bytes after header!"); + } + size_t totalBlocks = cipherData.size() / 8; + + // 2) Prepare output file + std::ofstream fout(outFilename, std::ios::binary); + if (!fout.is_open()) { + throw std::runtime_error("Cannot open output file for plaintext: " + outFilename); + } + + // 3) Reconstruct each block + std::vector keyBuf(key.begin(), key.end()); + std::vector hashOut(hash_size / 8); + + size_t recoveredSoFar = 0; + + for (size_t i = 0; i < totalBlocks; i++) { + // Read the 8-byte nonce + uint64_t storedNonce = 0; + for (int j = 0; j < 8; j++) { + storedNonce |= (static_cast(cipherData[i*8 + j]) << (8 * j)); + } + + // Recompute the hash + std::vector trial(keyBuf); + for (int j = 0; j < 8; j++) { + trial.push_back((storedNonce >> (8 * j)) & 0xFF); + } + invokeHash(algot, seed, trial, hashOut, hash_size); + + // Figure out how many bytes remain vs. blockSize + size_t remaining = originalSize - recoveredSoFar; + size_t thisBlockSize = std::min(blockSize, remaining); + if (thisBlockSize > 0) { + if (thisBlockSize <= hashOut.size()) { + // Write that many bytes from hashOut + fout.write(reinterpret_cast(hashOut.data()), thisBlockSize); + recoveredSoFar += thisBlockSize; + } else { + std::cerr << "[Dec] Unexpected error: hashOut smaller than blockSize.\n"; + break; + } + } + // If recoveredSoFar == originalSize, we can break early if we want. + if (recoveredSoFar >= originalSize) { + break; + } + } + + fout.close(); + std::cout << "[Dec] Ciphertext " << inFilename << " decrypted successfully.\n"; +} + +// The main function int main(int argc, char** argv) { try { - cxxopts::Options options("rainsum", "Calculate a Rainbow or Rainstorm hash."); + cxxopts::Options options("rainsum", "Calculate a Rainbow or Rainstorm hash, or do puzzle-based encryption."); auto seed_option = cxxopts::value()->default_value("0"); + // Expand your mode description to include enc & dec options.add_options() - ("m,mode", "Mode: digest or stream", cxxopts::value()->default_value("digest")) + ("m,mode", "Mode: digest, stream, enc, dec", + cxxopts::value()->default_value("digest")) ("v,version", "Print version") - ("a,algorithm", "Specify the hash algorithm to use", cxxopts::value()->default_value("bow")) - ("s,size", "Specify the size of the hash", cxxopts::value()->default_value("256")) - ("o,output-file", "Output file for the hash", cxxopts::value()->default_value("/dev/stdout")) - ("t,test-vectors", "Calculate the hash of the standard test vectors", cxxopts::value()->default_value("false")) - ("l,output-length", "Output length in hashes (stream mode only)", cxxopts::value()->default_value("1000000")) + ("a,algorithm", "Specify the hash algorithm to use", + cxxopts::value()->default_value("storm")) + ("s,size", "Specify the size of the hash", + cxxopts::value()->default_value("256")) + ("o,output-file", "Output file", cxxopts::value()->default_value("/dev/stdout")) + ("t,test-vectors", "Calculate the hash of the standard test vectors", + cxxopts::value()->default_value("false")) + ("l,output-length", "Output length in hash iterations (stream mode)", + cxxopts::value()->default_value("1000000")) ("seed", "Seed value", seed_option) - // The new mining options: - ("mine-mode", "Mining mode: chain, nonceInc, nonceRand", cxxopts::value()->default_value("None")) - ("match-prefix", "Hex prefix to match in mining tasks", cxxopts::value()->default_value("")) + // Mining + ("mine-mode", "Mining mode: chain, nonceInc, nonceRand", + cxxopts::value()->default_value("None")) + ("match-prefix", "Hex prefix to match in mining tasks", + cxxopts::value()->default_value("")) + + // Encrypt / Decrypt + ("p,puzzle-len", + "Number of bytes in the puzzle prefix [default: 3]", + cxxopts::value()->default_value("3")) + + // New block-size for puzzle-based enc/dec + ("block-size", "Block size in bytes for puzzle-based encryption", + cxxopts::value()->default_value("3")) ("h,help", "Print usage"); auto result = options.parse(argc, argv); + size_t puzzleLen = result["puzzle-len"].as(); + if (result.count("version")) { std::cout << "rainsum version: " << VERSION << '\n'; } @@ -377,67 +633,65 @@ int main(int argc, char** argv) { Mode mode = result["mode"].as(); - // If user attempts --output-length in digest mode: - if (mode == Mode::Digest && result.count("output-length")) { - std::cerr << "Error: --output-length is not allowed in digest mode.\n"; - return 1; - } - std::string algorithm = result["algorithm"].as(); HashAlgorithm algot = getHashAlgorithm(algorithm); + if (algot == HashAlgorithm::Unknown) { + throw std::runtime_error("Unsupported algorithm string: " + algorithm); + } uint32_t size = result["size"].as(); - - // Validate sizes + // Validate sizes (similar checks from your code) if (algot == HashAlgorithm::Rainbow) { - switch (size) { - case 64: - case 128: - case 256: - break; - default: - throw std::runtime_error("Invalid hash_size for rainbow. Allowed: 64, 128, 256"); + if (size != 64 && size != 128 && size != 256) { + throw std::runtime_error("Invalid size for Rainbow (must be 64,128,256)."); } } else if (algot == HashAlgorithm::Rainstorm) { - switch (size) { - case 64: - case 128: - case 256: - case 512: - break; - default: - throw std::runtime_error("Invalid hash_size for rainstorm. Allowed: 64,128,256,512"); + if (size != 64 && size != 128 && size != 256 && size != 512) { + throw std::runtime_error("Invalid size for Rainstorm (must be 64,128,256,512)."); } } bool use_test_vectors = result["test-vectors"].as(); - uint64_t output_length = result["output-length"].as(); + + // In digest mode, final output is size/8 + // In stream mode, you read 'output_length' times the hash if (mode == Mode::Digest) { - // In digest mode, the final output is always exactly size/8 output_length = size / 8; - } else { - // In stream mode, output_length is multiplied by the hash size + } else if (mode == Mode::Stream) { output_length *= size; } - // Extract mining-related args + // Mining arguments MineMode mine_mode = result["mine-mode"].as(); std::string prefixHex = result["match-prefix"].as(); - // Check unmatched for potential filename or base input - std::string baseInput; + // Unmatched arguments might be input file std::string inpath; if (!result.unmatched().empty()) { - baseInput = result.unmatched().front(); - inpath = baseInput; // up to you whether you treat it as file vs base input + inpath = result.unmatched().front(); } - // If user selected a mining mode: + // If user selected a mining mode if (mine_mode != MineMode::None) { if (prefixHex.empty()) { throw std::runtime_error("You must specify --match-prefix for mining modes."); } + // Convert prefix from hex + auto hexToBytes = [&](const std::string &hexstr) { + if (hexstr.size() % 2 != 0) { + throw std::runtime_error("Hex prefix must have even length."); + } + std::vector bytes(hexstr.size() / 2); + for (size_t i = 0; i < bytes.size(); ++i) { + unsigned int val = 0; + std::stringstream ss; + ss << std::hex << hexstr.substr(i*2, 2); + ss >> val; + bytes[i] = static_cast(val); + } + return bytes; + }; std::vector prefixBytes = hexToBytes(prefixHex); switch (mine_mode) { @@ -445,45 +699,76 @@ int main(int argc, char** argv) { mineChain(algot, seed, size, prefixBytes); return 0; case MineMode::NonceInc: - mineNonceInc(algot, seed, size, prefixBytes, baseInput); + mineNonceInc(algot, seed, size, prefixBytes, inpath); return 0; case MineMode::NonceRand: - mineNonceRand(algot, seed, size, prefixBytes, baseInput); + mineNonceRand(algot, seed, size, prefixBytes, inpath); return 0; default: - throw std::runtime_error("Unknown mining mode encountered."); + throw std::runtime_error("Invalid mine-mode encountered."); } } - // No mining: proceed with normal hashing + size_t blockSize = result["block-size"].as(); + + // Normal hashing or encryption/decryption std::string outpath = result["output-file"].as(); - if (outpath == "/dev/stdout") { - if (mode == Mode::Digest) { - hashAnything(Mode::Digest, algot, inpath, std::cout, size, use_test_vectors, seed, size / 8); + if (mode == Mode::Digest) { + // Just a normal digest + if (outpath == "/dev/stdout") { + hashAnything(Mode::Digest, algot, inpath, std::cout, size, use_test_vectors, seed, output_length); } else { + std::ofstream outfile(outpath, std::ios::binary); + if (!outfile.is_open()) { + std::cerr << "Failed to open output file: " << outpath << std::endl; + return 1; + } + hashAnything(Mode::Digest, algot, inpath, outfile, size, use_test_vectors, seed, output_length); + } + } + else if (mode == Mode::Stream) { + if (outpath == "/dev/stdout") { hashAnything(Mode::Stream, algot, inpath, std::cout, size, use_test_vectors, seed, output_length); + } else { + std::ofstream outfile(outpath, std::ios::binary); + if (!outfile.is_open()) { + std::cerr << "Failed to open output file: " << outpath << std::endl; + return 1; + } + hashAnything(Mode::Stream, algot, inpath, outfile, size, use_test_vectors, seed, output_length); } - } else { - std::ofstream outfile(outpath, std::ios::binary); - if (!outfile.is_open()) { - std::cerr << "Failed to open output file: " << outpath << std::endl; - return 1; + } + else if (mode == Mode::Enc) { + if (inpath.empty()) { + throw std::runtime_error("No input file specified for encryption."); } + std::string key = promptForKey("Enter encryption key: "); - if (mode == Mode::Digest) { - hashAnything(Mode::Digest, algot, inpath, outfile, size, use_test_vectors, seed, size / 8); - } else { - hashAnything(Mode::Stream, algot, inpath, outfile, size, use_test_vectors, seed, output_length); + // We'll write ciphertext to inpath + ".rc" + std::string encFile = inpath + ".rc"; + puzzleEncryptFile(inpath, encFile, key, algot, size, seed, blockSize); + std::cout << "[Enc] Wrote encrypted file to: " << encFile << "\n"; + } + else if (mode == Mode::Dec) { + // Puzzle-based decryption (block-based) + if (inpath.empty()) { + throw std::runtime_error("No ciphertext file specified for decryption."); } - outfile.close(); + std::string key = promptForKey("Enter decryption key: "); + + // We'll write plaintext to inpath + ".dec" + std::string decFile = inpath + ".dec"; + puzzleDecryptFile(inpath, decFile, key, algot, size, seed, blockSize); + std::cout << "[Dec] Wrote decrypted file to: " << decFile << "\n"; } return 0; } - catch (const std::runtime_error& e) { + catch (const std::runtime_error &e) { std::cerr << "An error occurred: " << e.what() << std::endl; return 1; } } + diff --git a/src/tool.h b/src/tool.h index 84dbc37..de30037 100644 --- a/src/tool.h +++ b/src/tool.h @@ -17,37 +17,51 @@ enum class Mode { Digest, - Stream -}; - -// Mining mode enum -enum class MineMode { - None, - Chain, - NonceInc, - NonceRand + Stream, + Enc, // added + Dec // added }; std::string modeToString(const Mode& mode) { switch(mode) { case Mode::Digest: return "Digest"; case Mode::Stream: return "Stream"; - default: throw std::runtime_error("Unknown hash mode (expected digest or stream)"); + case Mode::Enc: return "Enc"; // added + case Mode::Dec: return "Dec"; // added + default: throw std::runtime_error("Unknown hash mode"); } } std::istream& operator>>(std::istream& in, Mode& mode) { std::string token; in >> token; - if (token == "digest") - mode = Mode::Digest; - else if (token == "stream") - mode = Mode::Stream; - else - in.setstate(std::ios_base::failbit); + if (token == "digest") mode = Mode::Digest; + else if (token == "stream") mode = Mode::Stream; + else if (token == "enc") mode = Mode::Enc; // added + else if (token == "dec") mode = Mode::Dec; // added + else in.setstate(std::ios_base::failbit); return in; } + +// Mining mode enum +enum class MineMode { + None, + Chain, + NonceInc, + NonceRand +}; + +std::string mineModeToString(const MineMode& mode) { + switch(mode) { + case MineMode::None: return "None"; + case MineMode::Chain: return "Chain"; + case MineMode::NonceInc: return "NonceInc"; // added + case MineMode::NonceRand: return "NonceRand"; // added + default: throw std::runtime_error("Unknown mine mode"); + } +} + // ------------------------------------------------------------------ // Mining Mode Operator>>(std::istream&, MineMode&) Implementation // (If you haven't placed this in tool.h, it can go here) @@ -66,7 +80,6 @@ std::istream& operator>>(std::istream& in, MineMode& mode) { } return in; } - // Stream retrieval (stdin vs file) std::istream& getInputStream() { #ifdef _WIN32 From eecff621a395f2364c436ae09d6997931a6bf476 Mon Sep 17 00:00:00 2001 From: DOSAYGO Development Team Date: Fri, 27 Dec 2024 01:30:28 +0800 Subject: [PATCH 05/22] good --- HITHERE.txt | 9 --------- HITHERE.txt.rc | Bin 144 -> 0 bytes HITHERE.txt.rc.dec | 1 - 3 files changed, 10 deletions(-) delete mode 100644 HITHERE.txt delete mode 100644 HITHERE.txt.rc delete mode 100644 HITHERE.txt.rc.dec diff --git a/HITHERE.txt b/HITHERE.txt deleted file mode 100644 index b232be5..0000000 --- a/HITHERE.txt +++ /dev/null @@ -1,9 +0,0 @@ -Hi There - -I am awesome - -I am Cris - -I love LOVE - - diff --git a/HITHERE.txt.rc b/HITHERE.txt.rc deleted file mode 100644 index d8fd903cb777d3868ee88cc7410f7a0263ca7ac5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 144 zcmV;B0B`>>000000002=tze=MeIkYCQ$haUPK=u+1n<+`U%hm)Op!ghqV0>S&Qsnl z$t)d)lkuI)ZrG*Nxh!=cv*B*ojp?;dVY>zldXsEm+Fee|joLu*EWxmq&nf6NsV5w; y*}fsc%aP|6JjcOLeWLu|srv0Y(%*0t@WArT1m>k>m%XoNOsZd0q1&ox4OvW7YfKve diff --git a/HITHERE.txt.rc.dec b/HITHERE.txt.rc.dec deleted file mode 100644 index 39d1944..0000000 --- a/HITHERE.txt.rc.dec +++ /dev/null @@ -1 +0,0 @@ -߅g+vIg!! !a7Hv[xuwBx \ No newline at end of file From a14af01347f76f85caa346dedab178645f8564a7 Mon Sep 17 00:00:00 2001 From: DOSAYGO Development Team Date: Fri, 27 Dec 2024 01:48:45 +0800 Subject: [PATCH 06/22] good --- src/rainsum.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/rainsum.cpp b/src/rainsum.cpp index 43f83cf..601f89d 100644 --- a/src/rainsum.cpp +++ b/src/rainsum.cpp @@ -586,7 +586,7 @@ int main(int argc, char** argv) { cxxopts::value()->default_value("digest")) ("v,version", "Print version") ("a,algorithm", "Specify the hash algorithm to use", - cxxopts::value()->default_value("storm")) + cxxopts::value()->default_value("bow")) ("s,size", "Specify the size of the hash", cxxopts::value()->default_value("256")) ("o,output-file", "Output file", cxxopts::value()->default_value("/dev/stdout")) From 9f8c12c30d47461398097e2b6320c9aa067de9a1 Mon Sep 17 00:00:00 2001 From: DOSAYGO Development Team Date: Fri, 27 Dec 2024 02:00:36 +0800 Subject: [PATCH 07/22] ok --- TODO | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 TODO diff --git a/TODO b/TODO new file mode 100644 index 0000000..0771cee --- /dev/null +++ b/TODO @@ -0,0 +1,7 @@ +cipher improvement + +- compress P +- schedule K into block keys via XOF +- spread indexing and parallelization for cipher mining efficiency + + From db8e7bb3f5e3fc226024dc147995e01d8a3ee38a Mon Sep 17 00:00:00 2001 From: DOSAYGO Development Team Date: Fri, 27 Dec 2024 13:19:37 +0800 Subject: [PATCH 08/22] Series search works --- Makefile.rc | Bin 0 -> 5615 bytes Makefile.rc.dec | 70 ++++++ scripts/build.sh | 6 +- src/cxxopts.hpp | 202 +++++++++------ src/rainsum.cpp | 623 ++++++++++++++++++++++++++--------------------- src/tool.h | 35 +++ 6 files changed, 583 insertions(+), 353 deletions(-) create mode 100644 Makefile.rc create mode 100644 Makefile.rc.dec diff --git a/Makefile.rc b/Makefile.rc new file mode 100644 index 0000000000000000000000000000000000000000..9995473b17c71744be4b7b33664a22bfadd4d912 GIT binary patch literal 5615 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 #include #include #include @@ -55,8 +56,8 @@ THE SOFTWARE. #define CXXOPTS_LINKONCE_CONST __declspec(selectany) extern #define CXXOPTS_LINKONCE __declspec(selectany) extern #else -#define CXXOPTS_LINKONCE_CONST -#define CXXOPTS_LINKONCE +#define CXXOPTS_LINKONCE_CONST +#define CXXOPTS_LINKONCE #endif #ifndef CXXOPTS_NO_REGEX @@ -73,6 +74,14 @@ THE SOFTWARE. # endif #endif +#define CXXOPTS_FALLTHROUGH +#ifdef __has_cpp_attribute + #if __has_cpp_attribute(fallthrough) + #undef CXXOPTS_FALLTHROUGH + #define CXXOPTS_FALLTHROUGH [[fallthrough]] + #endif +#endif + #if __cplusplus >= 201603L #define CXXOPTS_NODISCARD [[nodiscard]] #else @@ -84,7 +93,7 @@ THE SOFTWARE. #endif #define CXXOPTS__VERSION_MAJOR 3 -#define CXXOPTS__VERSION_MINOR 1 +#define CXXOPTS__VERSION_MINOR 2 #define CXXOPTS__VERSION_PATCH 1 #if (__GNUC__ < 10 || (__GNUC__ == 10 && __GNUC_MINOR__ < 1)) && __GNUC__ >= 6 @@ -230,10 +239,10 @@ stringAppend(String& s, Iterator begin, Iterator end) } inline -std::size_t +size_t stringLength(const String& s) { - return s.length(); + return static_cast(s.length()); } inline @@ -337,13 +346,8 @@ empty(const std::string& s) namespace cxxopts { namespace { -#ifdef _WIN32 CXXOPTS_LINKONCE_CONST std::string LQUOTE("\'"); CXXOPTS_LINKONCE_CONST std::string RQUOTE("\'"); -#else -CXXOPTS_LINKONCE_CONST std::string LQUOTE("‘"); -CXXOPTS_LINKONCE_CONST std::string RQUOTE("’"); -#endif } // namespace // GNU GCC with -Weffc++ will issue a warning regarding the upcoming class, we @@ -365,6 +369,9 @@ class Value : public std::enable_shared_from_this std::shared_ptr clone() const = 0; + virtual void + add(const std::string& text) const = 0; + virtual void parse(const std::string& text) const = 0; @@ -758,29 +765,31 @@ inline ArguDesc ParseArgument(const char *arg, bool &matched) namespace { CXXOPTS_LINKONCE -std::basic_regex integer_pattern - ("(-)?(0x)?([0-9a-zA-Z]+)|((0x)?0)"); +const char* const integer_pattern = + "(-)?(0x)?([0-9a-zA-Z]+)|((0x)?0)"; CXXOPTS_LINKONCE -std::basic_regex truthy_pattern - ("(t|T)(rue)?|1"); +const char* const truthy_pattern = + "(t|T)(rue)?|1"; CXXOPTS_LINKONCE -std::basic_regex falsy_pattern - ("(f|F)(alse)?|0"); +const char* const falsy_pattern = + "(f|F)(alse)?|0"; CXXOPTS_LINKONCE -std::basic_regex option_matcher - ("--([[:alnum:]][-_[:alnum:]\\.]+)(=(.*))?|-([[:alnum:]].*)"); +const char* const option_pattern = + "--([[:alnum:]][-_[:alnum:]\\.]+)(=(.*))?|-([[:alnum:]].*)"; CXXOPTS_LINKONCE -std::basic_regex option_specifier - ("([[:alnum:]][-_[:alnum:]\\.]*)(,[ ]*[[:alnum:]][-_[:alnum:]]*)*"); +const char* const option_specifier_pattern = + "([[:alnum:]][-_[:alnum:]\\.]*)(,[ ]*[[:alnum:]][-_[:alnum:]]*)*"; CXXOPTS_LINKONCE -std::basic_regex option_specifier_separator(", *"); +const char* const option_specifier_separator_pattern = ", *"; } // namespace inline IntegerDesc SplitInteger(const std::string &text) { + static const std::basic_regex integer_matcher(integer_pattern); + std::smatch match; - std::regex_match(text, match, integer_pattern); + std::regex_match(text, match, integer_matcher); if (match.length() == 0) { @@ -804,15 +813,17 @@ inline IntegerDesc SplitInteger(const std::string &text) inline bool IsTrueText(const std::string &text) { + static const std::basic_regex truthy_matcher(truthy_pattern); std::smatch result; - std::regex_match(text, result, truthy_pattern); + std::regex_match(text, result, truthy_matcher); return !result.empty(); } inline bool IsFalseText(const std::string &text) { + static const std::basic_regex falsy_matcher(falsy_pattern); std::smatch result; - std::regex_match(text, result, falsy_pattern); + std::regex_match(text, result, falsy_matcher); return !result.empty(); } @@ -821,22 +832,25 @@ inline bool IsFalseText(const std::string &text) // (without considering which or how many are single-character) inline OptionNames split_option_names(const std::string &text) { - if (!std::regex_match(text.c_str(), option_specifier)) + static const std::basic_regex option_specifier_matcher(option_specifier_pattern); + if (!std::regex_match(text.c_str(), option_specifier_matcher)) { throw_or_mimic(text); } OptionNames split_names; + static const std::basic_regex option_specifier_separator_matcher(option_specifier_separator_pattern); constexpr int use_non_matches { -1 }; auto token_iterator = std::sregex_token_iterator( - text.begin(), text.end(), option_specifier_separator, use_non_matches); + text.begin(), text.end(), option_specifier_separator_matcher, use_non_matches); std::copy(token_iterator, std::sregex_token_iterator(), std::back_inserter(split_names)); return split_names; } inline ArguDesc ParseArgument(const char *arg, bool &matched) { + static const std::basic_regex option_matcher(option_pattern); std::match_results result; std::regex_match(arg, result, option_matcher); matched = !result.empty(); @@ -959,13 +973,26 @@ integer_parser(const std::string& text, T& value) throw_or_mimic(text); } - const US next = static_cast(result * base + digit); - if (result > next) + US limit = 0; + if (negative) + { + limit = static_cast(std::abs(static_cast(std::numeric_limits::min()))); + } + else + { + limit = std::numeric_limits::max(); + } + + if (base != 0 && result > limit / base) + { + throw_or_mimic(text); + } + if (result * base > limit - digit) { throw_or_mimic(text); } - result = next; + result = static_cast(result * base + digit); } detail::check_signed_range(negative, result, text); @@ -1035,6 +1062,28 @@ parse_value(const std::string& text, T& value) { stringstream_parser(text, value); } +#ifdef CXXOPTS_HAS_OPTIONAL +template +void +parse_value(const std::string& text, std::optional& value) +{ + T result; + parse_value(text, result); + value = std::move(result); +} +#endif + +inline +void parse_value(const std::string& text, char& c) +{ + if (text.length() != 1) + { + throw_or_mimic(text); + } + + c = text[0]; +} + template void parse_value(const std::string& text, std::vector& value) @@ -1054,26 +1103,20 @@ parse_value(const std::string& text, std::vector& value) } } -#ifdef CXXOPTS_HAS_OPTIONAL template void -parse_value(const std::string& text, std::optional& value) +add_value(const std::string& text, T& value) { - T result; - parse_value(text, result); - value = std::move(result); + parse_value(text, value); } -#endif -inline -void parse_value(const std::string& text, char& c) +template +void +add_value(const std::string& text, std::vector& value) { - if (text.length() != 1) - { - throw_or_mimic(text); - } - - c = text[0]; + T v; + add_value(text, v); + value.emplace_back(std::move(v)); } template @@ -1127,6 +1170,12 @@ class abstract_value : public Value m_implicit_value = rhs.m_implicit_value; } + void + add(const std::string& text) const override + { + add_value(text, *m_store); + } + void parse(const std::string& text) const override { @@ -1412,6 +1461,19 @@ struct HelpGroupDetails class OptionValue { public: + void + add + ( + const std::shared_ptr& details, + const std::string& text + ) + { + ensure_value(details); + ++m_count; + m_value->add(text); + m_long_names = &details->long_names(); + } + void parse ( @@ -1498,7 +1560,7 @@ CXXOPTS_DIAGNOSTIC_POP class KeyValue { public: - KeyValue(std::string key_, std::string value_) + KeyValue(std::string key_, std::string value_) noexcept : m_key(std::move(key_)) , m_value(std::move(value_)) { @@ -1551,7 +1613,7 @@ class ParseResult Iterator(const Iterator&) = default; // GCC complains about m_iter not being initialised in the member -// initializer list +// initializer list CXXOPTS_DIAGNOSTIC_PUSH CXXOPTS_IGNORE_WARNING("-Weffc++") Iterator(const ParseResult *pr, bool end=false) @@ -1782,7 +1844,7 @@ class OptionParser ); void - add_to_option(OptionMap::const_iterator iter, const std::string& option, const std::string& arg); + add_to_option(const std::shared_ptr& value, const std::string& arg); void parse_option @@ -1985,6 +2047,7 @@ class Options std::unordered_set m_positional_set{}; //mapping from groups to help options + std::vector m_group{}; std::map m_help{}; }; @@ -2237,6 +2300,7 @@ OptionAdder::operator() case 1: short_name = *first_short_name_iter; option_names.erase(first_short_name_iter); + CXXOPTS_FALLTHROUGH; case 0: break; default: @@ -2328,9 +2392,13 @@ OptionParser::checked_parse_arg inline void -OptionParser::add_to_option(OptionMap::const_iterator iter, const std::string& option, const std::string& arg) +OptionParser::add_to_option(const std::shared_ptr& value, const std::string& arg) { - parse_option(iter->second, option, arg); + auto hash = value->hash(); + auto& result = m_parsed[hash]; + result.add(value, arg); + + m_sequential.emplace_back(value->essential_name(), arg); } inline @@ -2347,14 +2415,14 @@ OptionParser::consume_positional(const std::string& a, PositionalListIterator& n auto& result = m_parsed[iter->second->hash()]; if (result.count() == 0) { - add_to_option(iter, *next, a); + add_to_option(iter->second, a); ++next; return true; } ++next; continue; } - add_to_option(iter, *next, a); + add_to_option(iter->second, a); return true; } throw_or_mimic(*next); @@ -2618,6 +2686,12 @@ Options::add_option } //add the help details + + if (m_help.find(group) == m_help.end()) + { + m_group.push_back(group); + } + auto& options = m_help[group]; options.options.emplace_back(HelpOptionDetails{s, l, stringDesc, @@ -2749,19 +2823,7 @@ inline void Options::generate_all_groups_help(String& result) const { - std::vector all_groups; - - std::transform( - m_help.begin(), - m_help.end(), - std::back_inserter(all_groups), - [] (const std::map::value_type& group) - { - return group.first; - } - ); - - generate_group_help(result, all_groups); + generate_group_help(result, m_group); } inline @@ -2801,19 +2863,7 @@ inline std::vector Options::groups() const { - std::vector g; - - std::transform( - m_help.begin(), - m_help.end(), - std::back_inserter(g), - [] (const std::map::value_type& pair) - { - return pair.first; - } - ); - - return g; + return m_group; } inline diff --git a/src/rainsum.cpp b/src/rainsum.cpp index 601f89d..6489f96 100644 --- a/src/rainsum.cpp +++ b/src/rainsum.cpp @@ -13,10 +13,10 @@ #include #include #include +#include +#include "tool.h" // for invokeHash, etc. -#include "tool.h" - // ------------------------------------------------------------------ // Helper functions for mining // ------------------------------------------------------------------ @@ -377,27 +377,18 @@ static std::string promptForKey(const std::string &prompt) { } #endif -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "tool.h" // for invokeHash, etc. - -static void puzzleEncryptFile( +static void puzzleEncryptFileWithHeader( const std::string &inFilename, const std::string &outFilename, const std::string &key, HashAlgorithm algot, uint32_t hash_size, uint64_t seed, - size_t blockSize + size_t blockSize, + size_t nonceSize, + const std::string &searchMode ) { - // 1) Read input file + // Open input file std::ifstream fin(inFilename, std::ios::binary); if (!fin.is_open()) { throw std::runtime_error("Cannot open input file: " + inFilename); @@ -406,165 +397,186 @@ static void puzzleEncryptFile( (std::istreambuf_iterator())); fin.close(); - // 2) Prepare output + // Open output file std::ofstream fout(outFilename, std::ios::binary); if (!fout.is_open()) { throw std::runtime_error("Cannot open output file: " + outFilename); } - // Write 8-byte original size + // Write header + uint32_t magicNumber = 0x52435259; // "RCRY" + uint8_t version = 0x01; + uint8_t blockSize8 = static_cast(blockSize); + uint8_t nonceSize8 = static_cast(nonceSize); + uint16_t digestSize16 = static_cast(hash_size); + uint8_t searchModeEnum = 0x00; // Default to 'prefix' + if (searchMode == "prefix") searchModeEnum = 0x00; + else if (searchMode == "sequence") searchModeEnum = 0x01; + else if (searchMode == "series") searchModeEnum = 0x02; + else if (searchMode == "scatter") searchModeEnum = 0x03; + + std::string hashName = (algot == HashAlgorithm::Rainbow) ? "rainbow" : "rainstorm"; + uint8_t hashNameLength = static_cast(hashName.size()); + + fout.write(reinterpret_cast(&magicNumber), sizeof(magicNumber)); + fout.write(reinterpret_cast(&version), sizeof(version)); + fout.write(reinterpret_cast(&blockSize8), sizeof(blockSize8)); + fout.write(reinterpret_cast(&nonceSize8), sizeof(nonceSize8)); + fout.write(reinterpret_cast(&digestSize16), sizeof(digestSize16)); + fout.write(reinterpret_cast(&hashNameLength), sizeof(hashNameLength)); + fout.write(hashName.data(), hashName.size()); + fout.write(reinterpret_cast(&searchModeEnum), sizeof(searchModeEnum)); + uint64_t originalSize = plainData.size(); fout.write(reinterpret_cast(&originalSize), sizeof(originalSize)); - // 3) Partition into blocks + // Partition plaintext into blocks size_t totalBlocks = (plainData.size() + blockSize - 1) / blockSize; std::vector hashOut(hash_size / 8); std::vector keyBuf(key.begin(), key.end()); - // Use a random 64-bit generator + // Prepare random generator for nonce std::mt19937_64 rng(std::random_device{}()); - std::uniform_int_distribution dist; // full 64-bit range - - // Increase MAX_TRIES significantly for 3+ byte blocks - const uint64_t MAX_TRIES = 10'000'000'000; - size_t offset = 0; - - auto startTime = std::chrono::steady_clock::now(); + std::uniform_int_distribution dist; for (size_t blockIndex = 0; blockIndex < totalBlocks; blockIndex++) { - size_t thisBlockSize = std::min(blockSize, plainData.size() - offset); + size_t thisBlockSize = std::min(blockSize, plainData.size() - blockIndex * blockSize); std::vector block( - plainData.begin() + offset, - plainData.begin() + offset + thisBlockSize + plainData.begin() + blockIndex * blockSize, + plainData.begin() + blockIndex * blockSize + thisBlockSize ); - offset += thisBlockSize; bool found = false; - uint64_t chosenNonce = 0; + std::vector chosenNonce(nonceSize, 0); + uint8_t startIndex = 0; - for (uint64_t tries = 1; tries <= MAX_TRIES; tries++) { - uint64_t candidateNonce = dist(rng); + for (uint64_t tries = 0; ; tries++) { // No fixed MAX_TRIES + for (size_t i = 0; i < nonceSize; i++) { + chosenNonce[i] = static_cast(dist(rng) & 0xFF); + } - // Build trial = key || candidateNonce + // Build trial buffer std::vector trial(keyBuf); - trial.reserve(keyBuf.size() + 8); // small optimization - for (int i = 0; i < 8; i++) { - trial.push_back(static_cast((candidateNonce >> (8 * i)) & 0xFF)); - } + trial.insert(trial.end(), chosenNonce.begin(), chosenNonce.end()); // Hash it invokeHash(algot, seed, trial, hashOut, hash_size); - // Check prefix - if (thisBlockSize <= hashOut.size() && - std::equal(block.begin(), block.end(), hashOut.begin())) { - chosenNonce = candidateNonce; - found = true; - break; + // Search block in digest (not just at start) + for (uint8_t i = 0; i <= hashOut.size() - thisBlockSize; i++) { + if (std::equal(block.begin(), block.end(), hashOut.begin() + i)) { + startIndex = i; + found = true; + break; + } } + if (found) break; - // Optional: show progress every so often if (tries % 1'000'000 == 0) { - auto now = std::chrono::steady_clock::now(); - double elapsed = std::chrono::duration(now - startTime).count(); - double hps = tries / elapsed; - std::cerr << "\r[EncRand] Block " << blockIndex << ", " - << tries << " tries, ~" << static_cast(hps) - << " H/s " << std::flush; + std::cerr << "\r[Enc] Block " << blockIndex << ", " << tries << " tries... " << std::flush; } } - if (!found) { - std::cerr << "\n[EncRand] WARNING: puzzle not solved for block " << blockIndex - << " within " << MAX_TRIES << " tries.\n"; - } - - // Write the chosen nonce (8 bytes) - for (int i = 0; i < 8; i++) { - uint8_t c = (chosenNonce >> (8 * i)) & 0xFF; - fout.write(reinterpret_cast(&c), 1); - } - std::cerr << "\n[EncRand] Block " << blockIndex << " done.\n"; + // Write nonce + start index + fout.write(reinterpret_cast(chosenNonce.data()), nonceSize); + fout.write(reinterpret_cast(&startIndex), sizeof(startIndex)); } fout.close(); - std::cout << "[EncRand] Encryption finished: " << inFilename - << " => " << outFilename << "\n"; + std::cout << "[Enc] Encryption complete: " << outFilename << "\n"; } - -// puzzleDecryptFile: reads [8-byte originalSize][(N) x 8-byte nonces], -// recovers each block via hash(key||nonce). -static void puzzleDecryptFile( +static void puzzleDecryptFileWithHeader( const std::string &inFilename, const std::string &outFilename, const std::string &key, - HashAlgorithm algot, - uint32_t hash_size, - uint64_t seed, - size_t blockSize + uint64_t seed ) { - // 1) Read entire ciphertext + // Open input file std::ifstream fin(inFilename, std::ios::binary); if (!fin.is_open()) { - throw std::runtime_error("Cannot open ciphertext for decryption: " + inFilename); + throw std::runtime_error("Cannot open ciphertext file: " + inFilename); } - // First 8 bytes = original size - uint64_t originalSize = 0; + + // Read header + uint32_t magicNumber; + uint8_t version; + uint8_t blockSize; + uint8_t nonceSize; + uint16_t hash_size; + uint8_t hashNameLength; + std::string hashName; + uint8_t searchModeEnum; + uint64_t originalSize; + + fin.read(reinterpret_cast(&magicNumber), sizeof(magicNumber)); + fin.read(reinterpret_cast(&version), sizeof(version)); + fin.read(reinterpret_cast(&blockSize), sizeof(blockSize)); + fin.read(reinterpret_cast(&nonceSize), sizeof(nonceSize)); + fin.read(reinterpret_cast(&hash_size), sizeof(hash_size)); + fin.read(reinterpret_cast(&hashNameLength), sizeof(hashNameLength)); + + hashName.resize(hashNameLength); + fin.read(&hashName[0], hashNameLength); + fin.read(reinterpret_cast(&searchModeEnum), sizeof(searchModeEnum)); fin.read(reinterpret_cast(&originalSize), sizeof(originalSize)); - // The rest are 8-byte nonces + if (magicNumber != 0x52435259) { + throw std::runtime_error("Invalid magic number in header."); + } + + HashAlgorithm algot = (hashName == "rainbow") ? HashAlgorithm::Rainbow : HashAlgorithm::Rainstorm; + + // Read the rest of the file as cipher data std::vector cipherData( (std::istreambuf_iterator(fin)), (std::istreambuf_iterator()) ); fin.close(); - if (cipherData.size() % 8 != 0) { - throw std::runtime_error("[Dec] Cipher data not multiple of 8 bytes after header!"); + // Each block consists of nonceSize bytes + 1 byte (startIndex) + size_t blockCipherSize = nonceSize + 1; + if (cipherData.size() % blockCipherSize != 0) { + throw std::runtime_error("[Dec] Cipher data not multiple of blockCipherSize bytes after header!"); } - size_t totalBlocks = cipherData.size() / 8; + size_t totalBlocks = cipherData.size() / blockCipherSize; - // 2) Prepare output file + // Prepare output file std::ofstream fout(outFilename, std::ios::binary); if (!fout.is_open()) { throw std::runtime_error("Cannot open output file for plaintext: " + outFilename); } - // 3) Reconstruct each block + // Reconstruct plaintext blocks std::vector keyBuf(key.begin(), key.end()); std::vector hashOut(hash_size / 8); size_t recoveredSoFar = 0; for (size_t i = 0; i < totalBlocks; i++) { - // Read the 8-byte nonce - uint64_t storedNonce = 0; - for (int j = 0; j < 8; j++) { - storedNonce |= (static_cast(cipherData[i*8 + j]) << (8 * j)); - } + // Extract nonce and startIndex for each block + std::vector storedNonce(cipherData.begin() + i * blockCipherSize, + cipherData.begin() + i * blockCipherSize + nonceSize); + uint8_t startIndex = cipherData[i * blockCipherSize + nonceSize]; // Recompute the hash std::vector trial(keyBuf); - for (int j = 0; j < 8; j++) { - trial.push_back((storedNonce >> (8 * j)) & 0xFF); - } + trial.insert(trial.end(), storedNonce.begin(), storedNonce.end()); invokeHash(algot, seed, trial, hashOut, hash_size); - // Figure out how many bytes remain vs. blockSize + // Determine the size of the current block size_t remaining = originalSize - recoveredSoFar; - size_t thisBlockSize = std::min(blockSize, remaining); - if (thisBlockSize > 0) { - if (thisBlockSize <= hashOut.size()) { - // Write that many bytes from hashOut - fout.write(reinterpret_cast(hashOut.data()), thisBlockSize); - recoveredSoFar += thisBlockSize; - } else { - std::cerr << "[Dec] Unexpected error: hashOut smaller than blockSize.\n"; - break; - } + size_t thisBlockSize = std::min(blockSize, remaining); + + if (startIndex + thisBlockSize > hashOut.size()) { + throw std::runtime_error("[Dec] Invalid start index or block size exceeds hash digest size."); } - // If recoveredSoFar == originalSize, we can break early if we want. + + // Write the plaintext block + fout.write(reinterpret_cast(hashOut.data() + startIndex), thisBlockSize); + recoveredSoFar += thisBlockSize; + + // Early exit if all data is recovered if (recoveredSoFar >= originalSize) { break; } @@ -574,201 +586,260 @@ static void puzzleDecryptFile( std::cout << "[Dec] Ciphertext " << inFilename << " decrypted successfully.\n"; } + // The main function int main(int argc, char** argv) { - try { - cxxopts::Options options("rainsum", "Calculate a Rainbow or Rainstorm hash, or do puzzle-based encryption."); - auto seed_option = cxxopts::value()->default_value("0"); - - // Expand your mode description to include enc & dec - options.add_options() - ("m,mode", "Mode: digest, stream, enc, dec", - cxxopts::value()->default_value("digest")) - ("v,version", "Print version") - ("a,algorithm", "Specify the hash algorithm to use", - cxxopts::value()->default_value("bow")) - ("s,size", "Specify the size of the hash", - cxxopts::value()->default_value("256")) - ("o,output-file", "Output file", cxxopts::value()->default_value("/dev/stdout")) - ("t,test-vectors", "Calculate the hash of the standard test vectors", - cxxopts::value()->default_value("false")) - ("l,output-length", "Output length in hash iterations (stream mode)", - cxxopts::value()->default_value("1000000")) - ("seed", "Seed value", seed_option) - // Mining - ("mine-mode", "Mining mode: chain, nonceInc, nonceRand", - cxxopts::value()->default_value("None")) - ("match-prefix", "Hex prefix to match in mining tasks", - cxxopts::value()->default_value("")) - - // Encrypt / Decrypt - ("p,puzzle-len", - "Number of bytes in the puzzle prefix [default: 3]", - cxxopts::value()->default_value("3")) - - // New block-size for puzzle-based enc/dec - ("block-size", "Block size in bytes for puzzle-based encryption", - cxxopts::value()->default_value("3")) - ("h,help", "Print usage"); - - auto result = options.parse(argc, argv); - - size_t puzzleLen = result["puzzle-len"].as(); - - if (result.count("version")) { - std::cout << "rainsum version: " << VERSION << '\n'; - } + try { + // Initialize cxxopts with program name and description + cxxopts::Options options("rainsum", "Calculate a Rainbow or Rainstorm hash, or perform puzzle-based encryption/decryption."); + + // Define command-line options + options.add_options() + ("m,mode", "Mode: digest, stream, enc, dec", + cxxopts::value()->default_value("digest")) + ("v,version", "Print version") + ("a,algorithm", "Specify the hash algorithm to use (rainbow, rainstorm)", + cxxopts::value()->default_value("bow")) + ("s,size", "Specify the size of the hash (e.g., 64, 128, 256, 512)", + cxxopts::value()->default_value("256")) + ("block-size", "Block size in bytes for puzzle-based encryption (1-255)", + cxxopts::value()->default_value("3")) + ("n,nonce-size", "Size of the nonce in bytes (1-255)", + cxxopts::value()->default_value("8")) + ("search-mode", "Search mode: prefix, sequence, series, scatter", + cxxopts::value()->default_value("prefix")) + ("o,output-file", "Output file", + cxxopts::value()->default_value("/dev/stdout")) + ("t,test-vectors", "Calculate the hash of the standard test vectors", + cxxopts::value()->default_value("false")) + ("l,output-length", "Output length in hash iterations (stream mode)", + cxxopts::value()->default_value("1000000")) + ("seed", "Seed value", + cxxopts::value()->default_value("0")) + // Mining options + ("mine-mode", "Mining mode: chain, nonceInc, nonceRand", + cxxopts::value()->default_value("None")) + ("match-prefix", "Hex prefix to match in mining tasks", + cxxopts::value()->default_value("")) + // Encrypt / Decrypt options + ("p,puzzle-len", "Number of bytes in the puzzle prefix [default: 3]", + cxxopts::value()->default_value("3")) + ("h,help", "Print usage"); + + // Parse command-line options + auto result = options.parse(argc, argv); + + // Handle help and version immediately + if (result.count("help")) { + std::cout << options.help() << "\n"; + return 0; + } - if (result.count("help")) { - usage(); - return 0; - } + if (result.count("version")) { + std::cout << "rainsum version: 1.0.0\n"; // Replace with actual VERSION + return 0; + } - // Convert seed (either numeric or hash string) - std::string seed_str = result["seed"].as(); - uint64_t seed; - if (!(std::istringstream(seed_str) >> seed)) { - seed = hash_string_to_64_bit(seed_str); - } + // Access and validate options - Mode mode = result["mode"].as(); + // Puzzle Length + size_t puzzleLen = result["puzzle-len"].as(); - std::string algorithm = result["algorithm"].as(); - HashAlgorithm algot = getHashAlgorithm(algorithm); - if (algot == HashAlgorithm::Unknown) { - throw std::runtime_error("Unsupported algorithm string: " + algorithm); - } + // Hash Size + uint32_t hash_size = result["size"].as(); - uint32_t size = result["size"].as(); - // Validate sizes (similar checks from your code) - if (algot == HashAlgorithm::Rainbow) { - if (size != 64 && size != 128 && size != 256) { - throw std::runtime_error("Invalid size for Rainbow (must be 64,128,256)."); - } - } else if (algot == HashAlgorithm::Rainstorm) { - if (size != 64 && size != 128 && size != 256 && size != 512) { - throw std::runtime_error("Invalid size for Rainstorm (must be 64,128,256,512)."); - } - } + // Block Size + uint8_t blockSize = result["block-size"].as(); + if (blockSize == 0 || blockSize > 255) { + throw std::runtime_error("Block size must be between 1 and 255 bytes."); + } - bool use_test_vectors = result["test-vectors"].as(); - uint64_t output_length = result["output-length"].as(); + // Nonce Size + size_t nonceSize = result["nonce-size"].as(); + if (nonceSize == 0 || nonceSize > 255) { + throw std::runtime_error("Nonce size must be between 1 and 255 bytes."); + } - // In digest mode, final output is size/8 - // In stream mode, you read 'output_length' times the hash - if (mode == Mode::Digest) { - output_length = size / 8; - } else if (mode == Mode::Stream) { - output_length *= size; - } + // Search Mode + std::string searchMode = result["search-mode"].as(); + if (searchMode != "prefix" && searchMode != "sequence" && + searchMode != "series" && searchMode != "scatter") { + throw std::runtime_error("Invalid search mode: " + searchMode); + } - // Mining arguments - MineMode mine_mode = result["mine-mode"].as(); - std::string prefixHex = result["match-prefix"].as(); + // Convert Seed (either numeric or hash string) + std::string seed_str = result["seed"].as(); + uint64_t seed; + if (!(std::istringstream(seed_str) >> seed)) { + seed = hash_string_to_64_bit(seed_str); + } - // Unmatched arguments might be input file - std::string inpath; - if (!result.unmatched().empty()) { - inpath = result.unmatched().front(); - } + // Determine Mode + std::string modeStr = result["mode"].as(); + Mode mode; + if (modeStr == "digest") mode = Mode::Digest; + else if (modeStr == "stream") mode = Mode::Stream; + else if (modeStr == "enc") mode = Mode::Enc; + else if (modeStr == "dec") mode = Mode::Dec; + else throw std::runtime_error("Invalid mode: " + modeStr); + + // Determine Hash Algorithm + std::string algorithm = result["algorithm"].as(); + HashAlgorithm algot = getHashAlgorithm(algorithm); + if (algot == HashAlgorithm::Unknown) { + throw std::runtime_error("Unsupported algorithm string: " + algorithm); + } - // If user selected a mining mode - if (mine_mode != MineMode::None) { - if (prefixHex.empty()) { - throw std::runtime_error("You must specify --match-prefix for mining modes."); - } - // Convert prefix from hex - auto hexToBytes = [&](const std::string &hexstr) { - if (hexstr.size() % 2 != 0) { - throw std::runtime_error("Hex prefix must have even length."); + // Validate Hash Size based on Algorithm + if (algot == HashAlgorithm::Rainbow) { + if (hash_size != 64 && hash_size != 128 && hash_size != 256) { + throw std::runtime_error("Invalid size for Rainbow (must be 64, 128, or 256)."); + } } - std::vector bytes(hexstr.size() / 2); - for (size_t i = 0; i < bytes.size(); ++i) { - unsigned int val = 0; - std::stringstream ss; - ss << std::hex << hexstr.substr(i*2, 2); - ss >> val; - bytes[i] = static_cast(val); + else if (algot == HashAlgorithm::Rainstorm) { + if (hash_size != 64 && hash_size != 128 && hash_size != 256 && hash_size != 512) { + throw std::runtime_error("Invalid size for Rainstorm (must be 64, 128, 256, or 512)."); + } } - return bytes; - }; - std::vector prefixBytes = hexToBytes(prefixHex); - - switch (mine_mode) { - case MineMode::Chain: - mineChain(algot, seed, size, prefixBytes); - return 0; - case MineMode::NonceInc: - mineNonceInc(algot, seed, size, prefixBytes, inpath); - return 0; - case MineMode::NonceRand: - mineNonceRand(algot, seed, size, prefixBytes, inpath); - return 0; - default: - throw std::runtime_error("Invalid mine-mode encountered."); - } - } - size_t blockSize = result["block-size"].as(); + // Test Vectors + bool use_test_vectors = result["test-vectors"].as(); - // Normal hashing or encryption/decryption - std::string outpath = result["output-file"].as(); + // Output Length + uint64_t output_length = result["output-length"].as(); - if (mode == Mode::Digest) { - // Just a normal digest - if (outpath == "/dev/stdout") { - hashAnything(Mode::Digest, algot, inpath, std::cout, size, use_test_vectors, seed, output_length); - } else { - std::ofstream outfile(outpath, std::ios::binary); - if (!outfile.is_open()) { - std::cerr << "Failed to open output file: " << outpath << std::endl; - return 1; + // Adjust output_length based on mode + if (mode == Mode::Digest) { + output_length = hash_size / 8; } - hashAnything(Mode::Digest, algot, inpath, outfile, size, use_test_vectors, seed, output_length); - } - } - else if (mode == Mode::Stream) { - if (outpath == "/dev/stdout") { - hashAnything(Mode::Stream, algot, inpath, std::cout, size, use_test_vectors, seed, output_length); - } else { - std::ofstream outfile(outpath, std::ios::binary); - if (!outfile.is_open()) { - std::cerr << "Failed to open output file: " << outpath << std::endl; - return 1; + else if (mode == Mode::Stream) { + output_length *= hash_size / 8; } - hashAnything(Mode::Stream, algot, inpath, outfile, size, use_test_vectors, seed, output_length); - } - } - else if (mode == Mode::Enc) { - if (inpath.empty()) { - throw std::runtime_error("No input file specified for encryption."); - } - std::string key = promptForKey("Enter encryption key: "); - // We'll write ciphertext to inpath + ".rc" - std::string encFile = inpath + ".rc"; - puzzleEncryptFile(inpath, encFile, key, algot, size, seed, blockSize); - std::cout << "[Enc] Wrote encrypted file to: " << encFile << "\n"; - } - else if (mode == Mode::Dec) { - // Puzzle-based decryption (block-based) - if (inpath.empty()) { - throw std::runtime_error("No ciphertext file specified for decryption."); - } - std::string key = promptForKey("Enter decryption key: "); + // Mining arguments + std::string mine_mode_str = result["mine-mode"].as(); + MineMode mine_mode; + if (mine_mode_str == "chain") mine_mode = MineMode::Chain; + else if (mine_mode_str == "nonceInc") mine_mode = MineMode::NonceInc; + else if (mine_mode_str == "nonceRand") mine_mode = MineMode::NonceRand; + else mine_mode = MineMode::None; - // We'll write plaintext to inpath + ".dec" - std::string decFile = inpath + ".dec"; - puzzleDecryptFile(inpath, decFile, key, algot, size, seed, blockSize); - std::cout << "[Dec] Wrote decrypted file to: " << decFile << "\n"; - } + std::string prefixHex = result["match-prefix"].as(); - return 0; - } - catch (const std::runtime_error &e) { - std::cerr << "An error occurred: " << e.what() << std::endl; - return 1; - } + // Unmatched arguments might be input file + std::string inpath; + if (!result.unmatched().empty()) { + inpath = result.unmatched().front(); + } + + // Handle Mining Modes + if (mine_mode != MineMode::None) { + if (prefixHex.empty()) { + throw std::runtime_error("You must specify --match-prefix for mining modes."); + } + + // Convert prefix from hex + auto hexToBytes = [&](const std::string &hexstr) -> std::vector { + if (hexstr.size() % 2 != 0) { + throw std::runtime_error("Hex prefix must have even length."); + } + std::vector bytes(hexstr.size() / 2); + for (size_t i = 0; i < bytes.size(); ++i) { + unsigned int val = 0; + std::stringstream ss; + ss << std::hex << hexstr.substr(i*2, 2); + ss >> val; + bytes[i] = static_cast(val); + } + return bytes; + }; + + std::vector prefixBytes = hexToBytes(prefixHex); + + switch (mine_mode) { + case MineMode::Chain: + mineChain(algot, seed, hash_size, prefixBytes); + return 0; + case MineMode::NonceInc: + mineNonceInc(algot, seed, hash_size, prefixBytes, inpath); + return 0; + case MineMode::NonceRand: + mineNonceRand(algot, seed, hash_size, prefixBytes, inpath); + return 0; + default: + throw std::runtime_error("Invalid mine-mode encountered."); + } + } + + // Normal Hashing or Encryption/Decryption + std::string outpath = result["output-file"].as(); + + if (mode == Mode::Digest) { + // Just a normal digest + if (outpath == "/dev/stdout") { + hashAnything(Mode::Digest, algot, inpath, std::cout, hash_size, use_test_vectors, seed, output_length); + } + else { + std::ofstream outfile(outpath, std::ios::binary); + if (!outfile.is_open()) { + std::cerr << "Failed to open output file: " << outpath << std::endl; + return 1; + } + hashAnything(Mode::Digest, algot, inpath, outfile, hash_size, use_test_vectors, seed, output_length); + } + } + else if (mode == Mode::Stream) { + if (outpath == "/dev/stdout") { + hashAnything(Mode::Stream, algot, inpath, std::cout, hash_size, use_test_vectors, seed, output_length); + } + else { + std::ofstream outfile(outpath, std::ios::binary); + if (!outfile.is_open()) { + std::cerr << "Failed to open output file: " << outpath << std::endl; + return 1; + } + hashAnything(Mode::Stream, algot, inpath, outfile, hash_size, use_test_vectors, seed, output_length); + } + } + else if (mode == Mode::Enc) { + if (inpath.empty()) { + throw std::runtime_error("No input file specified for encryption."); + } + std::string key = promptForKey("Enter encryption key: "); + + // We'll write ciphertext to inpath + ".rc" + std::string encFile = inpath + ".rc"; + puzzleEncryptFileWithHeader(inpath, encFile, key, algot, hash_size, seed, blockSize, nonceSize, searchMode); + std::cout << "[Enc] Wrote encrypted file to: " << encFile << "\n"; + } + else if (mode == Mode::Dec) { + // Puzzle-based decryption (block-based) + if (inpath.empty()) { + throw std::runtime_error("No ciphertext file specified for decryption."); + } + std::string key = promptForKey("Enter decryption key: "); + + // We'll write plaintext to inpath + ".dec" + std::string decFile = inpath + ".dec"; + puzzleDecryptFileWithHeader(inpath, decFile, key, seed); + std::cout << "[Dec] Wrote decrypted file to: " << decFile << "\n"; + } + + return 0; + } + catch (const cxxopts::exceptions::exception& e) { + std::cerr << "Error parsing options: " << e.what() << "\n"; + return 1; + } + catch (const std::bad_cast &e) { + std::cerr << "Bad cast during option parsing: " << e.what() << "\n"; + return 1; + } + catch (const std::runtime_error &e) { + std::cerr << "An error occurred: " << e.what() << std::endl; + return 1; + } } + diff --git a/src/tool.h b/src/tool.h index de30037..9072f50 100644 --- a/src/tool.h +++ b/src/tool.h @@ -80,6 +80,41 @@ std::istream& operator>>(std::istream& in, MineMode& mode) { } return in; } + +enum SearchMode { + Prefix, + Sequence, + Series, + Scatter +}; + +std::string searchModeToString(const SearchMode& mode) { + switch(mode) { + case SearchMode::Prefix: return "Prefix"; + case SearchMode::Sequence: return "Sequence"; + case SearchMode::Series: return "Series"; // added + case SearchMode::Scatter: return "Scatter"; // added + default: throw std::runtime_error("Unknown search mode"); + } +} + +std::istream& operator>>(std::istream& in, SearchMode& mode) { + std::string token; + in >> token; + if (token == "prefix") { + mode = SearchMode::Prefix; + } else if (token == "Sequence") { + mode = SearchMode::Sequence; + } else if (token == "Series") { + mode = SearchMode::Series; + } else if (token == "Scatter" ) { + mode = SearchMode::Scatter; + } else { + in.setstate(std::ios_base::failbit); + } + return in; +} + // Stream retrieval (stdin vs file) std::istream& getInputStream() { #ifdef _WIN32 From e7645baea824fc6b9beb1b5331c4aadce9626375 Mon Sep 17 00:00:00 2001 From: DOSAYGO Development Team Date: Fri, 27 Dec 2024 13:19:54 +0800 Subject: [PATCH 09/22] ok --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index 64e3886..e78e476 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,5 @@ +*.rc +*.rc.dec rain/**/* rainsum .*.swp From 7eae0385be923da7779efe0774494a3464afc606 Mon Sep 17 00:00:00 2001 From: DOSAYGO Development Team Date: Fri, 27 Dec 2024 13:22:09 +0800 Subject: [PATCH 10/22] ok --- src/rainsum.cpp | 327 +++++++++++++++++++++++++++++++----------------- 1 file changed, 210 insertions(+), 117 deletions(-) diff --git a/src/rainsum.cpp b/src/rainsum.cpp index 6489f96..1fa8e25 100644 --- a/src/rainsum.cpp +++ b/src/rainsum.cpp @@ -440,46 +440,91 @@ static void puzzleEncryptFileWithHeader( std::uniform_int_distribution dist; for (size_t blockIndex = 0; blockIndex < totalBlocks; blockIndex++) { - size_t thisBlockSize = std::min(blockSize, plainData.size() - blockIndex * blockSize); - std::vector block( - plainData.begin() + blockIndex * blockSize, - plainData.begin() + blockIndex * blockSize + thisBlockSize - ); - - bool found = false; - std::vector chosenNonce(nonceSize, 0); - uint8_t startIndex = 0; - - for (uint64_t tries = 0; ; tries++) { // No fixed MAX_TRIES - for (size_t i = 0; i < nonceSize; i++) { - chosenNonce[i] = static_cast(dist(rng) & 0xFF); + size_t thisBlockSize = std::min(blockSize, remaining); + std::vector block( + plainData.begin() + blockIndex * blockSize, + plainData.begin() + blockIndex * blockSize + thisBlockSize + ); + + bool found = false; + std::vector chosenNonce(nonceSize, 0); + // For 'scatter'/'series' mode, we need to store multiple indices + std::vector scatterIndices(thisBlockSize, 0); // Initialize with zeros + + for (uint64_t tries = 0; ; tries++) { // No fixed MAX_TRIES + // Generate random nonce + for (size_t i = 0; i < nonceSize; i++) { + chosenNonce[i] = static_cast(dist(rng) & 0xFF); + } + + // Build trial buffer + std::vector trial(keyBuf); + trial.insert(trial.end(), chosenNonce.begin(), chosenNonce.end()); + + // Hash it + invokeHash(algot, seed, trial, hashOut, hash_size); + + if (searchModeEnum == 0x00) { // Prefix + if (hashOut.size() >= thisBlockSize && + std::equal(block.begin(), block.end(), hashOut.begin())) { + // Found at the front + scatterIndices.assign(thisBlockSize, 0); // All indices are 0 + found = true; + } + } + else if (searchModeEnum == 0x01) { // Sequence + // Search for block as a contiguous substring + for (size_t i = 0; i <= hashOut.size() - thisBlockSize; i++) { + if (std::equal(block.begin(), block.end(), hashOut.begin() + i)) { + scatterIndices.assign(thisBlockSize, i); // All bytes start at 'i' + found = true; + break; + } + } + } + else if (searchModeEnum == 0x02) { // Series (same as Scatter) + bool allFound = true; + for (size_t byteIdx = 0; byteIdx < thisBlockSize; byteIdx++) { + auto it = std::find(hashOut.begin(), hashOut.end(), block[byteIdx]); + if (it != hashOut.end()) { + scatterIndices[byteIdx] = std::distance(hashOut.begin(), it); + } + else { + allFound = false; + break; + } + } + if (allFound) { + found = true; + } + } + + if (found) break; + + // Optional: Implement a maximum number of tries to prevent infinite loops + // Example: + /* + if (tries > MAX_TRIES) { + throw std::runtime_error("Failed to find a suitable nonce for block " + std::to_string(blockIndex)); + } + */ + + if (tries % 1'000'000 == 0) { + std::cerr << "\r[Enc] Block " << blockIndex << ", " << tries << " tries... " << std::flush; + } } - // Build trial buffer - std::vector trial(keyBuf); - trial.insert(trial.end(), chosenNonce.begin(), chosenNonce.end()); - - // Hash it - invokeHash(algot, seed, trial, hashOut, hash_size); - - // Search block in digest (not just at start) - for (uint8_t i = 0; i <= hashOut.size() - thisBlockSize; i++) { - if (std::equal(block.begin(), block.end(), hashOut.begin() + i)) { - startIndex = i; - found = true; - break; - } + // Write nonce and indices + fout.write(reinterpret_cast(chosenNonce.data()), nonceSize); + if (searchModeEnum == 0x02) { // Series/Scatter + // Write each index as size_t + fout.write(reinterpret_cast(scatterIndices.data()), scatterIndices.size() * sizeof(size_t)); } - if (found) break; - - if (tries % 1'000'000 == 0) { - std::cerr << "\r[Enc] Block " << blockIndex << ", " << tries << " tries... " << std::flush; + else { // Prefix and Sequence + // Write single start index (uint8_t) + uint8_t startIndex = static_cast(scatterIndices[0]); + fout.write(reinterpret_cast(&startIndex), sizeof(startIndex)); } - } - - // Write nonce + start index - fout.write(reinterpret_cast(chosenNonce.data()), nonceSize); - fout.write(reinterpret_cast(&startIndex), sizeof(startIndex)); } fout.close(); @@ -487,103 +532,151 @@ static void puzzleEncryptFileWithHeader( } static void puzzleDecryptFileWithHeader( - const std::string &inFilename, - const std::string &outFilename, - const std::string &key, - uint64_t seed + const std::string &inFilename, + const std::string &outFilename, + const std::string &key, + uint64_t seed ) { - // Open input file - std::ifstream fin(inFilename, std::ios::binary); - if (!fin.is_open()) { - throw std::runtime_error("Cannot open ciphertext file: " + inFilename); - } + // Open input file + std::ifstream fin(inFilename, std::ios::binary); + if (!fin.is_open()) { + throw std::runtime_error("Cannot open ciphertext file: " + inFilename); + } - // Read header - uint32_t magicNumber; - uint8_t version; - uint8_t blockSize; - uint8_t nonceSize; - uint16_t hash_size; - uint8_t hashNameLength; - std::string hashName; - uint8_t searchModeEnum; - uint64_t originalSize; - - fin.read(reinterpret_cast(&magicNumber), sizeof(magicNumber)); - fin.read(reinterpret_cast(&version), sizeof(version)); - fin.read(reinterpret_cast(&blockSize), sizeof(blockSize)); - fin.read(reinterpret_cast(&nonceSize), sizeof(nonceSize)); - fin.read(reinterpret_cast(&hash_size), sizeof(hash_size)); - fin.read(reinterpret_cast(&hashNameLength), sizeof(hashNameLength)); - - hashName.resize(hashNameLength); - fin.read(&hashName[0], hashNameLength); - fin.read(reinterpret_cast(&searchModeEnum), sizeof(searchModeEnum)); - fin.read(reinterpret_cast(&originalSize), sizeof(originalSize)); - - if (magicNumber != 0x52435259) { - throw std::runtime_error("Invalid magic number in header."); - } + // Read header + uint32_t magicNumber; + uint8_t version; + uint8_t blockSize; + uint8_t nonceSize; + uint16_t hash_size; + uint8_t hashNameLength; + std::string hashName; + uint8_t searchModeEnum; + uint64_t originalSize; + + fin.read(reinterpret_cast(&magicNumber), sizeof(magicNumber)); + fin.read(reinterpret_cast(&version), sizeof(version)); + fin.read(reinterpret_cast(&blockSize), sizeof(blockSize)); + fin.read(reinterpret_cast(&nonceSize), sizeof(nonceSize)); + fin.read(reinterpret_cast(&hash_size), sizeof(hash_size)); + fin.read(reinterpret_cast(&hashNameLength), sizeof(hashNameLength)); + + hashName.resize(hashNameLength); + fin.read(&hashName[0], hashNameLength); + fin.read(reinterpret_cast(&searchModeEnum), sizeof(searchModeEnum)); + fin.read(reinterpret_cast(&originalSize), sizeof(originalSize)); + + if (magicNumber != 0x52435259) { // Replace with your actual magic number + throw std::runtime_error("Invalid magic number in header."); + } - HashAlgorithm algot = (hashName == "rainbow") ? HashAlgorithm::Rainbow : HashAlgorithm::Rainstorm; + HashAlgorithm algot = (hashName == "rainbow") ? HashAlgorithm::Rainbow : + (hashName == "rainstorm") ? HashAlgorithm::Rainstorm : + HashAlgorithm::Unknown; - // Read the rest of the file as cipher data - std::vector cipherData( - (std::istreambuf_iterator(fin)), - (std::istreambuf_iterator()) - ); - fin.close(); + if (algot == HashAlgorithm::Unknown) { + throw std::runtime_error("Unsupported hash algorithm in header."); + } - // Each block consists of nonceSize bytes + 1 byte (startIndex) - size_t blockCipherSize = nonceSize + 1; - if (cipherData.size() % blockCipherSize != 0) { - throw std::runtime_error("[Dec] Cipher data not multiple of blockCipherSize bytes after header!"); - } - size_t totalBlocks = cipherData.size() / blockCipherSize; + // Read the rest of the file as cipher data + std::vector cipherData( + (std::istreambuf_iterator(fin)), + (std::istreambuf_iterator()) + ); + fin.close(); + + // Each block consists of: + // - nonceSize bytes + 1 byte (prefix/sequence) OR + // - nonceSize bytes + (blockSize * sizeof(size_t)) bytes (series/scatter) + size_t blockCipherSize; + if (searchModeEnum == 0x02) { // Series/Scatter + blockCipherSize = nonceSize + (blockSize * sizeof(size_t)); + } + else { // Prefix/Sequence + blockCipherSize = nonceSize + 1; + } - // Prepare output file - std::ofstream fout(outFilename, std::ios::binary); - if (!fout.is_open()) { - throw std::runtime_error("Cannot open output file for plaintext: " + outFilename); - } + if (cipherData.size() % blockCipherSize != 0) { + throw std::runtime_error("[Dec] Cipher data not multiple of blockCipherSize bytes after header!"); + } + size_t totalBlocks = cipherData.size() / blockCipherSize; - // Reconstruct plaintext blocks - std::vector keyBuf(key.begin(), key.end()); - std::vector hashOut(hash_size / 8); + // Prepare output file + std::ofstream fout(outFilename, std::ios::binary); + if (!fout.is_open()) { + throw std::runtime_error("Cannot open output file for plaintext: " + outFilename); + } - size_t recoveredSoFar = 0; + // Reconstruct plaintext blocks + std::vector keyBuf(key.begin(), key.end()); + std::vector hashOut(hash_size / 8); + + size_t recoveredSoFar = 0; + + for (size_t i = 0; i < totalBlocks; i++) { + // Extract nonce + std::vector storedNonce(cipherData.begin() + i * blockCipherSize, + cipherData.begin() + i * blockCipherSize + nonceSize); + + // Read indices based on search mode + std::vector scatterIndices; + uint8_t startIndex = 0; + if (searchModeEnum == 0x02) { // Series/Scatter + scatterIndices.resize(blockSize); + for (size_t j = 0; j < blockSize; j++) { + size_t idx; + fin.read(reinterpret_cast(&idx), sizeof(idx)); + scatterIndices[j] = idx; + } + } + else { // Prefix/Sequence + fin.read(reinterpret_cast(&startIndex), sizeof(startIndex)); + } - for (size_t i = 0; i < totalBlocks; i++) { - // Extract nonce and startIndex for each block - std::vector storedNonce(cipherData.begin() + i * blockCipherSize, - cipherData.begin() + i * blockCipherSize + nonceSize); - uint8_t startIndex = cipherData[i * blockCipherSize + nonceSize]; + // Recompute the hash + std::vector trial(keyBuf); + trial.insert(trial.end(), storedNonce.begin(), storedNonce.end()); + invokeHash(algot, seed, trial, hashOut, hash_size); - // Recompute the hash - std::vector trial(keyBuf); - trial.insert(trial.end(), storedNonce.begin(), storedNonce.end()); - invokeHash(algot, seed, trial, hashOut, hash_size); + // Determine the size of the current block + size_t remaining = originalSize - recoveredSoFar; + size_t thisBlockSize = std::min(static_cast(blockSize), remaining); - // Determine the size of the current block - size_t remaining = originalSize - recoveredSoFar; - size_t thisBlockSize = std::min(blockSize, remaining); + std::vector plaintextBlock; - if (startIndex + thisBlockSize > hashOut.size()) { - throw std::runtime_error("[Dec] Invalid start index or block size exceeds hash digest size."); - } + if (searchModeEnum == 0x00) { // Prefix + plaintextBlock.assign(hashOut.begin(), hashOut.begin() + thisBlockSize); + } + else if (searchModeEnum == 0x01) { // Sequence + plaintextBlock.assign(hashOut.begin() + startIndex, + hashOut.begin() + startIndex + thisBlockSize); + } + else if (searchModeEnum == 0x02) { // Series/Scatter + plaintextBlock.reserve(thisBlockSize); + for (size_t j = 0; j < thisBlockSize; j++) { + if (scatterIndices[j] < hashOut.size()) { + plaintextBlock.push_back(hashOut[scatterIndices[j]]); + } + else { + throw std::runtime_error("[Dec] Scatter index out of range."); + } + } + } - // Write the plaintext block - fout.write(reinterpret_cast(hashOut.data() + startIndex), thisBlockSize); - recoveredSoFar += thisBlockSize; + // Write the plaintext block + if (!plaintextBlock.empty()) { + fout.write(reinterpret_cast(plaintextBlock.data()), thisBlockSize); + recoveredSoFar += thisBlockSize; + } - // Early exit if all data is recovered - if (recoveredSoFar >= originalSize) { - break; + // Early exit if all data is recovered + if (recoveredSoFar >= originalSize) { + break; + } } - } - fout.close(); - std::cout << "[Dec] Ciphertext " << inFilename << " decrypted successfully.\n"; + fout.close(); + std::cout << "[Dec] Ciphertext " << inFilename << " decrypted successfully.\n"; } From e1f7de40e41f77d15f24fb0c9e3e97c7bcb82b53 Mon Sep 17 00:00:00 2001 From: DOSAYGO Development Team Date: Fri, 27 Dec 2024 14:41:29 +0800 Subject: [PATCH 11/22] Prefix, sequence and series/scatter work --- Makefile.rc | Bin 5615 -> 6856 bytes TEST123.txt | 5 + make | 0 src/rainsum.cpp | 400 +++++++++++++++++++++++++----------------------- 4 files changed, 217 insertions(+), 188 deletions(-) create mode 100644 TEST123.txt create mode 100644 make diff --git a/Makefile.rc b/Makefile.rc index 9995473b17c71744be4b7b33664a22bfadd4d912..a3a170a46b833d1a3e03fc86b756a91a884e5b10 100644 GIT binary patch literal 6856 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 SHe-Z5D@T19I{4IrqW%X}%MB#} literal 5615 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 plainData((std::istreambuf_iterator(fin)), - (std::istreambuf_iterator())); - fin.close(); - - // Open output file - std::ofstream fout(outFilename, std::ios::binary); - if (!fout.is_open()) { - throw std::runtime_error("Cannot open output file: " + outFilename); - } + // Open input file + std::ifstream fin(inFilename, std::ios::binary); + if (!fin.is_open()) { + throw std::runtime_error("Cannot open input file: " + inFilename); + } + std::vector plainData((std::istreambuf_iterator(fin)), + (std::istreambuf_iterator())); + fin.close(); - // Write header - uint32_t magicNumber = 0x52435259; // "RCRY" - uint8_t version = 0x01; - uint8_t blockSize8 = static_cast(blockSize); - uint8_t nonceSize8 = static_cast(nonceSize); - uint16_t digestSize16 = static_cast(hash_size); - uint8_t searchModeEnum = 0x00; // Default to 'prefix' - if (searchMode == "prefix") searchModeEnum = 0x00; - else if (searchMode == "sequence") searchModeEnum = 0x01; - else if (searchMode == "series") searchModeEnum = 0x02; - else if (searchMode == "scatter") searchModeEnum = 0x03; - - std::string hashName = (algot == HashAlgorithm::Rainbow) ? "rainbow" : "rainstorm"; - uint8_t hashNameLength = static_cast(hashName.size()); - - fout.write(reinterpret_cast(&magicNumber), sizeof(magicNumber)); - fout.write(reinterpret_cast(&version), sizeof(version)); - fout.write(reinterpret_cast(&blockSize8), sizeof(blockSize8)); - fout.write(reinterpret_cast(&nonceSize8), sizeof(nonceSize8)); - fout.write(reinterpret_cast(&digestSize16), sizeof(digestSize16)); - fout.write(reinterpret_cast(&hashNameLength), sizeof(hashNameLength)); - fout.write(hashName.data(), hashName.size()); - fout.write(reinterpret_cast(&searchModeEnum), sizeof(searchModeEnum)); - - uint64_t originalSize = plainData.size(); - fout.write(reinterpret_cast(&originalSize), sizeof(originalSize)); - - // Partition plaintext into blocks - size_t totalBlocks = (plainData.size() + blockSize - 1) / blockSize; - std::vector hashOut(hash_size / 8); - std::vector keyBuf(key.begin(), key.end()); - - // Prepare random generator for nonce - std::mt19937_64 rng(std::random_device{}()); - std::uniform_int_distribution dist; - - for (size_t blockIndex = 0; blockIndex < totalBlocks; blockIndex++) { - size_t thisBlockSize = std::min(blockSize, remaining); - std::vector block( - plainData.begin() + blockIndex * blockSize, - plainData.begin() + blockIndex * blockSize + thisBlockSize - ); - - bool found = false; - std::vector chosenNonce(nonceSize, 0); - // For 'scatter'/'series' mode, we need to store multiple indices - std::vector scatterIndices(thisBlockSize, 0); // Initialize with zeros - - for (uint64_t tries = 0; ; tries++) { // No fixed MAX_TRIES - // Generate random nonce - for (size_t i = 0; i < nonceSize; i++) { - chosenNonce[i] = static_cast(dist(rng) & 0xFF); - } - - // Build trial buffer - std::vector trial(keyBuf); - trial.insert(trial.end(), chosenNonce.begin(), chosenNonce.end()); - - // Hash it - invokeHash(algot, seed, trial, hashOut, hash_size); - - if (searchModeEnum == 0x00) { // Prefix - if (hashOut.size() >= thisBlockSize && - std::equal(block.begin(), block.end(), hashOut.begin())) { - // Found at the front - scatterIndices.assign(thisBlockSize, 0); // All indices are 0 - found = true; - } - } - else if (searchModeEnum == 0x01) { // Sequence - // Search for block as a contiguous substring - for (size_t i = 0; i <= hashOut.size() - thisBlockSize; i++) { - if (std::equal(block.begin(), block.end(), hashOut.begin() + i)) { - scatterIndices.assign(thisBlockSize, i); // All bytes start at 'i' - found = true; - break; - } - } - } - else if (searchModeEnum == 0x02) { // Series (same as Scatter) - bool allFound = true; - for (size_t byteIdx = 0; byteIdx < thisBlockSize; byteIdx++) { - auto it = std::find(hashOut.begin(), hashOut.end(), block[byteIdx]); - if (it != hashOut.end()) { - scatterIndices[byteIdx] = std::distance(hashOut.begin(), it); - } - else { - allFound = false; - break; - } - } - if (allFound) { - found = true; - } - } - - if (found) break; - - // Optional: Implement a maximum number of tries to prevent infinite loops - // Example: - /* - if (tries > MAX_TRIES) { - throw std::runtime_error("Failed to find a suitable nonce for block " + std::to_string(blockIndex)); - } - */ - - if (tries % 1'000'000 == 0) { - std::cerr << "\r[Enc] Block " << blockIndex << ", " << tries << " tries... " << std::flush; - } - } + // Open output file + std::ofstream fout(outFilename, std::ios::binary); + if (!fout.is_open()) { + throw std::runtime_error("Cannot open output file: " + outFilename); + } - // Write nonce and indices - fout.write(reinterpret_cast(chosenNonce.data()), nonceSize); - if (searchModeEnum == 0x02) { // Series/Scatter - // Write each index as size_t - fout.write(reinterpret_cast(scatterIndices.data()), scatterIndices.size() * sizeof(size_t)); - } - else { // Prefix and Sequence - // Write single start index (uint8_t) - uint8_t startIndex = static_cast(scatterIndices[0]); - fout.write(reinterpret_cast(&startIndex), sizeof(startIndex)); - } - } + // Write header + uint32_t magicNumber = 0x52435259; // "RCRY" + uint8_t version = 0x01; + uint8_t blockSize8 = static_cast(blockSize); + uint8_t nonceSize8 = static_cast(nonceSize); + uint16_t digestSize16 = static_cast(hash_size); + uint8_t searchModeEnum = 0x00; // Default to 'prefix' + if (searchMode == "prefix") searchModeEnum = 0x00; + else if (searchMode == "sequence") searchModeEnum = 0x01; + else if (searchMode == "series" || searchMode == "scatter") searchModeEnum = 0x02; // Treat 'series' same as 'scatter' + else { + throw std::runtime_error("Invalid search mode: " + searchMode); + } + + std::string hashName = (algot == HashAlgorithm::Rainbow) ? "rainbow" : "rainstorm"; + uint8_t hashNameLength = static_cast(hashName.size()); + + fout.write(reinterpret_cast(&magicNumber), sizeof(magicNumber)); + fout.write(reinterpret_cast(&version), sizeof(version)); + fout.write(reinterpret_cast(&blockSize8), sizeof(blockSize8)); + fout.write(reinterpret_cast(&nonceSize8), sizeof(nonceSize8)); + fout.write(reinterpret_cast(&digestSize16), sizeof(digestSize16)); + fout.write(reinterpret_cast(&hashNameLength), sizeof(hashNameLength)); + fout.write(hashName.data(), hashName.size()); + fout.write(reinterpret_cast(&searchModeEnum), sizeof(searchModeEnum)); + + uint64_t originalSize = plainData.size(); + fout.write(reinterpret_cast(&originalSize), sizeof(originalSize)); + + // Partition plaintext into blocks + size_t totalBlocks = (plainData.size() + blockSize - 1) / blockSize; + std::vector hashOut(hash_size / 8); + std::vector keyBuf(key.begin(), key.end()); + + // Prepare random generator for nonce + std::mt19937_64 rng(std::random_device{}()); + std::uniform_int_distribution dist; - fout.close(); - std::cout << "[Enc] Encryption complete: " << outFilename << "\n"; + size_t remaining = originalSize; + + for (size_t blockIndex = 0; blockIndex < totalBlocks; blockIndex++) { + size_t thisBlockSize = std::min(blockSize, remaining); + remaining -= thisBlockSize; // Corrected subtraction + std::vector block( + plainData.begin() + blockIndex * blockSize, + plainData.begin() + blockIndex * blockSize + thisBlockSize + ); + + bool found = false; + std::vector chosenNonce(nonceSize, 0); + std::vector scatterIndices(thisBlockSize, 0); // Changed to uint8_t + + for (uint64_t tries = 0; ; tries++) { // No fixed MAX_TRIES + // Generate random nonce + for (size_t i = 0; i < nonceSize; i++) { + chosenNonce[i] = static_cast(dist(rng) & 0xFF); + } + + // Build trial buffer + std::vector trial(keyBuf); + trial.insert(trial.end(), chosenNonce.begin(), chosenNonce.end()); + + // Hash it + invokeHash(algot, seed, trial, hashOut, hash_size); + + if (searchModeEnum == 0x00) { // Prefix + if (hashOut.size() >= thisBlockSize && + std::equal(block.begin(), block.end(), hashOut.begin())) { + // Found at the front + scatterIndices.assign(thisBlockSize, 0); // All indices are 0 + found = true; + } + } + else if (searchModeEnum == 0x01) { // Sequence + // Search for block as a contiguous substring + bool seqFound = false; + uint8_t startIdx = 0; + for (size_t i = 0; i <= hashOut.size() - thisBlockSize; i++) { + if (std::equal(block.begin(), block.end(), hashOut.begin() + i)) { + startIdx = static_cast(i); // Ensure it fits in uint8_t + scatterIndices.assign(thisBlockSize, startIdx); // All bytes share the same start index + found = true; + seqFound = true; + break; + } + } + } + else if (searchModeEnum == 0x02) { // Series/Scatter + bool allFound = true; + for (size_t byteIdx = 0; byteIdx < thisBlockSize; byteIdx++) { + auto it = std::find(hashOut.begin(), hashOut.end(), block[byteIdx]); + if (it != hashOut.end()) { + scatterIndices[byteIdx] = static_cast(std::distance(hashOut.begin(), it)); + } + else { + allFound = false; + break; + } + } + if (allFound) { + found = true; + } + } + + if (found) break; + + // Optional: Implement a maximum number of tries to prevent infinite loops + // Example: + /* + if (tries > MAX_TRIES) { + throw std::runtime_error("Failed to find a suitable nonce for block " + std::to_string(blockIndex)); + } + */ + + if (tries % 1'000'000 == 0) { + std::cerr << "\r[Enc] Block " << blockIndex << ", " << tries << " tries... " << std::flush; + } + } + + // Write nonce and indices + fout.write(reinterpret_cast(chosenNonce.data()), nonceSize); + if (searchModeEnum == 0x02) { // Series/Scatter + // Write each index as uint8_t + fout.write(reinterpret_cast(scatterIndices.data()), scatterIndices.size() * sizeof(uint8_t)); + } + else { // Prefix/Sequence + // Write single start index + uint8_t startIndex = scatterIndices[0]; + fout.write(reinterpret_cast(&startIndex), sizeof(startIndex)); + } + } + + fout.close(); + std::cout << "[Enc] Encryption complete: " << outFilename << "\n"; } static void puzzleDecryptFileWithHeader( @@ -566,7 +574,7 @@ static void puzzleDecryptFileWithHeader( fin.read(reinterpret_cast(&searchModeEnum), sizeof(searchModeEnum)); fin.read(reinterpret_cast(&originalSize), sizeof(originalSize)); - if (magicNumber != 0x52435259) { // Replace with your actual magic number + if (magicNumber != 0x52435259) { // "RCRY" throw std::runtime_error("Invalid magic number in header."); } @@ -587,19 +595,29 @@ static void puzzleDecryptFileWithHeader( // Each block consists of: // - nonceSize bytes + 1 byte (prefix/sequence) OR - // - nonceSize bytes + (blockSize * sizeof(size_t)) bytes (series/scatter) + // - nonceSize bytes + (thisBlockSize * sizeof(uint8_t)) bytes (series/scatter) size_t blockCipherSize; - if (searchModeEnum == 0x02) { // Series/Scatter - blockCipherSize = nonceSize + (blockSize * sizeof(size_t)); - } - else { // Prefix/Sequence - blockCipherSize = nonceSize + 1; + // Calculate maximum block size (all blocks except possibly the last) + size_t maxThisBlockSize = blockSize; + // For decryption, to handle partial blocks, we'll iterate based on the original size + // Calculate total blocks + size_t totalBlocks = (originalSize + blockSize - 1) / blockSize; + + // Verify cipherData size + size_t expectedCipherDataSize = 0; + for (size_t blockIdx = 0; blockIdx < totalBlocks; blockIdx++) { + size_t thisBlockSize = std::min(blockSize, originalSize - blockIdx * blockSize); + if (searchModeEnum == 0x02) { // Series/Scatter + expectedCipherDataSize += nonceSize + thisBlockSize * sizeof(uint8_t); + } + else { // Prefix/Sequence + expectedCipherDataSize += nonceSize + sizeof(uint8_t); + } } - if (cipherData.size() % blockCipherSize != 0) { - throw std::runtime_error("[Dec] Cipher data not multiple of blockCipherSize bytes after header!"); + if (cipherData.size() != expectedCipherDataSize) { + throw std::runtime_error("[Dec] Cipher data size mismatch."); } - size_t totalBlocks = cipherData.size() / blockCipherSize; // Prepare output file std::ofstream fout(outFilename, std::ios::binary); @@ -612,25 +630,28 @@ static void puzzleDecryptFileWithHeader( std::vector hashOut(hash_size / 8); size_t recoveredSoFar = 0; + size_t cipherOffset = 0; // To track reading position in cipherData + + for (size_t blockIndex = 0; blockIndex < totalBlocks; blockIndex++) { + size_t thisBlockSize = std::min(static_cast(blockSize), originalSize - recoveredSoFar); + std::vector block; - for (size_t i = 0; i < totalBlocks; i++) { // Extract nonce - std::vector storedNonce(cipherData.begin() + i * blockCipherSize, - cipherData.begin() + i * blockCipherSize + nonceSize); + std::vector storedNonce(cipherData.begin() + cipherOffset, + cipherData.begin() + cipherOffset + nonceSize); + cipherOffset += nonceSize; // Read indices based on search mode - std::vector scatterIndices; + std::vector scatterIndices; // For series/scatter uint8_t startIndex = 0; if (searchModeEnum == 0x02) { // Series/Scatter - scatterIndices.resize(blockSize); - for (size_t j = 0; j < blockSize; j++) { - size_t idx; - fin.read(reinterpret_cast(&idx), sizeof(idx)); - scatterIndices[j] = idx; - } + scatterIndices.resize(thisBlockSize); + std::memcpy(scatterIndices.data(), &cipherData[cipherOffset], thisBlockSize * sizeof(uint8_t)); + cipherOffset += thisBlockSize * sizeof(uint8_t); } else { // Prefix/Sequence - fin.read(reinterpret_cast(&startIndex), sizeof(startIndex)); + std::memcpy(&startIndex, &cipherData[cipherOffset], sizeof(uint8_t)); + cipherOffset += sizeof(uint8_t); } // Recompute the hash @@ -638,48 +659,51 @@ static void puzzleDecryptFileWithHeader( trial.insert(trial.end(), storedNonce.begin(), storedNonce.end()); invokeHash(algot, seed, trial, hashOut, hash_size); - // Determine the size of the current block - size_t remaining = originalSize - recoveredSoFar; - size_t thisBlockSize = std::min(static_cast(blockSize), remaining); - - std::vector plaintextBlock; - + // Reconstruct plaintext block based on search mode if (searchModeEnum == 0x00) { // Prefix - plaintextBlock.assign(hashOut.begin(), hashOut.begin() + thisBlockSize); + // Take the first 'thisBlockSize' bytes from hashOut + block.assign(hashOut.begin(), hashOut.begin() + thisBlockSize); } else if (searchModeEnum == 0x01) { // Sequence - plaintextBlock.assign(hashOut.begin() + startIndex, - hashOut.begin() + startIndex + thisBlockSize); + // Take 'thisBlockSize' bytes starting from 'startIndex' + if (startIndex + thisBlockSize > hashOut.size()) { + throw std::runtime_error("[Dec] Start index out of bounds in sequence mode."); + } + block.assign(hashOut.begin() + startIndex, hashOut.begin() + startIndex + thisBlockSize); } else if (searchModeEnum == 0x02) { // Series/Scatter - plaintextBlock.reserve(thisBlockSize); + // Extract each byte from the specified indices + block.reserve(thisBlockSize); for (size_t j = 0; j < thisBlockSize; j++) { - if (scatterIndices[j] < hashOut.size()) { - plaintextBlock.push_back(hashOut[scatterIndices[j]]); - } - else { + uint8_t idx = scatterIndices[j]; + if (idx >= hashOut.size()) { throw std::runtime_error("[Dec] Scatter index out of range."); } + block.push_back(hashOut[idx]); } } + else { + throw std::runtime_error("Invalid search mode enum in decryption."); + } // Write the plaintext block - if (!plaintextBlock.empty()) { - fout.write(reinterpret_cast(plaintextBlock.data()), thisBlockSize); + if (!block.empty()) { + fout.write(reinterpret_cast(block.data()), thisBlockSize); recoveredSoFar += thisBlockSize; } - // Early exit if all data is recovered - if (recoveredSoFar >= originalSize) { - break; + // Optional: Progress reporting + if (blockIndex % 100 == 0) { + std::cerr << "\r[Dec] Processing block " << blockIndex << " / " << totalBlocks << std::flush; } } fout.close(); - std::cout << "[Dec] Ciphertext " << inFilename << " decrypted successfully.\n"; + std::cout << "\n[Dec] Ciphertext " << inFilename << " decrypted successfully.\n"; } + // The main function int main(int argc, char** argv) { try { From 3af2d8ae3b1c820731df1a3ae2db4035a12349a5 Mon Sep 17 00:00:00 2001 From: DOSAYGO Development Team Date: Fri, 27 Dec 2024 14:41:59 +0800 Subject: [PATCH 12/22] ok --- .gitignore | 1 + TEST123.txt | 5 ----- 2 files changed, 1 insertion(+), 5 deletions(-) delete mode 100644 TEST123.txt diff --git a/.gitignore b/.gitignore index e78e476..af8d732 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ +TEST* *.rc *.rc.dec rain/**/* diff --git a/TEST123.txt b/TEST123.txt deleted file mode 100644 index b844a3f..0000000 --- a/TEST123.txt +++ /dev/null @@ -1,5 +0,0 @@ -Hello I am Cris -I am Love - -YES! - From ba2cea5edea9f1715e5739dd1728b5da8fc63dd3 Mon Sep 17 00:00:00 2001 From: DOSAYGO Development Team Date: Fri, 27 Dec 2024 14:42:10 +0800 Subject: [PATCH 13/22] ok --- make | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 make diff --git a/make b/make deleted file mode 100644 index e69de29..0000000 From e6cbe70f702e5f466d50f76b858aa779e22c3b57 Mon Sep 17 00:00:00 2001 From: DOSAYGO Development Team Date: Fri, 27 Dec 2024 14:59:45 +0800 Subject: [PATCH 14/22] Prefix, sequence and series work --- Makefile.rc | Bin 6856 -> 6856 bytes src/rainsum.cpp | 30 ++++++++++++++++++++++++++---- 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/Makefile.rc b/Makefile.rc index a3a170a46b833d1a3e03fc86b756a91a884e5b10..f0a4f329c3977a5fa62008228c922165089ada8d 100644 GIT binary patch literal 6856 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 V-CvDH5n^H8VPN#B$gLq<`hRitGot_i literal 6856 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 SHe-Z5D@T19I{4IrqW%X}%MB#} diff --git a/src/rainsum.cpp b/src/rainsum.cpp index f6d8440..f6e3142 100644 --- a/src/rainsum.cpp +++ b/src/rainsum.cpp @@ -10,6 +10,7 @@ #include #include #include +#include #include #include #include @@ -444,6 +445,7 @@ static void puzzleEncryptFileWithHeader( size_t remaining = originalSize; for (size_t blockIndex = 0; blockIndex < totalBlocks; blockIndex++) { + std::bitset<64> usedIndices; size_t thisBlockSize = std::min(blockSize, remaining); remaining -= thisBlockSize; // Corrected subtraction std::vector block( @@ -492,16 +494,36 @@ static void puzzleEncryptFileWithHeader( } else if (searchModeEnum == 0x02) { // Series/Scatter bool allFound = true; + usedIndices.reset(); // Clear used indices for the current block + for (size_t byteIdx = 0; byteIdx < thisBlockSize; byteIdx++) { - auto it = std::find(hashOut.begin(), hashOut.end(), block[byteIdx]); - if (it != hashOut.end()) { - scatterIndices[byteIdx] = static_cast(std::distance(hashOut.begin(), it)); + auto it = hashOut.begin(); + + // Loop to find a valid index for the current byte + while (it != hashOut.end()) { + // Find the next occurrence of block[byteIdx] + it = std::find(it, hashOut.end(), block[byteIdx]); + + if (it != hashOut.end()) { // Found a match + uint8_t idx = static_cast(std::distance(hashOut.begin(), it)); + + if (!usedIndices.test(idx)) { // Ensure the index is not already used + scatterIndices[byteIdx] = idx; // Store the index + usedIndices.set(idx); // Mark it as used + break; // Exit loop for this byte + } + + // Advance to the next position for further search + ++it; + } } - else { + + if (it == hashOut.end()) { // No valid index found for this byte allFound = false; break; } } + if (allFound) { found = true; } From 2e08a4c9a080677cb88c68176cc9226e9127e5ea Mon Sep 17 00:00:00 2001 From: DOSAYGO Development Team Date: Fri, 27 Dec 2024 15:11:46 +0800 Subject: [PATCH 15/22] After add decompress --- Makefile | 2 +- src/rainsum.cpp | 155 +++++++++++++++++++++++++++++++----------------- 2 files changed, 101 insertions(+), 56 deletions(-) diff --git a/Makefile b/Makefile index 9f530cf..11570d6 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,7 @@ CXX = clang++ CXXFLAGS = -std=c++17 -Wall -Wextra -pedantic -O3 CXXFLAGS += -isysroot $(shell xcrun --show-sdk-path) -CXXFLAGS += -fuse-ld=ld +CXXFLAGS += -fuse-ld=ld -lz DEPFLAGS = -MMD -MF $(@:.o=.d) LDFLAGS = diff --git a/src/rainsum.cpp b/src/rainsum.cpp index f6e3142..c7ccf0f 100644 --- a/src/rainsum.cpp +++ b/src/rainsum.cpp @@ -378,6 +378,72 @@ static std::string promptForKey(const std::string &prompt) { } #endif +/* compression helpers */ +#include +#include + +// Compress using zlib +std::vector compressData(const std::vector& data) { + z_stream zs = {}; + if (deflateInit(&zs, Z_BEST_COMPRESSION) != Z_OK) { + throw std::runtime_error("Failed to initialize zlib deflate."); + } + + zs.next_in = const_cast(data.data()); + zs.avail_in = data.size(); + + std::vector compressed; + uint8_t buffer[1024]; + + do { + zs.next_out = buffer; + zs.avail_out = sizeof(buffer); + + if (deflate(&zs, Z_FINISH) == Z_STREAM_ERROR) { + deflateEnd(&zs); + throw std::runtime_error("zlib compression failed."); + } + + compressed.insert(compressed.end(), buffer, buffer + (sizeof(buffer) - zs.avail_out)); + } while (zs.avail_out == 0); + + deflateEnd(&zs); + return compressed; +} + +// Decompress using zlib +std::vector decompressData(const std::vector& data) { + z_stream zs = {}; + if (inflateInit(&zs) != Z_OK) { + throw std::runtime_error("Failed to initialize zlib inflate."); + } + + zs.next_in = const_cast(data.data()); + zs.avail_in = data.size(); + + std::vector decompressed; + uint8_t buffer[1024]; + + do { + zs.next_out = buffer; + zs.avail_out = sizeof(buffer); + + int ret = inflate(&zs, Z_NO_FLUSH); + if (ret == Z_STREAM_ERROR || ret == Z_DATA_ERROR || ret == Z_MEM_ERROR) { + inflateEnd(&zs); + throw std::runtime_error("zlib decompression failed."); + } + + decompressed.insert(decompressed.end(), buffer, buffer + (sizeof(buffer) - zs.avail_out)); + + if (ret == Z_STREAM_END) break; + } while (zs.avail_out == 0); + + inflateEnd(&zs); + return decompressed; +} + + static void puzzleEncryptFileWithHeader( const std::string &inFilename, const std::string &outFilename, @@ -430,6 +496,12 @@ static void puzzleEncryptFileWithHeader( fout.write(hashName.data(), hashName.size()); fout.write(reinterpret_cast(&searchModeEnum), sizeof(searchModeEnum)); + // Compress plaintext + std::vector compressedData = compressData(plainData); + // Replace plainData with compressedData + plainData = std::move(compressedData); + + // Update original size in the header to match compressed size uint64_t originalSize = plainData.size(); fout.write(reinterpret_cast(&originalSize), sizeof(originalSize)); @@ -615,63 +687,34 @@ static void puzzleDecryptFileWithHeader( ); fin.close(); - // Each block consists of: - // - nonceSize bytes + 1 byte (prefix/sequence) OR - // - nonceSize bytes + (thisBlockSize * sizeof(uint8_t)) bytes (series/scatter) - size_t blockCipherSize; - // Calculate maximum block size (all blocks except possibly the last) - size_t maxThisBlockSize = blockSize; - // For decryption, to handle partial blocks, we'll iterate based on the original size - // Calculate total blocks - size_t totalBlocks = (originalSize + blockSize - 1) / blockSize; - // Verify cipherData size - size_t expectedCipherDataSize = 0; - for (size_t blockIdx = 0; blockIdx < totalBlocks; blockIdx++) { - size_t thisBlockSize = std::min(blockSize, originalSize - blockIdx * blockSize); - if (searchModeEnum == 0x02) { // Series/Scatter - expectedCipherDataSize += nonceSize + thisBlockSize * sizeof(uint8_t); - } - else { // Prefix/Sequence - expectedCipherDataSize += nonceSize + sizeof(uint8_t); - } - } - - if (cipherData.size() != expectedCipherDataSize) { - throw std::runtime_error("[Dec] Cipher data size mismatch."); - } - - // Prepare output file - std::ofstream fout(outFilename, std::ios::binary); - if (!fout.is_open()) { - throw std::runtime_error("Cannot open output file for plaintext: " + outFilename); - } + size_t totalBlocks = (originalSize + blockSize - 1) / blockSize; + size_t cipherOffset = 0; - // Reconstruct plaintext blocks + // Prepare to reconstruct plaintext std::vector keyBuf(key.begin(), key.end()); std::vector hashOut(hash_size / 8); + std::vector plaintextAccumulated; // Collect all decrypted blocks size_t recoveredSoFar = 0; - size_t cipherOffset = 0; // To track reading position in cipherData for (size_t blockIndex = 0; blockIndex < totalBlocks; blockIndex++) { - size_t thisBlockSize = std::min(static_cast(blockSize), originalSize - recoveredSoFar); + size_t thisBlockSize = std::min(blockSize, originalSize - recoveredSoFar); std::vector block; // Extract nonce std::vector storedNonce(cipherData.begin() + cipherOffset, - cipherData.begin() + cipherOffset + nonceSize); + cipherData.begin() + cipherOffset + nonceSize); cipherOffset += nonceSize; // Read indices based on search mode - std::vector scatterIndices; // For series/scatter + std::vector scatterIndices; uint8_t startIndex = 0; if (searchModeEnum == 0x02) { // Series/Scatter scatterIndices.resize(thisBlockSize); std::memcpy(scatterIndices.data(), &cipherData[cipherOffset], thisBlockSize * sizeof(uint8_t)); cipherOffset += thisBlockSize * sizeof(uint8_t); - } - else { // Prefix/Sequence + } else { // Prefix/Sequence std::memcpy(&startIndex, &cipherData[cipherOffset], sizeof(uint8_t)); cipherOffset += sizeof(uint8_t); } @@ -683,18 +726,13 @@ static void puzzleDecryptFileWithHeader( // Reconstruct plaintext block based on search mode if (searchModeEnum == 0x00) { // Prefix - // Take the first 'thisBlockSize' bytes from hashOut block.assign(hashOut.begin(), hashOut.begin() + thisBlockSize); - } - else if (searchModeEnum == 0x01) { // Sequence - // Take 'thisBlockSize' bytes starting from 'startIndex' + } else if (searchModeEnum == 0x01) { // Sequence if (startIndex + thisBlockSize > hashOut.size()) { throw std::runtime_error("[Dec] Start index out of bounds in sequence mode."); } block.assign(hashOut.begin() + startIndex, hashOut.begin() + startIndex + thisBlockSize); - } - else if (searchModeEnum == 0x02) { // Series/Scatter - // Extract each byte from the specified indices + } else if (searchModeEnum == 0x02) { // Series/Scatter block.reserve(thisBlockSize); for (size_t j = 0; j < thisBlockSize; j++) { uint8_t idx = scatterIndices[j]; @@ -703,28 +741,35 @@ static void puzzleDecryptFileWithHeader( } block.push_back(hashOut[idx]); } - } - else { + } else { throw std::runtime_error("Invalid search mode enum in decryption."); } - // Write the plaintext block - if (!block.empty()) { - fout.write(reinterpret_cast(block.data()), thisBlockSize); - recoveredSoFar += thisBlockSize; - } + // Append block to accumulated plaintext + plaintextAccumulated.insert(plaintextAccumulated.end(), block.begin(), block.end()); + recoveredSoFar += thisBlockSize; - // Optional: Progress reporting if (blockIndex % 100 == 0) { std::cerr << "\r[Dec] Processing block " << blockIndex << " / " << totalBlocks << std::flush; } } - fout.close(); - std::cout << "\n[Dec] Ciphertext " << inFilename << " decrypted successfully.\n"; -} + std::cout << "\n[Dec] Ciphertext blocks decrypted successfully.\n"; + // Decompress accumulated plaintext + std::vector decompressedData = decompressData(plaintextAccumulated); + // Write decompressed data to the output file + std::ofstream fout(outFilename, std::ios::binary); + if (!fout.is_open()) { + throw std::runtime_error("Cannot open output file for decompressed plaintext: " + outFilename); + } + + fout.write(reinterpret_cast(decompressedData.data()), decompressedData.size()); + fout.close(); + + std::cout << "[Dec] Decompressed plaintext written to: " << outFilename << "\n"; +} // The main function int main(int argc, char** argv) { From 644a769b5b8fc17fdd6dacff1d4dfe1715ce4146 Mon Sep 17 00:00:00 2001 From: DOSAYGO Development Team Date: Fri, 27 Dec 2024 15:16:58 +0800 Subject: [PATCH 16/22] Really good cryptosystem created from hash --- Makefile.rc | Bin 6856 -> 3116 bytes Makefile.rc.dec | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile.rc b/Makefile.rc index f0a4f329c3977a5fa62008228c922165089ada8d..a610b8b77bced56035ac6e1b95dab9943e9116bd 100644 GIT binary patch literal 3116 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 ST}C8{(HM`p*IH!pss90|v7CYc literal 6856 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 V-CvDH5n^H8VPN#B$gLq<`hRitGot_i diff --git a/Makefile.rc.dec b/Makefile.rc.dec index 9f530cf..11570d6 100644 --- a/Makefile.rc.dec +++ b/Makefile.rc.dec @@ -1,7 +1,7 @@ CXX = clang++ CXXFLAGS = -std=c++17 -Wall -Wextra -pedantic -O3 CXXFLAGS += -isysroot $(shell xcrun --show-sdk-path) -CXXFLAGS += -fuse-ld=ld +CXXFLAGS += -fuse-ld=ld -lz DEPFLAGS = -MMD -MF $(@:.o=.d) LDFLAGS = From f583f0864d1e013d6761322db4dd2091f2dabc46 Mon Sep 17 00:00:00 2001 From: DOSAYGO Development Team Date: Fri, 27 Dec 2024 15:41:22 +0800 Subject: [PATCH 17/22] add-test-script --- Makefile.rc | Bin 3116 -> 0 bytes Makefile.rc.dec | 70 ------------------ docs/paper/cipher-note.tex | 145 +++++++++++++++++++++++++++++++++++++ 3 files changed, 145 insertions(+), 70 deletions(-) delete mode 100644 Makefile.rc delete mode 100644 Makefile.rc.dec create mode 100644 docs/paper/cipher-note.tex diff --git a/Makefile.rc b/Makefile.rc deleted file mode 100644 index a610b8b77bced56035ac6e1b95dab9943e9116bd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3116 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 ST}C8{(HM`p*IH!pss90|v7CYc diff --git a/Makefile.rc.dec b/Makefile.rc.dec deleted file mode 100644 index 11570d6..0000000 --- a/Makefile.rc.dec +++ /dev/null @@ -1,70 +0,0 @@ -CXX = clang++ -CXXFLAGS = -std=c++17 -Wall -Wextra -pedantic -O3 -CXXFLAGS += -isysroot $(shell xcrun --show-sdk-path) -CXXFLAGS += -fuse-ld=ld -lz -DEPFLAGS = -MMD -MF $(@:.o=.d) -LDFLAGS = - -EMCCFLAGS = -O3 -s WASM=1 -s EXPORTED_FUNCTIONS="['_rainbowHash64', '_rainbowHash128', '_rainbowHash256', 'stringToUTF8', 'lengthBytesUTF8', '_malloc', '_free']" -s EXPORTED_RUNTIME_METHODS="['wasmExports', 'ccall', 'cwrap']" -s WASM_BIGINT=1 -s ALLOW_MEMORY_GROWTH=1 -g - -OBJDIR = rain/obj -BUILDDIR = rain/bin -SRCS = $(wildcard src/*.cpp) -OBJS = $(addprefix $(OBJDIR)/,$(notdir $(SRCS:.cpp=.o))) -DEPS = $(OBJS:.o=.d) - -WASMDIR = js/wasm -STORM_WASM_SOURCE = src/rainstorm.cpp -BOW_WASM_SOURCE = src/rainbow.cpp -WASM_OUTPUT = docs/rain.wasm -JS_OUTPUT = docs/rain.cjs - -all: directories node_modules rainsum link rainwasm - -directories: ${OBJDIR} ${BUILDDIR} ${WASMDIR} - -${OBJDIR}: - mkdir -p ${OBJDIR} - -node_modules: - @(test ! -d ./js/node_modules && cd js && npm i && cd ..) || : - @(test ! -d ./scripts/node_modules && cd scripts && npm i && cd ..) || : - -${BUILDDIR}: - mkdir -p ${BUILDDIR} - -${WASMDIR}: - mkdir -p ${WASMDIR} - -rainsum: $(OBJS) - $(CXX) $(CXXFLAGS) $(LDFLAGS) -o $(BUILDDIR)/$@ $^ - -$(OBJDIR)/%.o: src/%.cpp - $(CXX) $(CXXFLAGS) $(DEPFLAGS) -c $< -o $@ - -rainwasm: $(WASM_OUTPUT) $(JS_OUTPUT) - -$(WASM_OUTPUT) $(JS_OUTPUT): $(STORM_WASM_SOURCE) $(BOW_WASM_SOURCE) - @[ -d docs ] || mkdir -p docs - @[ -d ${WASMDIR} ] || mkdir -p ${WASMDIR} - emcc $(EMCCFLAGS) -o docs/rain.html $(STORM_WASM_SOURCE) $(BOW_WASM_SOURCE) - mv docs/rain.js $(JS_OUTPUT) - cp $(WASM_OUTPUT) $(JS_OUTPUT) ${WASMDIR} - rm docs/rain.html - -link: - @ln -sf rain/bin/rainsum - -.PHONY: install - -install: rainsum - cp $(BUILDDIR)/rainsum /usr/local/bin/ - --include $(DEPS) - -.PHONY: clean - -clean: - rm -rf $(OBJDIR) $(BUILDDIR) rainsum $(WASMDIR) js/node_modules scripts/node_modules $(WASM_OUTPUT) $(JS_OUTPUT) - - diff --git a/docs/paper/cipher-note.tex b/docs/paper/cipher-note.tex new file mode 100644 index 0000000..5b4ea13 --- /dev/null +++ b/docs/paper/cipher-note.tex @@ -0,0 +1,145 @@ +\documentclass[11pt,a4paper]{article} +\usepackage[margin=1in]{geometry} +\usepackage{amsmath,amssymb,amsfonts} +\usepackage{hyperref} +\usepackage{lmodern} +\usepackage[T1]{fontenc} +\usepackage{array} +\usepackage{booktabs} +\usepackage{listings} +\usepackage{xcolor} + +\hypersetup{ + colorlinks=true, + linkcolor=blue, + urlcolor=blue, + citecolor=blue +} + +\title{A Cryptographic Note on Hash-Based Encryption with Digest Indexing} +\author{Cris, DOSAYGO} +\date{\today} + +\setlength{\parskip}{6pt} +\setlength{\abovedisplayskip}{10pt} +\setlength{\belowdisplayskip}{10pt} + +\begin{document} +\maketitle + +\section*{Introduction} + +This note introduces a novel hash-based encryption primitive, leveraging the pre-image resistance of cryptographic hash functions. The scheme encrypts plaintext by mapping blocks into keyed hash digests, where the plaintext is constructed by selecting specific parts of the digest via a mapping function. By design, this approach ensures robustness against brute-force and timing attacks. + +The encryption is flexible, operating in multiple modes (prefix, sequence, scatter) and supports optional compression for redundancy reduction. This document formalizes the construction, analyzes its tradeoffs, and outlines future directions. + +\section*{Encryption: Core Equation} + +The encryption process solves the following equation: +\[ +\text{Map}(H(K || N)) = P +\] +where: +\begin{itemize} + \item \( H \): A cryptographic hash function (e.g., SHA-256, BLAKE3). + \item \( K \): A secret key with sufficient entropy (e.g., 128 bits). + \item \( N \): A per-block random nonce (e.g., 64 bits). + \item \( P \): The plaintext block. + \item \( \text{Map} \): A mapping function that selects specific parts of the digest \( H(K || N) \) to construct \( P \). +\end{itemize} + +The plaintext block \( P \) is derived from the digest as: +\[ +P = H(K || N) \otimes \text{Map} +\] +where \( \otimes \) denotes the selection operation defined by \( \text{Map} \), which determines which parts of the digest contribute to \( P \). + +\subsection*{Encryption Modes} + +The mapping \( \text{Map} \) can operate in several modes: +\begin{itemize} + \item \textbf{Prefix Mode:} \( P \) matches the first \( n \)-bytes of the digest. + \item \textbf{Sequence Mode:} \( P \) matches a contiguous substring of the digest. + \item \textbf{Scatter Mode:} \( P \) matches bytes at arbitrary indices in the digest, with no duplicates. +\end{itemize} + +Scatter mode ensures that each index is used only once, preventing patterns in the plaintext \( P \) from being exposed. + +\subsection*{Ciphertext Encoding} + +The ciphertext for each block \( P \) is: +\[ +C = (N, \text{indices}) +\] +where: +\begin{itemize} + \item \( N \): The nonce used to generate the digest. + \item \( \text{indices} \): The mapping indices required to reconstruct \( P \) from \( H(K || N) \). +\end{itemize} + +\section*{Decryption} + +Decryption reconstructs the plaintext block \( P \) as: +\[ +P = H(K || N) \otimes \text{indices} +\] +The hash digest is computed with the provided \( N \) and \( K \), and the mapping defined by \( \text{indices} \) extracts the plaintext \( P \). + +\section*{Security Analysis} + +\subsection*{Pre-Image Security} + +The security of the scheme relies on the pre-image resistance of \( H \). Specifically, given \( P \), \( N \), and \( \text{indices} \), an attacker must solve: +\[ +H(K || N) = P +\] +The effective brute-force effort is: +\[ +2^{|K| + |\text{nonce}|} +\] +where \( |K| \) and \( |\text{nonce}| \) are the bit lengths of the key and nonce, respectively. + +\subsection*{Preventing Redundancy Patterns} + +Scatter mode ensures that each index is unique, preventing repeated plaintext bytes from being mapped to the same digest index. This avoids revealing plaintext patterns and ensures uniform utilization of the digest. + +\subsection*{Ciphertext Expansion} + +Ciphertext expansion is determined by: +\[ +\text{Overhead} = |\text{nonce}| + |\text{indices}| +\] +Scatter mode incurs higher overhead due to the need to store an index for each byte of \( P \). Optional compression reduces redundancy in the plaintext before encryption, offsetting this overhead. + +\subsection*{Timing Security} + +Mining the nonce \( N \) involves a probabilistic search for a valid mapping \( \text{Map}(H(K || N)) = P \). The stochastic runtime behavior ensures that timing attacks are mitigated, as the encryption time varies unpredictably. + +\section*{Tradeoffs} + +\begin{itemize} + \item \textbf{Efficiency vs. Expansion:} Prefix and sequence modes minimize ciphertext size but take longer to mine than the looser matching of Scatter mode. Scatter mode is faster to mine but increases expansion. + \item \textbf{Compression:} Reduces plaintext redundancy, often resulting in smaller effective ciphertext size despite normal expansion overhead. + \item \textbf{Mining Speed:} Smaller blocks are faster to mine encrypt, but larger blocks reduce the total number of blocks and nonces. +\end{itemize} + +\section*{Proof of Concept} + +The repository contains a working toy example without a key schedule but implementing the different digest search modes (prefix, sequence, and series/scatter) that demonstrates the concept is at least feasible. + +\section*{Future Work} + +Future enhancements include: +\begin{itemize} + \item Introducing a key schedule to vary \( K \) across blocks, improving resistance against related-key attacks. Most likely using the hash function in an XOF mode. + \item Optimizing for parallelized mining to accelerate encryption. + \item Extending compatibility with alternative hash functions for performance tuning. + \item Formalizing security proofs under cryptographic assumptions. +\end{itemize} + +\section*{Conclusion} + +This hash-based encryption primitive provides a secure and flexible mechanism for protecting data. By leveraging cryptographic hash functions and indexed digest selection, it ensures strong security against brute-force and timing attacks. While current limitations include ciphertext expansion and mining speed, future improvements aim to address these tradeoffs and expand its applicability. + +\end{document} + From 6bf8815815b94ecb620cc44d6f0527fbb8148bfb Mon Sep 17 00:00:00 2001 From: DOSAYGO Development Team Date: Fri, 27 Dec 2024 15:59:33 +0800 Subject: [PATCH 18/22] First draft --- docs/paper/cipher-note.tex | 38 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 36 insertions(+), 2 deletions(-) diff --git a/docs/paper/cipher-note.tex b/docs/paper/cipher-note.tex index 5b4ea13..302b5f6 100644 --- a/docs/paper/cipher-note.tex +++ b/docs/paper/cipher-note.tex @@ -31,6 +31,8 @@ \section*{Introduction} This note introduces a novel hash-based encryption primitive, leveraging the pre-image resistance of cryptographic hash functions. The scheme encrypts plaintext by mapping blocks into keyed hash digests, where the plaintext is constructed by selecting specific parts of the digest via a mapping function. By design, this approach ensures robustness against brute-force and timing attacks. +Unlike a regular block cipher, the security of this system is not affected by the plaintext block size, but rather by the pre-image size mined to align with it. + The encryption is flexible, operating in multiple modes (prefix, sequence, scatter) and supports optional compression for redundancy reduction. This document formalizes the construction, analyzes its tradeoffs, and outlines future directions. \section*{Encryption: Core Equation} @@ -44,7 +46,7 @@ \section*{Encryption: Core Equation} \item \( H \): A cryptographic hash function (e.g., SHA-256, BLAKE3). \item \( K \): A secret key with sufficient entropy (e.g., 128 bits). \item \( N \): A per-block random nonce (e.g., 64 bits). - \item \( P \): The plaintext block. + \item \( P \): The plaintext block (e.g., 3 bytes, but any length is permitted. Longer blocks increase enciphering (mining) time). \item \( \text{Map} \): A mapping function that selects specific parts of the digest \( H(K || N) \) to construct \( P \). \end{itemize} @@ -125,7 +127,39 @@ \section*{Tradeoffs} \section*{Proof of Concept} -The repository contains a working toy example without a key schedule but implementing the different digest search modes (prefix, sequence, and series/scatter) that demonstrates the concept is at least feasible. +The repository contains a working proof-of-concept toy implementation demonstrating the feasibility of this hash-based encryption scheme. This toy is not attacked or analyzed and should not be used by 3rd-parties (ie, you!) for securing valuables. This toy cipher also does not use established cryptographic hash functions but instead uses the hashes defined in this repository (which nevertheless are high quality and fast hash functions that pass SMHasher3). The code in the toy supports all defined digest search modes (prefix, sequence, series/scatter) and uses a constant key per session, without a key schedule. It also incorporates compression for improved storage efficiency. + +The repository can be found at: \url{https://github.com/DOSAYGO-Research/rain}. + +If you encounter issues in the following, To build and run the example: +\begin{verbatim} +# Clone the repository +git clone https://github.com/DOSAYGO-Research/rain +cd rain + +# Build using make +make + +# or if encountering problems, try +./scripts/build.sh + +# if that still fails you may need to consult the README or debug the build on your system. + +# Example usage +# Encrypt a file with sequence mode +./rain/bin/rainsum -m enc --search-mode sequence input_file.txt + +# Decrypt the file +./rain/bin/rainsum -m dec encrypted_file.rc + +# Verify the decrypted file matches the original +diff input_file.txt decrypted_file.txt +\end{verbatim} + +The repository includes a suite of test scripts to validate the correctness of the implementation across various configurations, ensuring decrypted contents match the originals. These tests systematically evaluate different combinations of hash functions, digest sizes, nonce sizes, block sizes, and input files. The test suite can be executed as follows: +\begin{verbatim} +./scripts/test_cipher.sh +\end{verbatim} \section*{Future Work} From 23cb0a5483d5f5a3d774590b0a36ecd9533d7735 Mon Sep 17 00:00:00 2001 From: DOSAYGO Development Team Date: Fri, 27 Dec 2024 15:59:57 +0800 Subject: [PATCH 19/22] OK --- docs/paper/cipher-note.aux | 5 + docs/paper/cipher-note.log | 578 +++++++++++++++++++++++++++++++++++++ docs/paper/cipher-note.out | 0 docs/paper/cipher-note.pdf | Bin 0 -> 219437 bytes docs/paper/cipher-note.tex | 26 +- 5 files changed, 604 insertions(+), 5 deletions(-) create mode 100644 docs/paper/cipher-note.aux create mode 100644 docs/paper/cipher-note.log create mode 100644 docs/paper/cipher-note.out create mode 100644 docs/paper/cipher-note.pdf diff --git a/docs/paper/cipher-note.aux b/docs/paper/cipher-note.aux new file mode 100644 index 0000000..79d49a5 --- /dev/null +++ b/docs/paper/cipher-note.aux @@ -0,0 +1,5 @@ +\relax +\providecommand\hyper@newdestlabel[2]{} +\providecommand\HyField@AuxAddToFields[1]{} +\providecommand\HyField@AuxAddToCoFields[2]{} +\gdef \@abspage@last{5} diff --git a/docs/paper/cipher-note.log b/docs/paper/cipher-note.log new file mode 100644 index 0000000..21f182e --- /dev/null +++ b/docs/paper/cipher-note.log @@ -0,0 +1,578 @@ +This is pdfTeX, Version 3.141592653-2.6-1.40.26 (TeX Live 2024) (preloaded format=pdflatex 2024.12.15) 27 DEC 2024 15:59 +entering extended mode + restricted \write18 enabled. + %&-line parsing enabled. +**cipher-note.tex +(./cipher-note.tex +LaTeX2e <2023-11-01> patch level 1 +L3 programming layer <2024-02-20> +(/usr/local/texlive/2024basic/texmf-dist/tex/latex/base/article.cls +Document Class: article 2023/05/17 v1.4n Standard LaTeX document class +(/usr/local/texlive/2024basic/texmf-dist/tex/latex/base/size11.clo +File: size11.clo 2023/05/17 v1.4n Standard LaTeX file (size option) +) +\c@part=\count188 +\c@section=\count189 +\c@subsection=\count190 +\c@subsubsection=\count191 +\c@paragraph=\count192 +\c@subparagraph=\count193 +\c@figure=\count194 +\c@table=\count195 +\abovecaptionskip=\skip48 +\belowcaptionskip=\skip49 +\bibindent=\dimen140 +) +(/usr/local/texlive/2024basic/texmf-dist/tex/latex/geometry/geometry.sty +Package: geometry 2020/01/02 v5.9 Page Geometry + +(/usr/local/texlive/2024basic/texmf-dist/tex/latex/graphics/keyval.sty +Package: keyval 2022/05/29 v1.15 key=value parser (DPC) +\KV@toks@=\toks17 +) +(/usr/local/texlive/2024basic/texmf-dist/tex/generic/iftex/ifvtex.sty +Package: ifvtex 2019/10/25 v1.7 ifvtex legacy package. Use iftex instead. + +(/usr/local/texlive/2024basic/texmf-dist/tex/generic/iftex/iftex.sty +Package: iftex 2022/02/03 v1.0f TeX engine tests +)) +\Gm@cnth=\count196 +\Gm@cntv=\count197 +\c@Gm@tempcnt=\count198 +\Gm@bindingoffset=\dimen141 +\Gm@wd@mp=\dimen142 +\Gm@odd@mp=\dimen143 +\Gm@even@mp=\dimen144 +\Gm@layoutwidth=\dimen145 +\Gm@layoutheight=\dimen146 +\Gm@layouthoffset=\dimen147 +\Gm@layoutvoffset=\dimen148 +\Gm@dimlist=\toks18 +) +(/usr/local/texlive/2024basic/texmf-dist/tex/latex/amsmath/amsmath.sty +Package: amsmath 2023/05/13 v2.17o AMS math features +\@mathmargin=\skip50 + +For additional information on amsmath, use the `?' option. +(/usr/local/texlive/2024basic/texmf-dist/tex/latex/amsmath/amstext.sty +Package: amstext 2021/08/26 v2.01 AMS text + +(/usr/local/texlive/2024basic/texmf-dist/tex/latex/amsmath/amsgen.sty +File: amsgen.sty 1999/11/30 v2.0 generic functions +\@emptytoks=\toks19 +\ex@=\dimen149 +)) +(/usr/local/texlive/2024basic/texmf-dist/tex/latex/amsmath/amsbsy.sty +Package: amsbsy 1999/11/29 v1.2d Bold Symbols +\pmbraise@=\dimen150 +) +(/usr/local/texlive/2024basic/texmf-dist/tex/latex/amsmath/amsopn.sty +Package: amsopn 2022/04/08 v2.04 operator names +) +\inf@bad=\count199 +LaTeX Info: Redefining \frac on input line 234. +\uproot@=\count266 +\leftroot@=\count267 +LaTeX Info: Redefining \overline on input line 399. +LaTeX Info: Redefining \colon on input line 410. +\classnum@=\count268 +\DOTSCASE@=\count269 +LaTeX Info: Redefining \ldots on input line 496. +LaTeX Info: Redefining \dots on input line 499. +LaTeX Info: Redefining \cdots on input line 620. +\Mathstrutbox@=\box51 +\strutbox@=\box52 +LaTeX Info: Redefining \big on input line 722. +LaTeX Info: Redefining \Big on input line 723. +LaTeX Info: Redefining \bigg on input line 724. +LaTeX Info: Redefining \Bigg on input line 725. +\big@size=\dimen151 +LaTeX Font Info: Redeclaring font encoding OML on input line 743. +LaTeX Font Info: Redeclaring font encoding OMS on input line 744. +\macc@depth=\count270 +LaTeX Info: Redefining \bmod on input line 905. +LaTeX Info: Redefining \pmod on input line 910. +LaTeX Info: Redefining \smash on input line 940. +LaTeX Info: Redefining \relbar on input line 970. +LaTeX Info: Redefining \Relbar on input line 971. +\c@MaxMatrixCols=\count271 +\dotsspace@=\muskip16 +\c@parentequation=\count272 +\dspbrk@lvl=\count273 +\tag@help=\toks20 +\row@=\count274 +\column@=\count275 +\maxfields@=\count276 +\andhelp@=\toks21 +\eqnshift@=\dimen152 +\alignsep@=\dimen153 +\tagshift@=\dimen154 +\tagwidth@=\dimen155 +\totwidth@=\dimen156 +\lineht@=\dimen157 +\@envbody=\toks22 +\multlinegap=\skip51 +\multlinetaggap=\skip52 +\mathdisplay@stack=\toks23 +LaTeX Info: Redefining \[ on input line 2953. +LaTeX Info: Redefining \] on input line 2954. +) +(/usr/local/texlive/2024basic/texmf-dist/tex/latex/amsfonts/amssymb.sty +Package: amssymb 2013/01/14 v3.01 AMS font symbols + +(/usr/local/texlive/2024basic/texmf-dist/tex/latex/amsfonts/amsfonts.sty +Package: amsfonts 2013/01/14 v3.01 Basic AMSFonts support +\symAMSa=\mathgroup4 +\symAMSb=\mathgroup5 +LaTeX Font Info: Redeclaring math symbol \hbar on input line 98. +LaTeX Font Info: Overwriting math alphabet `\mathfrak' in version `bold' +(Font) U/euf/m/n --> U/euf/b/n on input line 106. +)) +(/usr/local/texlive/2024basic/texmf-dist/tex/latex/hyperref/hyperref.sty +Package: hyperref 2024-01-20 v7.01h Hypertext links for LaTeX + +(/usr/local/texlive/2024basic/texmf-dist/tex/latex/kvsetkeys/kvsetkeys.sty +Package: kvsetkeys 2022-10-05 v1.19 Key value parser (HO) +) +(/usr/local/texlive/2024basic/texmf-dist/tex/generic/kvdefinekeys/kvdefinekeys. +sty +Package: kvdefinekeys 2019-12-19 v1.6 Define keys (HO) +) +(/usr/local/texlive/2024basic/texmf-dist/tex/generic/pdfescape/pdfescape.sty +Package: pdfescape 2019/12/09 v1.15 Implements pdfTeX's escape features (HO) + +(/usr/local/texlive/2024basic/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty +Package: ltxcmds 2023-12-04 v1.26 LaTeX kernel commands for general use (HO) +) +(/usr/local/texlive/2024basic/texmf-dist/tex/generic/pdftexcmds/pdftexcmds.sty +Package: pdftexcmds 2020-06-27 v0.33 Utility functions of pdfTeX for LuaTeX (HO +) + +(/usr/local/texlive/2024basic/texmf-dist/tex/generic/infwarerr/infwarerr.sty +Package: infwarerr 2019/12/03 v1.5 Providing info/warning/error messages (HO) +) +Package pdftexcmds Info: \pdf@primitive is available. +Package pdftexcmds Info: \pdf@ifprimitive is available. +Package pdftexcmds Info: \pdfdraftmode found. +)) (/usr/local/texlive/2024basic/texmf-dist/tex/latex/hycolor/hycolor.sty +Package: hycolor 2020-01-27 v1.10 Color options for hyperref/bookmark (HO) +) +(/usr/local/texlive/2024basic/texmf-dist/tex/latex/auxhook/auxhook.sty +Package: auxhook 2019-12-17 v1.6 Hooks for auxiliary files (HO) +) +(/usr/local/texlive/2024basic/texmf-dist/tex/latex/hyperref/nameref.sty +Package: nameref 2023-11-26 v2.56 Cross-referencing by name of section + +(/usr/local/texlive/2024basic/texmf-dist/tex/latex/refcount/refcount.sty +Package: refcount 2019/12/15 v3.6 Data extraction from label references (HO) +) +(/usr/local/texlive/2024basic/texmf-dist/tex/generic/gettitlestring/gettitlestr +ing.sty +Package: gettitlestring 2019/12/15 v1.6 Cleanup title references (HO) + +(/usr/local/texlive/2024basic/texmf-dist/tex/latex/kvoptions/kvoptions.sty +Package: kvoptions 2022-06-15 v3.15 Key value format for package options (HO) +)) +\c@section@level=\count277 +) +(/usr/local/texlive/2024basic/texmf-dist/tex/latex/etoolbox/etoolbox.sty +Package: etoolbox 2020/10/05 v2.5k e-TeX tools for LaTeX (JAW) +\etb@tempcnta=\count278 +) +\@linkdim=\dimen158 +\Hy@linkcounter=\count279 +\Hy@pagecounter=\count280 + +(/usr/local/texlive/2024basic/texmf-dist/tex/latex/hyperref/pd1enc.def +File: pd1enc.def 2024-01-20 v7.01h Hyperref: PDFDocEncoding definition (HO) +Now handling font encoding PD1 ... +... no UTF-8 mapping file for font encoding PD1 +) +(/usr/local/texlive/2024basic/texmf-dist/tex/generic/intcalc/intcalc.sty +Package: intcalc 2019/12/15 v1.3 Expandable calculations with integers (HO) +) +\Hy@SavedSpaceFactor=\count281 + +(/usr/local/texlive/2024basic/texmf-dist/tex/latex/hyperref/puenc.def +File: puenc.def 2024-01-20 v7.01h Hyperref: PDF Unicode definition (HO) +Now handling font encoding PU ... +... no UTF-8 mapping file for font encoding PU +) +Package hyperref Info: Hyper figures OFF on input line 4179. +Package hyperref Info: Link nesting OFF on input line 4184. +Package hyperref Info: Hyper index ON on input line 4187. +Package hyperref Info: Plain pages OFF on input line 4194. +Package hyperref Info: Backreferencing OFF on input line 4199. +Package hyperref Info: Implicit mode ON; LaTeX internals redefined. +Package hyperref Info: Bookmarks ON on input line 4446. +\c@Hy@tempcnt=\count282 + +(/usr/local/texlive/2024basic/texmf-dist/tex/latex/url/url.sty +\Urlmuskip=\muskip17 +Package: url 2013/09/16 ver 3.4 Verb mode for urls, etc. +) +LaTeX Info: Redefining \url on input line 4784. +\XeTeXLinkMargin=\dimen159 + +(/usr/local/texlive/2024basic/texmf-dist/tex/generic/bitset/bitset.sty +Package: bitset 2019/12/09 v1.3 Handle bit-vector datatype (HO) + +(/usr/local/texlive/2024basic/texmf-dist/tex/generic/bigintcalc/bigintcalc.sty +Package: bigintcalc 2019/12/15 v1.5 Expandable calculations on big integers (HO +) +)) +\Fld@menulength=\count283 +\Field@Width=\dimen160 +\Fld@charsize=\dimen161 +Package hyperref Info: Hyper figures OFF on input line 6063. +Package hyperref Info: Link nesting OFF on input line 6068. +Package hyperref Info: Hyper index ON on input line 6071. +Package hyperref Info: backreferencing OFF on input line 6078. +Package hyperref Info: Link coloring OFF on input line 6083. +Package hyperref Info: Link coloring with OCG OFF on input line 6088. +Package hyperref Info: PDF/A mode OFF on input line 6093. + (/usr/local/texlive/2024basic/texmf-dist/tex/latex/base/atbegshi-ltx.sty +Package: atbegshi-ltx 2021/01/10 v1.0c Emulation of the original atbegshi +package with kernel methods +) +\Hy@abspage=\count284 +\c@Item=\count285 +\c@Hfootnote=\count286 +) +Package hyperref Info: Driver (autodetected): hpdftex. + +(/usr/local/texlive/2024basic/texmf-dist/tex/latex/hyperref/hpdftex.def +File: hpdftex.def 2024-01-20 v7.01h Hyperref driver for pdfTeX + +(/usr/local/texlive/2024basic/texmf-dist/tex/latex/base/atveryend-ltx.sty +Package: atveryend-ltx 2020/08/19 v1.0a Emulation of the original atveryend pac +kage +with kernel methods +) +\Fld@listcount=\count287 +\c@bookmark@seq@number=\count288 + +(/usr/local/texlive/2024basic/texmf-dist/tex/latex/rerunfilecheck/rerunfilechec +k.sty +Package: rerunfilecheck 2022-07-10 v1.10 Rerun checks for auxiliary files (HO) + +(/usr/local/texlive/2024basic/texmf-dist/tex/generic/uniquecounter/uniquecounte +r.sty +Package: uniquecounter 2019/12/15 v1.4 Provide unlimited unique counter (HO) +) +Package uniquecounter Info: New unique counter `rerunfilecheck' on input line 2 +85. +) +\Hy@SectionHShift=\skip53 +) (/usr/local/texlive/2024basic/texmf-dist/tex/latex/lm/lmodern.sty +Package: lmodern 2015/05/01 v1.6.1 Latin Modern Fonts +LaTeX Font Info: Overwriting symbol font `operators' in version `normal' +(Font) OT1/cmr/m/n --> OT1/lmr/m/n on input line 22. +LaTeX Font Info: Overwriting symbol font `letters' in version `normal' +(Font) OML/cmm/m/it --> OML/lmm/m/it on input line 23. +LaTeX Font Info: Overwriting symbol font `symbols' in version `normal' +(Font) OMS/cmsy/m/n --> OMS/lmsy/m/n on input line 24. +LaTeX Font Info: Overwriting symbol font `largesymbols' in version `normal' +(Font) OMX/cmex/m/n --> OMX/lmex/m/n on input line 25. +LaTeX Font Info: Overwriting symbol font `operators' in version `bold' +(Font) OT1/cmr/bx/n --> OT1/lmr/bx/n on input line 26. +LaTeX Font Info: Overwriting symbol font `letters' in version `bold' +(Font) OML/cmm/b/it --> OML/lmm/b/it on input line 27. +LaTeX Font Info: Overwriting symbol font `symbols' in version `bold' +(Font) OMS/cmsy/b/n --> OMS/lmsy/b/n on input line 28. +LaTeX Font Info: Overwriting symbol font `largesymbols' in version `bold' +(Font) OMX/cmex/m/n --> OMX/lmex/m/n on input line 29. +LaTeX Font Info: Overwriting math alphabet `\mathbf' in version `normal' +(Font) OT1/cmr/bx/n --> OT1/lmr/bx/n on input line 31. +LaTeX Font Info: Overwriting math alphabet `\mathsf' in version `normal' +(Font) OT1/cmss/m/n --> OT1/lmss/m/n on input line 32. +LaTeX Font Info: Overwriting math alphabet `\mathit' in version `normal' +(Font) OT1/cmr/m/it --> OT1/lmr/m/it on input line 33. +LaTeX Font Info: Overwriting math alphabet `\mathtt' in version `normal' +(Font) OT1/cmtt/m/n --> OT1/lmtt/m/n on input line 34. +LaTeX Font Info: Overwriting math alphabet `\mathbf' in version `bold' +(Font) OT1/cmr/bx/n --> OT1/lmr/bx/n on input line 35. +LaTeX Font Info: Overwriting math alphabet `\mathsf' in version `bold' +(Font) OT1/cmss/bx/n --> OT1/lmss/bx/n on input line 36. +LaTeX Font Info: Overwriting math alphabet `\mathit' in version `bold' +(Font) OT1/cmr/bx/it --> OT1/lmr/bx/it on input line 37. +LaTeX Font Info: Overwriting math alphabet `\mathtt' in version `bold' +(Font) OT1/cmtt/m/n --> OT1/lmtt/m/n on input line 38. +) +(/usr/local/texlive/2024basic/texmf-dist/tex/latex/base/fontenc.sty +Package: fontenc 2021/04/29 v2.0v Standard LaTeX package +LaTeX Font Info: Trying to load font information for T1+lmr on input line 11 +2. + +(/usr/local/texlive/2024basic/texmf-dist/tex/latex/lm/t1lmr.fd +File: t1lmr.fd 2015/05/01 v1.6.1 Font defs for Latin Modern +)) +(/usr/local/texlive/2024basic/texmf-dist/tex/latex/tools/array.sty +Package: array 2023/10/16 v2.5g Tabular extension package (FMi) +\col@sep=\dimen162 +\ar@mcellbox=\box53 +\extrarowheight=\dimen163 +\NC@list=\toks24 +\extratabsurround=\skip54 +\backup@length=\skip55 +\ar@cellbox=\box54 +) +(/usr/local/texlive/2024basic/texmf-dist/tex/latex/booktabs/booktabs.sty +Package: booktabs 2020/01/12 v1.61803398 Publication quality tables +\heavyrulewidth=\dimen164 +\lightrulewidth=\dimen165 +\cmidrulewidth=\dimen166 +\belowrulesep=\dimen167 +\belowbottomsep=\dimen168 +\aboverulesep=\dimen169 +\abovetopsep=\dimen170 +\cmidrulesep=\dimen171 +\cmidrulekern=\dimen172 +\defaultaddspace=\dimen173 +\@cmidla=\count289 +\@cmidlb=\count290 +\@aboverulesep=\dimen174 +\@belowrulesep=\dimen175 +\@thisruleclass=\count291 +\@lastruleclass=\count292 +\@thisrulewidth=\dimen176 +) +(/usr/local/texlive/2024basic/texmf-dist/tex/latex/listings/listings.sty +\lst@mode=\count293 +\lst@gtempboxa=\box55 +\lst@token=\toks25 +\lst@length=\count294 +\lst@currlwidth=\dimen177 +\lst@column=\count295 +\lst@pos=\count296 +\lst@lostspace=\dimen178 +\lst@width=\dimen179 +\lst@newlines=\count297 +\lst@lineno=\count298 +\lst@maxwidth=\dimen180 + +(/usr/local/texlive/2024basic/texmf-dist/tex/latex/listings/lstpatch.sty +File: lstpatch.sty 2024/02/21 1.10 (Carsten Heinz) +) +(/usr/local/texlive/2024basic/texmf-dist/tex/latex/listings/lstmisc.sty +File: lstmisc.sty 2024/02/21 1.10 (Carsten Heinz) +\c@lstnumber=\count299 +\lst@skipnumbers=\count300 +\lst@framebox=\box56 +) +(/usr/local/texlive/2024basic/texmf-dist/tex/latex/listings/listings.cfg +File: listings.cfg 2024/02/21 1.10 listings configuration +)) +Package: listings 2024/02/21 1.10 (Carsten Heinz) + +(/usr/local/texlive/2024basic/texmf-dist/tex/latex/xcolor/xcolor.sty +Package: xcolor 2023/11/15 v3.01 LaTeX color extensions (UK) + +(/usr/local/texlive/2024basic/texmf-dist/tex/latex/graphics-cfg/color.cfg +File: color.cfg 2016/01/02 v1.6 sample color configuration +) +Package xcolor Info: Driver file: pdftex.def on input line 274. + +(/usr/local/texlive/2024basic/texmf-dist/tex/latex/graphics-def/pdftex.def +File: pdftex.def 2022/09/22 v1.2b Graphics/color driver for pdftex +) +(/usr/local/texlive/2024basic/texmf-dist/tex/latex/graphics/mathcolor.ltx) +Package xcolor Info: Model `cmy' substituted by `cmy0' on input line 1350. +Package xcolor Info: Model `hsb' substituted by `rgb' on input line 1354. +Package xcolor Info: Model `RGB' extended on input line 1366. +Package xcolor Info: Model `HTML' substituted by `rgb' on input line 1368. +Package xcolor Info: Model `Hsb' substituted by `hsb' on input line 1369. +Package xcolor Info: Model `tHsb' substituted by `hsb' on input line 1370. +Package xcolor Info: Model `HSB' substituted by `hsb' on input line 1371. +Package xcolor Info: Model `Gray' substituted by `gray' on input line 1372. +Package xcolor Info: Model `wave' substituted by `hsb' on input line 1373. +) +Package hyperref Info: Option `colorlinks' set `true' on input line 17. + +(/usr/local/texlive/2024basic/texmf-dist/tex/latex/l3backend/l3backend-pdftex.d +ef +File: l3backend-pdftex.def 2024-02-20 L3 backend support: PDF output (pdfTeX) +\l__color_backend_stack_int=\count301 +\l__pdf_internal_box=\box57 +) +No file cipher-note.aux. +\openout1 = `cipher-note.aux'. + +LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 27. +LaTeX Font Info: ... okay on input line 27. +LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 27. +LaTeX Font Info: ... okay on input line 27. +LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 27. +LaTeX Font Info: ... okay on input line 27. +LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 27. +LaTeX Font Info: ... okay on input line 27. +LaTeX Font Info: Checking defaults for TS1/cmr/m/n on input line 27. +LaTeX Font Info: ... okay on input line 27. +LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 27. +LaTeX Font Info: ... okay on input line 27. +LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 27. +LaTeX Font Info: ... okay on input line 27. +LaTeX Font Info: Checking defaults for PD1/pdf/m/n on input line 27. +LaTeX Font Info: ... okay on input line 27. +LaTeX Font Info: Checking defaults for PU/pdf/m/n on input line 27. +LaTeX Font Info: ... okay on input line 27. +*geometry* driver: auto-detecting +*geometry* detected driver: pdftex +*geometry* verbose mode - [ preamble ] result: +* driver: pdftex +* paper: a4paper +* layout: +* layoutoffset:(h,v)=(0.0pt,0.0pt) +* modes: +* h-part:(L,W,R)=(72.26999pt, 452.9679pt, 72.26999pt) +* v-part:(T,H,B)=(72.26999pt, 700.50687pt, 72.26999pt) +* \paperwidth=597.50787pt +* \paperheight=845.04684pt +* \textwidth=452.9679pt +* \textheight=700.50687pt +* \oddsidemargin=0.0pt +* \evensidemargin=0.0pt +* \topmargin=-37.0pt +* \headheight=12.0pt +* \headsep=25.0pt +* \topskip=11.0pt +* \footskip=30.0pt +* \marginparwidth=50.0pt +* \marginparsep=10.0pt +* \columnsep=10.0pt +* \skip\footins=10.0pt plus 4.0pt minus 2.0pt +* \hoffset=0.0pt +* \voffset=0.0pt +* \mag=1000 +* \@twocolumnfalse +* \@twosidefalse +* \@mparswitchfalse +* \@reversemarginfalse +* (1in=72.27pt=25.4mm, 1cm=28.453pt) + +Package hyperref Info: Link coloring ON on input line 27. +\@outlinefile=\write3 +\openout3 = `cipher-note.out'. + +\c@lstlisting=\count302 +(/usr/local/texlive/2024basic/texmf-dist/tex/context/base/mkii/supp-pdf.mkii +[Loading MPS to PDF converter (version 2006.09.02).] +\scratchcounter=\count303 +\scratchdimen=\dimen181 +\scratchbox=\box58 +\nofMPsegments=\count304 +\nofMParguments=\count305 +\everyMPshowfont=\toks26 +\MPscratchCnt=\count306 +\MPscratchDim=\dimen182 +\MPnumerator=\count307 +\makeMPintoPDFobject=\count308 +\everyMPtoPDFconversion=\toks27 +) +LaTeX Font Info: Trying to load font information for OT1+lmr on input line 2 +9. + (/usr/local/texlive/2024basic/texmf-dist/tex/latex/lm/ot1lmr.fd +File: ot1lmr.fd 2015/05/01 v1.6.1 Font defs for Latin Modern +) +LaTeX Font Info: Trying to load font information for OML+lmm on input line 2 +9. + +(/usr/local/texlive/2024basic/texmf-dist/tex/latex/lm/omllmm.fd +File: omllmm.fd 2015/05/01 v1.6.1 Font defs for Latin Modern +) +LaTeX Font Info: Trying to load font information for OMS+lmsy on input line +29. + +(/usr/local/texlive/2024basic/texmf-dist/tex/latex/lm/omslmsy.fd +File: omslmsy.fd 2015/05/01 v1.6.1 Font defs for Latin Modern +) +LaTeX Font Info: Trying to load font information for OMX+lmex on input line +29. + +(/usr/local/texlive/2024basic/texmf-dist/tex/latex/lm/omxlmex.fd +File: omxlmex.fd 2015/05/01 v1.6.1 Font defs for Latin Modern +) +LaTeX Font Info: External font `lmex10' loaded for size +(Font) <12> on input line 29. +LaTeX Font Info: External font `lmex10' loaded for size +(Font) <8> on input line 29. +LaTeX Font Info: External font `lmex10' loaded for size +(Font) <6> on input line 29. +LaTeX Font Info: Trying to load font information for U+msa on input line 29. + + +(/usr/local/texlive/2024basic/texmf-dist/tex/latex/amsfonts/umsa.fd +File: umsa.fd 2013/01/14 v3.01 AMS symbols A +) +LaTeX Font Info: Trying to load font information for U+msb on input line 29. + + +(/usr/local/texlive/2024basic/texmf-dist/tex/latex/amsfonts/umsb.fd +File: umsb.fd 2013/01/14 v3.01 AMS symbols B +) +LaTeX Font Info: External font `lmex10' loaded for size +(Font) <10.95> on input line 46. +LaTeX Font Info: Trying to load font information for TS1+lmr on input line 5 +1. + +(/usr/local/texlive/2024basic/texmf-dist/tex/latex/lm/ts1lmr.fd +File: ts1lmr.fd 2015/05/01 v1.6.1 Font defs for Latin Modern +) [1 + +{/usr/local/texlive/2024basic/texmf-var/fonts/map/pdftex/updmap/pdftex.map}{/us +r/local/texlive/2024basic/texmf-dist/fonts/enc/dvips/lm/lm-ec.enc}{/usr/local/t +exlive/2024basic/texmf-dist/fonts/enc/dvips/lm/lm-rm.enc}{/usr/local/texlive/20 +24basic/texmf-dist/fonts/enc/dvips/lm/lm-mathit.enc}{/usr/local/texlive/2024bas +ic/texmf-dist/fonts/enc/dvips/lm/lm-mathsy.enc}{/usr/local/texlive/2024basic/te +xmf-dist/fonts/enc/dvips/lm/lm-ts1.enc}] [2] +Overfull \hbox (108.31354pt too wide) in paragraph at lines 136--145 + [] + [] + +[3] +LaTeX Font Info: Trying to load font information for T1+lmtt on input line 1 +51. + (/usr/local/texlive/2024basic/texmf-dist/tex/latex/lm/t1lmtt.fd +File: t1lmtt.fd 2015/05/01 v1.6.1 Font defs for Latin Modern +) [4] +[5] (./cipher-note.aux) + *********** +LaTeX2e <2023-11-01> patch level 1 +L3 programming layer <2024-02-20> + *********** + + +Package rerunfilecheck Warning: File `cipher-note.out' has changed. +(rerunfilecheck) Rerun to get outlines right +(rerunfilecheck) or use package `bookmark'. + +Package rerunfilecheck Info: Checksums for `cipher-note.out': +(rerunfilecheck) Before: +(rerunfilecheck) After: D41D8CD98F00B204E9800998ECF8427E;0. + ) +Here is how much of TeX's memory you used: + 12055 strings out of 475567 + 182039 string characters out of 5777888 + 1936187 words of memory out of 5000000 + 34031 multiletter control sequences out of 15000+600000 + 602300 words of font info for 69 fonts, out of 8000000 for 9000 + 319 hyphenation exceptions out of 8191 + 75i,6n,79p,720b,507s stack positions out of 10000i,1000n,20000p,200000b,200000s + +Output written on cipher-note.pdf (5 pages, 219437 bytes). +PDF statistics: + 119 PDF objects out of 1000 (max. 8388607) + 86 compressed objects within 1 object stream + 22 named destinations out of 1000 (max. 500000) + 1 words of extra memory for PDF output out of 10000 (max. 10000000) + diff --git a/docs/paper/cipher-note.out b/docs/paper/cipher-note.out new file mode 100644 index 0000000..e69de29 diff --git a/docs/paper/cipher-note.pdf b/docs/paper/cipher-note.pdf new file mode 100644 index 0000000000000000000000000000000000000000..d046dc74d02365ed95ee4da1b2658e08c1024a9b GIT binary patch literal 219437 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Μ?lyb&Ql^T~){3nKk-QHK$o*K&l`U^e}y` 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
    >_XSuF=r2I?!mfPIzK42Xt}pgV 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 literal 0 HcmV?d00001 diff --git a/docs/paper/cipher-note.tex b/docs/paper/cipher-note.tex index 302b5f6..9a0124c 100644 --- a/docs/paper/cipher-note.tex +++ b/docs/paper/cipher-note.tex @@ -16,7 +16,7 @@ citecolor=blue } -\title{A Cryptographic Note on Hash-Based Encryption with Digest Indexing} +\title{Hash-Based Encryption with Digest Selection: A Novel Pre-Image Security Primitive} \author{Cris, DOSAYGO} \date{\today} @@ -27,6 +27,9 @@ \begin{document} \maketitle +\section*{Abstract} +This note introduces a hash-based encryption scheme leveraging pre-image resistance and digest indexing for constructing plaintext blocks. Designed for flexibility, the scheme supports multiple digest selection modes (prefix, sequence, scatter) and optional plaintext compression. It offers strong resistance to brute-force and timing attacks, though challenges include ciphertext expansion and mining speed. A proof-of-concept implementation is provided for further exploration and analysis by the cryptographic community. + \section*{Introduction} This note introduces a novel hash-based encryption primitive, leveraging the pre-image resistance of cryptographic hash functions. The scheme encrypts plaintext by mapping blocks into keyed hash digests, where the plaintext is constructed by selecting specific parts of the digest via a mapping function. By design, this approach ensures robustness against brute-force and timing attacks. @@ -35,6 +38,8 @@ \section*{Introduction} The encryption is flexible, operating in multiple modes (prefix, sequence, scatter) and supports optional compression for redundancy reduction. This document formalizes the construction, analyzes its tradeoffs, and outlines future directions. +\textbf{Disclaimer:} This document introduces an experimental concept intended for research and analysis by cryptographers. The scheme presented here has not been formally proven secure or subjected to rigorous cryptanalysis. + \section*{Encryption: Core Equation} The encryption process solves the following equation: @@ -125,13 +130,27 @@ \section*{Tradeoffs} \item \textbf{Mining Speed:} Smaller blocks are faster to mine encrypt, but larger blocks reduce the total number of blocks and nonces. \end{itemize} +\section*{Tradeoff Summary} + +\begin{center} +\begin{tabular}{@{}lll@{}} +\toprule +\textbf{Aspect} & \textbf{Advantage} & \textbf{Limitation} \\ \midrule +Block size & Smaller blocks speed up mining & Larger ciphertext due to nonce overhead \\ +Ciphertext expansion & Mitigated by compression & Compression adds preprocessing complexity \\ +Mining modes & Scatter mode provides faster mining & Requires storing index for every plaintext byte \\ +Timing security & Stochastic runtime eliminates fixed patterns & Mining is probabilistic and not constant time \\ +\bottomrule +\end{tabular} +\end{center} + \section*{Proof of Concept} The repository contains a working proof-of-concept toy implementation demonstrating the feasibility of this hash-based encryption scheme. This toy is not attacked or analyzed and should not be used by 3rd-parties (ie, you!) for securing valuables. This toy cipher also does not use established cryptographic hash functions but instead uses the hashes defined in this repository (which nevertheless are high quality and fast hash functions that pass SMHasher3). The code in the toy supports all defined digest search modes (prefix, sequence, series/scatter) and uses a constant key per session, without a key schedule. It also incorporates compression for improved storage efficiency. The repository can be found at: \url{https://github.com/DOSAYGO-Research/rain}. -If you encounter issues in the following, To build and run the example: +To build and run the example: \begin{verbatim} # Clone the repository git clone https://github.com/DOSAYGO-Research/rain @@ -143,8 +162,6 @@ \section*{Proof of Concept} # or if encountering problems, try ./scripts/build.sh -# if that still fails you may need to consult the README or debug the build on your system. - # Example usage # Encrypt a file with sequence mode ./rain/bin/rainsum -m enc --search-mode sequence input_file.txt @@ -176,4 +193,3 @@ \section*{Conclusion} This hash-based encryption primitive provides a secure and flexible mechanism for protecting data. By leveraging cryptographic hash functions and indexed digest selection, it ensures strong security against brute-force and timing attacks. While current limitations include ciphertext expansion and mining speed, future improvements aim to address these tradeoffs and expand its applicability. \end{document} - From 5fd15894adf0eb52b50a8b331b091c2d899d2343 Mon Sep 17 00:00:00 2001 From: DOSAYGO Development Team Date: Fri, 27 Dec 2024 16:16:06 +0800 Subject: [PATCH 20/22] Good paper --- docs/paper/cipher-note.aux | 2 +- docs/paper/cipher-note.log | 92 +++++++++++++++-------------- docs/paper/cipher-note.pdf | Bin 219437 -> 242052 bytes docs/paper/cipher-note.tex | 116 +++++++++++++++++++++---------------- 4 files changed, 117 insertions(+), 93 deletions(-) diff --git a/docs/paper/cipher-note.aux b/docs/paper/cipher-note.aux index 79d49a5..74b1a21 100644 --- a/docs/paper/cipher-note.aux +++ b/docs/paper/cipher-note.aux @@ -2,4 +2,4 @@ \providecommand\hyper@newdestlabel[2]{} \providecommand\HyField@AuxAddToFields[1]{} \providecommand\HyField@AuxAddToCoFields[2]{} -\gdef \@abspage@last{5} +\gdef \@abspage@last{6} diff --git a/docs/paper/cipher-note.log b/docs/paper/cipher-note.log index 21f182e..f8bdcdc 100644 --- a/docs/paper/cipher-note.log +++ b/docs/paper/cipher-note.log @@ -1,4 +1,4 @@ -This is pdfTeX, Version 3.141592653-2.6-1.40.26 (TeX Live 2024) (preloaded format=pdflatex 2024.12.15) 27 DEC 2024 15:59 +This is pdfTeX, Version 3.141592653-2.6-1.40.26 (TeX Live 2024) (preloaded format=pdflatex 2024.12.15) 27 DEC 2024 16:16 entering extended mode restricted \write18 enabled. %&-line parsing enabled. @@ -394,8 +394,7 @@ ef File: l3backend-pdftex.def 2024-02-20 L3 backend support: PDF output (pdfTeX) \l__color_backend_stack_int=\count301 \l__pdf_internal_box=\box57 -) -No file cipher-note.aux. +) (./cipher-note.aux) \openout1 = `cipher-note.aux'. LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 27. @@ -416,6 +415,7 @@ LaTeX Font Info: Checking defaults for PD1/pdf/m/n on input line 27. LaTeX Font Info: ... okay on input line 27. LaTeX Font Info: Checking defaults for PU/pdf/m/n on input line 27. LaTeX Font Info: ... okay on input line 27. + *geometry* driver: auto-detecting *geometry* detected driver: pdftex *geometry* verbose mode - [ preamble ] result: @@ -451,10 +451,12 @@ LaTeX Font Info: ... okay on input line 27. * (1in=72.27pt=25.4mm, 1cm=28.453pt) Package hyperref Info: Link coloring ON on input line 27. +(./cipher-note.out) (./cipher-note.out) \@outlinefile=\write3 \openout3 = `cipher-note.out'. \c@lstlisting=\count302 + (/usr/local/texlive/2024basic/texmf-dist/tex/context/base/mkii/supp-pdf.mkii [Loading MPS to PDF converter (version 2006.09.02).] \scratchcounter=\count303 @@ -509,55 +511,60 @@ LaTeX Font Info: Trying to load font information for U+msb on input line 29. (/usr/local/texlive/2024basic/texmf-dist/tex/latex/amsfonts/umsb.fd File: umsb.fd 2013/01/14 v3.01 AMS symbols B -) -LaTeX Font Info: External font `lmex10' loaded for size -(Font) <10.95> on input line 46. -LaTeX Font Info: Trying to load font information for TS1+lmr on input line 5 -1. +) [1 + +{/usr/local/texlive/2024basic/texmf-var/fonts/map/pdftex/updmap/pdftex.map}{/us +r/local/texlive/2024basic/texmf-dist/fonts/enc/dvips/lm/lm-ec.enc}] +LaTeX Font Info: Trying to load font information for TS1+lmr on input line 4 +8. (/usr/local/texlive/2024basic/texmf-dist/tex/latex/lm/ts1lmr.fd File: ts1lmr.fd 2015/05/01 v1.6.1 Font defs for Latin Modern -) [1 +) +LaTeX Font Info: External font `lmex10' loaded for size +(Font) <10.95> on input line 63. + [2{/usr/local/texlive/2024basic/texmf-dist/fonts/enc/dvips/lm/lm-ts1.enc}{/usr +/local/texlive/2024basic/texmf-dist/fonts/enc/dvips/lm/lm-rm.enc}{/usr/local/te +xlive/2024basic/texmf-dist/fonts/enc/dvips/lm/lm-mathit.enc}] [3{/usr/local/tex +live/2024basic/texmf-dist/fonts/enc/dvips/lm/lm-mathsy.enc}] +LaTeX Font Info: External font `lmex10' loaded for size +(Font) <10> on input line 152. +LaTeX Font Info: External font `lmex10' loaded for size +(Font) <7> on input line 152. +LaTeX Font Info: External font `lmex10' loaded for size +(Font) <5> on input line 152. -{/usr/local/texlive/2024basic/texmf-var/fonts/map/pdftex/updmap/pdftex.map}{/us -r/local/texlive/2024basic/texmf-dist/fonts/enc/dvips/lm/lm-ec.enc}{/usr/local/t -exlive/2024basic/texmf-dist/fonts/enc/dvips/lm/lm-rm.enc}{/usr/local/texlive/20 -24basic/texmf-dist/fonts/enc/dvips/lm/lm-mathit.enc}{/usr/local/texlive/2024bas -ic/texmf-dist/fonts/enc/dvips/lm/lm-mathsy.enc}{/usr/local/texlive/2024basic/te -xmf-dist/fonts/enc/dvips/lm/lm-ts1.enc}] [2] -Overfull \hbox (108.31354pt too wide) in paragraph at lines 136--145 +Underfull \hbox (badness 1325) in paragraph at lines 157--158 +[]|\T1/lmr/m/n/10 Requires stor-ing an in-dex for ev-ery + [] + + +Overfull \hbox (19.10587pt too wide) in paragraph at lines 152--161 [] [] -[3] +[4] LaTeX Font Info: Trying to load font information for T1+lmtt on input line 1 -51. +66. (/usr/local/texlive/2024basic/texmf-dist/tex/latex/lm/t1lmtt.fd File: t1lmtt.fd 2015/05/01 v1.6.1 Font defs for Latin Modern -) [4] -[5] (./cipher-note.aux) +) [5] +[6] (./cipher-note.aux) *********** LaTeX2e <2023-11-01> patch level 1 L3 programming layer <2024-02-20> *********** - - -Package rerunfilecheck Warning: File `cipher-note.out' has changed. -(rerunfilecheck) Rerun to get outlines right -(rerunfilecheck) or use package `bookmark'. - -Package rerunfilecheck Info: Checksums for `cipher-note.out': -(rerunfilecheck) Before: -(rerunfilecheck) After: D41D8CD98F00B204E9800998ECF8427E;0. +Package rerunfilecheck Info: File `cipher-note.out' has not changed. +(rerunfilecheck) Checksum: D41D8CD98F00B204E9800998ECF8427E;0. ) Here is how much of TeX's memory you used: - 12055 strings out of 475567 - 182039 string characters out of 5777888 - 1936187 words of memory out of 5000000 - 34031 multiletter control sequences out of 15000+600000 - 602300 words of font info for 69 fonts, out of 8000000 for 9000 + 12100 strings out of 475567 + 182597 string characters out of 5777888 + 1937187 words of memory out of 5000000 + 34054 multiletter control sequences out of 15000+600000 + 624579 words of font info for 87 fonts, out of 8000000 for 9000 319 hyphenation exceptions out of 8191 - 75i,6n,79p,720b,507s stack positions out of 10000i,1000n,20000p,200000b,200000s + 75i,8n,79p,1015b,589s stack positions out of 10000i,1000n,20000p,200000b,200000s -Output written on cipher-note.pdf (5 pages, 219437 bytes). +ts/type1/public/lm/lmri10.pfb> +Output written on cipher-note.pdf (6 pages, 242052 bytes). PDF statistics: - 119 PDF objects out of 1000 (max. 8388607) - 86 compressed objects within 1 object stream - 22 named destinations out of 1000 (max. 500000) + 135 PDF objects out of 1000 (max. 8388607) + 99 compressed objects within 1 object stream + 29 named destinations out of 1000 (max. 500000) 1 words of extra memory for PDF output out of 10000 (max. 10000000) diff --git a/docs/paper/cipher-note.pdf b/docs/paper/cipher-note.pdf index d046dc74d02365ed95ee4da1b2658e08c1024a9b..2e5c6230510cb1d918b7abd9fcc63878a74f1703 100644 GIT binary patch delta 173984 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�$tr?HJcD5}i|CYX5jL^{i*f=C#%K$@k5 zII}glPw2T01fyWcP=9GZ%Awo*nY0y+{mL2F4*!+yhlKG@k0~g_uf9ZbGKDC= z>37W8}y7h_gqdO>s&51`e)hVIvv+LJ=6o39j$FZ(=S$%{Cs*o;$ z3Vseu)`VB^XC%6bB|-PJX@Va2In8H>u#3)E348E9x(5dap17qX`d6r56HRc);ekvI z-{~(u6owGnlrWdN+pS3MHqZ&Iv8{dzBDbsnFj{ zftRyOxpz}8h#7L zlnpn6!sRv=4~}f#^B8%V^*whX`L`_DlsXQ0-a1Xv^N!&gD08}_UTk^WfWJd^)+JK* zJeikZ*V$dwGKP9*pMNg!_mqMx4-%8>yMi^>@cOo@L4I-`iXYkR05b<0s7|Lz7tzd) zhpdQxG=Dwf*4KT4SAj~_eY4{p^8+yfjmutTPS};dZP+bn2+t^4XHwgItyIVIRhQ)#;XPZJ)>B~AyvE*joZ_elx7Y(^BlTfv8RG^gMCme99D6|nv zM#4Ga<(z+{=?T6O&btr37VyojY9eS0-`Vnm(|{c6ImE|-q?1&nh^K;PQ&sC#mhV}a&Y&KSCUmmY8_)ZXFoPH26TKGrw zfJwqPRZ>4u4u@Wg;K4S^dlPq#iZVN*RQaqHoKBvk+#aer%u%8=or)%-pB!E>=6BEe z-G3f3WhkMvp)&B`eNuC(ths#ph)F!cnHXMh#;BspMo=LTl^s_>zxM5OIbnq+_tasK zYf=Ae(4D2aVl=!@jpHYNgl41d*M2Sj45#MFS=VXO-(r>%dvav_-(i2RNco{ytzPrG zLj0`7Tun^c61A$dF|@}~UTE3VeI^Yn$A6ACN9P?=OLt0Lg2~ENt4|~iqMRG~wpnu3 zcR$n3Fp3z)qBh@9HM+v80{JZV!eb+`raYXAV~HIv-5Qr3TP`02x$8T&2II};Hr1f` zoQZ`f!zz{+98Dv0L|4i231pIc-f3W%WuZ3}>B%_6Ht;Lyz3S8H>d1mRxUS_R%YWy( zZ$i~pm1m`WP{KPA8_So4MNdesDy7jSt{p1HUKQ?z31^SLEXKdN^+D2K;=ho9=^}ib z4iCTF)%vA()1Po2BkV3FAZlHFH1EKgNgTK`zKlkE#uZ=D zoRQs>VdHWL9ZENcQ>fp*M!V@}KP}O4s@7OOB&-B+HO|u{EO39p*Duv|VAEvm@PFsUe zzy9RN*^V$#6X7l>ne1OH;g5za*@8_?eaBecw_6O!?GtcnRT5;~1s<<32!D1yVR0xJ zIB5)ilFPBnFEqR+OqRv`6{B_H*Oh$l5BW z?gKv+Z`9A@M?Woyq&@SNOrdI;%rtP2gY8Az$xa55doS8A`5Z?G$$%1zLHC5*4cIKp zksRT@tLWoxx%Ev*0#*4XOn(>V;pVrm*sQ_CHa<9%_}IT$(-uEoI{)TDd8u5P!!KtX zdORZi=Fd7<=dZL&!4yuBEItPf3Aw9t@8h6LlFu^Q@_C)OE~zwCh(zZrTUE#>#w>i1 zzSR98a~W&ml@BhyE0`ygQT15KM-!O&zZ=IBcdDg(j;NYSek#V7K7ah~{_X@DU5|gy zRW$1mN`ZR*iGn&y&CB2JGw^~lzmakT0UP$Echc~fo7X5BjB`9 zwh^l^>~4zRzu41Hw5E-4i zQkeeVp)`bkxl)ZeCVzQ!!TOqxpT%C*db<{U!wrVSqmMu1VAFg{p9R0#ki9Lk)~iRkt;Ml&#I3LLVv;ThayefzzL-Ebiyl5 z{X+%v4f7RQlMxn1%aC$uRN^#Yr&S2Ef(<+#ln^7G)EDgW`WIjCz7!AE`^0st*#MG# zw3A&HuI%rLnq#hBaqX6KAXL;()I=dBR!uz9lo!FC56A2e6=*3;yaomoVD>Pih$jzphY8p|Q-p8+kw z1K{^v)U*LH7dWiL~e) zTw?UJ_D>V$Zu-rL*F3^9r&_<4O!CeCnEaYv+Ktar4u9D&TRsfVcs|qVMcZJequ&r^ zIjLu*{_39W_`_^N>?Mbr3sU(z_q;~m;cE~B*@Y`Y`_DJJQ+odw+&~%f7Px`$@lB@bU{!TwQ^6TOZXI1m)bpxo-yh6@og9U#pyz} zUjdoZgMYEbyeXClk$lwmSJoMYDuz*%*E+N1O)ips@~7ZF9Fu)gvVJUghyIWLpVPVr z67Z-!yjrSXZLG9nA*!yq=J`++zrgk~j2ab0q9x02RP$q#Dny3_7scvI5knBY3|b1& z>T&gOS`jT62E{3KaVtk2ax@PCGmA2Eq6_AdNq@-BB-UDk#D4Na@F)amz^nwPHYZ!$ zn7|Pzov#)QyQ9#D0Q#nFqB*^j=N3ZU5rM}<_E zoje&y%I}>YZ|fomqV^>H%;Sm)Fh^SQ){QF0;~FCB+4FWbQUhDT2OnO7k*QSrA%z% z=c|4&pBlW%*)WGXY!NM!t5%s1-fPxXw$7wao(Pp(dCiQMa|5#*JKo8hY8WvAM(Fp& zd)3fq5*3LVaQ2bs(N&7PeJ<5j>)LY-;(wEhW)TdsG_J+LOz6I#tKL{`ffiCC;R?OD zlGQcU_L=iL(b*fe5*bSz=p|!dWfsXETCTZn_q22ruo@^iuNnfAZ}dUdx6c^+mm?>H zgOTv>*(CS#cI4_R-pJw3#Msq4#lDLyzsX56OSi1{;(H<(>IQbbo3oYlXwaFR?|*6V zGtHc*gqbEv3(};QysM-z;nXtl@|!P3W7}>-GLJic7}V!2r@55EA#LBb5 zw{AIvS5cAgp(NFOZ@*H~AQqKD4u2Oujk5|xGM2KuBJUxJr0KUMS-rTl*O3xm7OD#J z7u-c~#8%4-j3x>YY`AQ=L&Fd37KCz|;$I3^NUf`N=k|!^!gXr5h{4ne{oaU5zgF=M z?V7gb%PZ>Y5s$`HhKwtvfDYoa0`hwAF3X$r7JBQ^ORoD>xsDhE0$yke_J7zF#^B?W zH(4$Mp-d>PtV)k~R_EH1wMVmFSPzbA00NBMLPA+hV|!K^v1;~yxCpO#etY;O2A@UX zo&1bu$Nh`Nq^3x*^J#R*2C4XdlI;fkRQix_-mlYg%P2z{y20-lF{0y`+#(%sJ?e^f{JAbsVxYAzFR)VQ_i z`GVh&((9;pI zJb7C%>hPT$5)3OggnhwxFL+Mt$c26MbscqVDl-!OI6O3ZdWxiP6R=djmMqeMZe4*M z&tfg3q;bhDSpM&RLO)4vy108pvP`o6P}!J?)k*LXK8dQE*+yER4TB|GsIh^!f#sqI zF+m<{%qRCKhBF3E=6@2mueQ=Fp1FY`bcgr`H3cWpp~d2jB>@)!&9HMS_rptYN|grF0~5f~;Uiup}E3r+KpI zpnDj%Iy&sxckpGuRey!sx&7luu9;-NAX6TNSt^u$!mqb_(3}oGz_nZE7ff}=37HBt zlXAI`=3KEZ6MwF!ctt-w{J?h+mSN+CkFKao*(iweoBggGMmvZ70nAT7A;%zXiOc=1 zbD{fc4y3!s9HAMDMVAV#950A$UZJJjDd!0Q-DX$}YZtv1w9~jc`JXd?#wY)}+nPub z*>MI8u`>nuxfyT`W_h4k)46j%YGg0EP+9dv9Q+_`^ssI%98R9|u2^9b=OKSn6T0haI8C=J6h+Ik z46<|UBCOac=Zk=X9`+9qV54O_7 zZQHhO+kej2vD2|_W8P+FHt$E=#jR7PJ}MeA8+P4**mKPAr3}`RZENzrFN+SMrN!Lw zxqpT$X?(6~iVT==j-s>&Ylfo$C+b)FT6R+W<#})RKh1&$Xbv9@?41J@8@RMsfErv2 zlSFa0l+j}FZ4-xp@@@Efsm5Lxa}Ozrco+I3eiFmnBXYATEghJOb6V)SyP5_-E2b$HSm-{> z-yPBR~k3hxp0=viM3l9HzPVMtpXxhULF zmw!XtS)t)qgtet$6WDs~BCx=X-R+c%whoiiueLo4g^HcrorEEFkjU_WT9*15Z?6+2 zyhJBfBM*Kcd?T-?j)WAhd&I_yxZ0^nCb|!QDkOKr7ouHcd|I|TqAExZg#{UtvBt?7 z>J!rNu&iOU9;HHw;ov>hQM}rOJl_p3h<{9{)?{FlkZ6wJ`|~+)OF5^RKvC>#Av=v< zNZnq?8os5bmZe!$5<6$QaUHNg*;H#(HXtZ{`toZ1FVAN4W(Y~I+Z-m`P^Ok7HqOHP?Xkt$1=WHQxsYJc_% zghOHL-dI*n#MTR7T5`ojkWIzs&2$p+5)|+fp1oYyu)~X2<5|)~x}B5Lv+cdy3|+3j zz{lKS{Zv3V9OnM!kX~j#17TYd#c40ud?OLw7Wae#W?vy z8xyUE2iKs%B;5SnQ42uvy<5ar^wQTi~BuB8&%z5cXmCS6Yql>qn#6x`N0C%2>#df#Kl^d~g z=}SLuK_VT(wFI9hZ{@%tkxAYeH79;RS8>H zeU*R#GA&(tp0h+Lwwqxj@_!h^vURxaS;lNMgR*;khO`Nsv=%q24d);uV;^QtP7#JP z+aSi%3LfgpG{kirXv0^cM7;RY|MsAp0Cb|4E(C(tlw@UTL67AJsmUzcudM{q#9PxJ z2e~Z>r!UKnEj7Rr4YU>b}<7$=!BN+j<${7VOZB5`+{=BYGmNqDw9C}sxVp&$o!vG?nk8`Cwe z-%e5rj_gtY)-MpXWtrUi#@$mFC`GqJOoyJug^TQ+b@+qC(;PN4gJFJvIV@uj6I_n zry2+@Rl?{A+C>B;dXQ~gZDLff!#yO6Je=fSDV98t69){Uo+=5X;l@-AxN~z(0J9TF zfQ>EiGU8@zrc(?L#EOrYfU%$|_`TAiol6n$Z%CpGpRrx(*?$d;9NA2NolfbXiXltl zf@M^UFm2bjR)O%#Mmci4^%mGeUIs@I9h*< zi$!8^h=MDa6FNO>Ag^KGu4~O3{;flEp>s%(TFT@y4Pb8v&wZsb3t!mrX6hLFbE>a2 z45oP!$N(kVz<-VOfmWub+g_0!N~vCvw@pBW6U$a*)rqj3YOZ%*y62YcS~fS-A(oP8 zsDM$EoUb+&AZaXcVS}NI=5C7OgpdanbRLjKo&B}??is#*_WGiWW5lS1BPfo;Cj3e~%5 z_ak9TRez<2LK-Xd3d z>w+^jp{U19?Shoy?u1_1sX}nOyqvCZu^Ny3gkG#XmxtLxjZ&=&uBeFf@3XU-^Iz~_ z^c`u2LI1sltNYFn>b28GJ*udS6JjJKV(aL=t{Tm5Gu}4*`&0GYf)=V7_zYoAELs~t zd4CgLCcujJ5s;QaHBNehWi0|`h>h%Umv>lid+p6c0B$uh&*Q1sRC*+u#+w}>({XU( z?AQ9dDxJGI*d`+BPf&-|W=v`mt4NNL@wTF$4`Il>%*9IrvPHxdj^ur>_4I~5{a4Gp zxJja_q|+rO!P9jNo(apz-oIeW5kpBQ?tk?W^0eaYL`oQgr)6IU0z7XmPs-ck0zaFi z4CTiV|cc4)Gb))pArk44-oQ!Rd6 z_t6$t^Rx)+$4VyFo3Lz<*B(;T#>}uu^yI&gjn-3HD+HgX{*G@=)?mF|87B*|rGJGy zjr$1l&y+kCwuPK5_Ou-fFrnDMfxWP7H*3Ww#gN0&7nH{fk2qqT{tD#afdlfD9Qt6> zV6H2(%81rtaeKe@h}P0YT)$p#-m(x+7d7WBpFHvtWrx7+sAYF{FQp znyhd#dC^IiTsmv0)-nh3K$W2Xl7AcYSy`0x4}i@sqQy&zkQT&1F0X%K(PZ&*7U^BQ z)T7r~Iw7bGxlffuRuUiN6V9LE*{`f)Y{kXhhi9D#PKI3q_+DqWd(o0=KM6kh-9IGv z7fU??_8v-K0Lt<0zLY=dLf(L#ua|aj2wS3;$D^b(w0Ko$KU@|G-lUQ$z9;j{$n0>|P5NO+)+%&lHD}Q&qe9<(+OJs9< zLn$4yw#*b=_374pO;f9j*$ky=G-)J%K86=L5_pVK<(FeHn*gXAKYpKX)n;v@cH4Xf ztuhQq4a3i5ebd%ksz!Jvf#;WUn22Z`oukZsCvzG4mEdUQR5XkU$A5F5aY}-T+3}#D z`|WF4prfCCfRcqVe6mGvM@duxsw$o`$m~l;Wl(Ne%jC)Q8G99(ORKYLW1tR(+MP1Z zlIvZNlJlYla^0thL1fjx?DX4uXJ4HuhSBN+7u?oI-wo= z5+UXCo+jX$GAHz0>wilBP-jN8mYCLGwlBEY3IAPqd|Q!)nPzt7slxb2wt3_6Jr#O8 zBd$?T{*9M8EXv_Sfjw=7n3M%aL|FRoDgV@wKktX>OAvWUi2>2-NNRmNf$<6Nk^YiP z{O~boaZcs5@8F>}W1{k#b#*7`scz}i=ZEGF{bz#CZ#ixA`hUv|UnV7Y<~Kr#WncTc zVAWu`qkT^c8mu^=G2o6~D){FrHjxT^5;424E+Pt@%7S?Z7#PMkibww>PfI-W#21i?d_@YFOliekVqLvpN6@$yeE*yR1{}k76JW)#NFfE-F>6u6 z#Do{3=jaE!j(;7E6*D=Jfc1k@p5`2|mVZ?d0m#PW^@Dg>3Z08*hCz`! z189<>B+|USMRWFB>>UXR0b{*`6o0d0`^3_OtqaTezz@+lPjLTAnD>OtQ{!H0_Ar9*2$9~=#C_Va*@yRzA{A%?{no|uEB`uc;_{U;kf4bNYR_o)s^3~^*q6nTbu1wOWA?S`<>cWt|U?;i-!NW(c4apx3 zIL_~rMJU$i#J#!5iZ$IJ7+-1B2rsseNlOMVaDTtmGFbbz?_>X8a&{?)0c}uOxv8J> zLDr#x=4d5iA%Y&8zD2UtKuKzCpR=5d4Vt~4zfL=N>1kSS)|}yvQ>J#4Y{+C%eNa%y zDRSuuBueB5hjx}fg&)DVGD!|F6s|s z#B~E@?^k5d?MJ&P`2rD74HUyevfw85Fn^%PeNgi(Lf;q{Ds@NTGL{;y_F7R*r=6K; zPV`jY9c#F}GyIxv(MksJ`oXg&(hP;zJt%Il@(s&H+~iD9xN71y%5ty)G}bOpv{76> zUDpC#UvzO5_iIFeqL7bzG+WS|<7JLK?hWETtl%W-hWp8}TzqAHHD(6o5)*S=>3>$i zH~E;3BB#G z(xK&Owy+kjVAOvMc<^!VVE{5?%!(_m%0%?6CewTKd~f3hFUfTE{iS1MSVU_jft{2n zvfZaY_2u44X0Oe(zn}5(&#e6Hf*d=WIrG7_#u%UkdA2f^Ze_K~WhyQb6@Q|;)W^g^ z6?=H9{@?rKMikJe#`9kWA6jN8ulK)MlP5?(wmQ-EAu`|*8;KyY{lRPHOskHvGy4i< z)aGg?V!_h*qghTnE}B6@1%_XRnkBO9KmjS0i$~x?5$1M#}uhVU25r@ zR5vKCUgCH>$qxzkY%m428-GT%g$S26!oF;Bp?5$;Q_`b@J$0YG*ozUM@XTvu~rY=qz2Fi_fgNlSl z8WyI(J$%|ML0n=W#RabbFwe2*pa1kZSYsQno?wePG3}miBTNG+1%D-n%LA@_7h|Q~ z+$AAyT;7*Hb{9%OQHN`6U*I=<&PcJgR!(y(d2X%X2UmK%=`E((+?(#!kZPTXLA5g- zFnw8%LCIK78$rN4I>)%DfncfmQI46dsw7nQjQj@%Dk27HGobS>L`}pGh8G7BSDIsp zP)w#!nz$lzK<14)rhjgXoww0DG+&<>g{!YFa!%?g(OtYM5#LtXG#YM*Jm# zPGyq+z^zDkCHQn|Ao`JH-wqdbC?ZoZkzfJglJ$6g2QO3MP?pNBhbo&15HgoJzG1S~ zp#OpZzJJ`w>GrgH!C+B2hn!qOvX+JLoVPse)~=*A{I1Lh3mM>v)d z#8SC@e%11R)L8I%E4%K6|rwTSxq&1jKhkEE&8mfotV(W z85S+)+2WLtH-3O6)s*EbKC04IfKVZD<{bnmbAbeuW-ruB!&;4#*P3>E@lzK zrhjTU8KhCgZxJ}OynFK@Sz?zV-SWt_>|k0n3DG_O01@IMcHy960Gn%bKbmrI^}ku? zYfQnT>-a)ToP_;&g54OaG^0x+vo=LYC+}^UvGVvu$opcraWhX+em@x5FR(-7buYJ;Vk_VKyt%4T#vySiz*z}AcakJu&9u^z6I%C5Ttd8!hyi}*y zXd~0mK&v`7Aw`5dCKf9}$;7EBI2*ngv~ zaPx~ZafAt)Fym&jU`qc0q^25mduD79gpQ@vzW@*yp`MjmT+)#zdyn&)xTvW6OEn;U zJeDK*c|{Y8JvqJ}HlS`kY|&2FxhB$mLgEUwBh)c{P1LESYn5P0H%F7xeGp_hhjR%V zW?p0U zftiFD^YHVaJ*%)h-B~@@kZp~VX7sT68A?8pHO6bzq$5Xj4G|pI{ zUJ~)tAt7cc1a%%;PBY~n`>HhJvRp(|Oh*s3K2wFtbn2M^>oBd((QqcGv2n&u03uM6 zR;mODUKlQv zn}L^_WS=}Vsq@~NLqbjQAjkNAT`@lhxrXYwCB*qLv+;=B6&y6vKoubf}G-DW)Try7dOQ&Q7oSKXr30z3! zCqXroVJNy<9XM>D$VlqjTE_5 zu-VA4PUUnP--M6A!wJ>~oz2K#c11n>8#Vdo5W3lA@=VO>mb~*%CTo@vcAh=nWd&%X zYz`ZY&yqp{T1-4mD{E&e5Va{Rmy=2DacW>LKIa3@!^Xgn@BZJ>7>`7IyVo-ITc^o_ ztbfCpYg6e`Ebd{tJC@XuWbk)j_5uG173YqJE&JAJG=J|@LF1Ry&)cYF4-)|tJsrCn z1Ul5iZ-kt6p-GJkx1{!8tNV2aIEgQuY^xMBH$|z#`;gR-0(gtvGKn=tMKFV%3Xd$e<8#FK`#r@FjZpSIxWD}a^Og5d z8oY34(|@9+Q6cft+`UxlXB#vK&Ly`R)&a-{Pa4}oWCfD;E)mP#d913D8|P<|0R>&U z(&(~`A_m;enXjMHr~Ed*0*lB--KfWJ&HVgoXtH~3fckkFbp#U37s51|1gx*-R%Zys zF-l5p2Sd<4UPT%UI`UhnTdeu-F8<^u1Ne+88-I+DS|dX^+(`quixkcGW&u7q;~f9& zc1s1hFuzKVC*w-+26HzN6`neteh+(hwA90N3fkndWG2lSnx+0Gb{nIuhYR21M_0i< zumOOOVWaCdFpwe%68>H349`T#K4%Nf`=N6@e@)~#$}0#w*DT#v`EcE-`Qiji+~%A& zn16lvj(m-WkF{O$^Ac8te=!t~Oi4mZg_Pvqb*yY_5Py!VmsYCp-(}b-1y{2Xz?8Sd z8XDx7#SxDGLK*^Tc4C2cYjMd3cxY;4?~M|GNDM)QU3W@vme@2*Bu}ceP|HwjcNIp` zZ5|H1-t6Mdpv{@|L!B-4x;CG=w)32}7N7|CIBG`0x8^%w$aR?(XB|IlSahGk|ezP!yX_a3|xVF$V zTsJDvesi4uNeI4jt7Et&Z%Aa)VLQSYHWs7G1lFe;uEazJ?dIX2*j~^4?_A@h{eS3; zjscszZjMCL%7xso;-5waV2~gYK()8z*yH?!I0bFwzq>#Fd>FxJhqk-xJjWlyf75MMA#3Py8SUmh1d{#a-|2 zlr`~l{cbZ8Zwug3xr~0Q?HSI}0)Mn#)bgBrLW1>iMG_z~Ef^w*DtriBYhHBbTm^P?BnOC>!933H*2X>AKya!Uf(rBY$Bf2a}A` zWbL`sM?tMT>FQV|^C&7>|e=jYXD?&6vdRXqHwsO0vO z(P1D;IYonnIW};dfw=42YlaQhF}p_=Ib*vz#6w&JI9*;>$FWlBoBxsIP7;oN`r-pX z?xSCsg@scrY1J8cQu2IumMk7wtoczGFQiB?rccvq;uF?{+H(aK6n{jO)wLO2y9n1_ zwR;3l&M*a@O_`ZUEY7Q1<=Y#j@7C(OyR%3h6x!xZ>+G{91~1z=QQzgUL&<(yd|+3N z!yqTMff-eBE_}fSt$NDYrkw>AWIE382VSpQjpp;FFGHAXnOt>=wJ)~;CJT}O7R=zp zZis%EoA{Mc@V21#-|$?%r2Yo_DY)MQE88;%@q86BxP(!;cv#7}41KX!ATh^Bo0}R! zu$ytlAT~Ql%*I*2tT>|tf+)q^e1W;n81<$REGzEepu6?1c*+lU@?~kPyQv^ z)PY2fmVcDX@bGuB^ulk4i0zM1(lD6MR9&Q7Y>TX{<-o4ID84_;pih z*Trg-cku4Tc{Ur2A8Xy=gDb|Fb)$GHFcd8z6o2IDs>9>m-z^pi9eArAl~Z6DjZ%s^ zT!>c@SUhg}p8U(3qJW>-6sERFy1hENEe}cAm=4Y@>r}Nvy_l^h%_H)P z2rxiS)I!_4K_j9h$v+C12`1b|s=5(NFty0{k=5_pk$4gOey!nMy0GdL(-#EGB->cQ zLVq}+X6iUB3DN$~62mQ5pLkerc*>%lW3u;f+0)o3$C?UQG=eul@0`tWc&rW^z9v%d zA`fwwfwe2f9UoL0Bnicj+4ia&_gSIpjqqp>dL!@S{&-pNh0m(i`w?lZ40CH8QN!DC za&Xb5)iwv+c47Z2+JBINeqYCz*B6qUs(-lIZnBN1@lwLVt;zc}5iiA_=JTwznzxsF zc}Q^j*G{*e>@$dcM7y#($eFUsR8Ye5IkX|`C&m;x$YM|vrKcs1dYz=tj(J5cAx**Y z5v)L{nL9H!;EzZ;qp26do?r_Hh&JbIO?8@U=)$T;)u|ZzeDgl;;1OYf<~+lp#eeU= zK~J`hqGWx6U-xFiepYrXH>L496V0-8% za9#CbBw1Vm%~l8DyN#xCfZ22Q{{VOpE$^3sMgtR$*}E{YF|+ak zOgIPhMI(`8bC@_e@R1GjgI*vv6`!c1IX$B^zvCvT|$@$=T{}+5hN``lB|py(f9jT2f6f4RkdqDIj>?{g*qy z83_EhGL|OJ|HR5GE6W4yOswo(fc7T#rXP+jCN8ed0ONmjA8();&A%E10zSJsIsL7n z@LwjU|6At2S{DO-f2>U3*2~Al{Xcii#NO5U>;J&!-f8i6i`oPHrN>9=IX$rVQ=N= z3X~E5Ki(fIg#XrA09^pA0H7lP=wWKf^0(YSZ27BZ`>Xzd!N80i<2wR$LoI@{#`;~;{ljinYw%s{bN`V{>d(5Zw>hHP4oLf-kp8EiiJg_L=f8RW zhldvMZ?Ck9ASXK$+yAgxIZIl30L_%GTud$h1?<1{GA%0DWNzvE>4 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 delta 152008 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

    *E=)K&B|)Ge?Aet2A8G% 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 Date: Fri, 27 Dec 2024 16:30:45 +0800 Subject: [PATCH 21/22] ok --- docs/paper/cipher-note.tex | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/paper/cipher-note.tex b/docs/paper/cipher-note.tex index b22aa5a..9a406b4 100644 --- a/docs/paper/cipher-note.tex +++ b/docs/paper/cipher-note.tex @@ -16,7 +16,7 @@ citecolor=blue } -\title{Digest Mining Ciphers: Novel Hash-Based Pre-Image Security Primitives} +\title{Digest Mining Encryption: A Novel Hash-Based Pre-Image Security Primitive} \author{Cris, DOSAYGO} \date{\today} @@ -135,7 +135,7 @@ \subsection*{Ciphertext Expansion} Scatter mode incurs higher overhead due to the need to store an index for each byte of \( P \). Optional compression reduces redundancy in the plaintext before encryption, offsetting this overhead. \subsection*{Timing Security} -Mining the random nonce \( N \) involves a probabilistic search for a valid mapping \( \text{Map}(H(K \parallel N)) = P \). The stochastic runtime behavior ensures that timing attacks are mitigated, as the encryption time varies unpredictably due to secure randomness in the nonce. +Mining the nonce \( N \) involves a probabilistic search for a valid mapping \( \text{Map}(H(K \parallel N)) = P \). The stochastic runtime behavior ensures that timing attacks are mitigated, as the encryption time varies unpredictably. \section*{Tradeoffs} \begin{itemize} @@ -161,7 +161,7 @@ \section*{Tradeoff Summary} \end{center} \section*{Proof of Concept} -The repository contains a working proof-of-concept toy implementation demonstrating the feasibility of this hash-based encryption scheme. This toy is not attacked or analyzed and should not be used by third parties (i.e., you!) for securing valuables. The toy cipher does not use established cryptographic hash functions but instead utilizes the hashes defined in this repository, which are high quality and fast hash functions that pass SMHasher3. The code supports all defined digest search modes (prefix, sequence, scatter) and uses a constant key per session, without a key schedule. It also incorporates compression for improved storage efficiency. +The repository contains a working proof-of-concept toy implementation demonstrating the feasibility of this hash-based encryption scheme. This toy is not attacked or analyzed and should not be used by third parties for securing valuables. The toy cipher does not use established cryptographic hash functions but instead utilizes the hashes defined in this repository, which are high quality and fast hash functions that pass SMHasher3. The code supports all defined digest search modes (prefix, sequence, scatter) and uses a constant key per session, without a key schedule. It also incorporates compression for improved storage efficiency. The repository can be found at: \url{https://github.com/DOSAYGO-Research/rain}. From 23b10269a42704d5deca73411d7360c970da460e Mon Sep 17 00:00:00 2001 From: DOSAYGO Development Team Date: Fri, 27 Dec 2024 16:31:41 +0800 Subject: [PATCH 22/22] Updated --- .gitignore | 1 + docs/paper/cipher-note.aux | 5 - docs/paper/cipher-note.log | 586 ------------------------------------- docs/paper/cipher-note.out | 0 docs/paper/cipher-note.pdf | Bin 242052 -> 242052 bytes docs/paper/cipher-note.tex | 6 +- src/rainsum.cpp | 28 +- 7 files changed, 23 insertions(+), 603 deletions(-) delete mode 100644 docs/paper/cipher-note.aux delete mode 100644 docs/paper/cipher-note.log delete mode 100644 docs/paper/cipher-note.out diff --git a/.gitignore b/.gitignore index af8d732..5f760d9 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ +test_data TEST* *.rc *.rc.dec diff --git a/docs/paper/cipher-note.aux b/docs/paper/cipher-note.aux deleted file mode 100644 index 74b1a21..0000000 --- a/docs/paper/cipher-note.aux +++ /dev/null @@ -1,5 +0,0 @@ -\relax -\providecommand\hyper@newdestlabel[2]{} -\providecommand\HyField@AuxAddToFields[1]{} -\providecommand\HyField@AuxAddToCoFields[2]{} -\gdef \@abspage@last{6} diff --git a/docs/paper/cipher-note.log b/docs/paper/cipher-note.log deleted file mode 100644 index f8bdcdc..0000000 --- a/docs/paper/cipher-note.log +++ /dev/null @@ -1,586 +0,0 @@ -This is pdfTeX, Version 3.141592653-2.6-1.40.26 (TeX Live 2024) (preloaded format=pdflatex 2024.12.15) 27 DEC 2024 16:16 -entering extended mode - restricted \write18 enabled. - %&-line parsing enabled. -**cipher-note.tex -(./cipher-note.tex -LaTeX2e <2023-11-01> patch level 1 -L3 programming layer <2024-02-20> -(/usr/local/texlive/2024basic/texmf-dist/tex/latex/base/article.cls -Document Class: article 2023/05/17 v1.4n Standard LaTeX document class -(/usr/local/texlive/2024basic/texmf-dist/tex/latex/base/size11.clo -File: size11.clo 2023/05/17 v1.4n Standard LaTeX file (size option) -) -\c@part=\count188 -\c@section=\count189 -\c@subsection=\count190 -\c@subsubsection=\count191 -\c@paragraph=\count192 -\c@subparagraph=\count193 -\c@figure=\count194 -\c@table=\count195 -\abovecaptionskip=\skip48 -\belowcaptionskip=\skip49 -\bibindent=\dimen140 -) -(/usr/local/texlive/2024basic/texmf-dist/tex/latex/geometry/geometry.sty -Package: geometry 2020/01/02 v5.9 Page Geometry - -(/usr/local/texlive/2024basic/texmf-dist/tex/latex/graphics/keyval.sty -Package: keyval 2022/05/29 v1.15 key=value parser (DPC) -\KV@toks@=\toks17 -) -(/usr/local/texlive/2024basic/texmf-dist/tex/generic/iftex/ifvtex.sty -Package: ifvtex 2019/10/25 v1.7 ifvtex legacy package. Use iftex instead. - -(/usr/local/texlive/2024basic/texmf-dist/tex/generic/iftex/iftex.sty -Package: iftex 2022/02/03 v1.0f TeX engine tests -)) -\Gm@cnth=\count196 -\Gm@cntv=\count197 -\c@Gm@tempcnt=\count198 -\Gm@bindingoffset=\dimen141 -\Gm@wd@mp=\dimen142 -\Gm@odd@mp=\dimen143 -\Gm@even@mp=\dimen144 -\Gm@layoutwidth=\dimen145 -\Gm@layoutheight=\dimen146 -\Gm@layouthoffset=\dimen147 -\Gm@layoutvoffset=\dimen148 -\Gm@dimlist=\toks18 -) -(/usr/local/texlive/2024basic/texmf-dist/tex/latex/amsmath/amsmath.sty -Package: amsmath 2023/05/13 v2.17o AMS math features -\@mathmargin=\skip50 - -For additional information on amsmath, use the `?' option. -(/usr/local/texlive/2024basic/texmf-dist/tex/latex/amsmath/amstext.sty -Package: amstext 2021/08/26 v2.01 AMS text - -(/usr/local/texlive/2024basic/texmf-dist/tex/latex/amsmath/amsgen.sty -File: amsgen.sty 1999/11/30 v2.0 generic functions -\@emptytoks=\toks19 -\ex@=\dimen149 -)) -(/usr/local/texlive/2024basic/texmf-dist/tex/latex/amsmath/amsbsy.sty -Package: amsbsy 1999/11/29 v1.2d Bold Symbols -\pmbraise@=\dimen150 -) -(/usr/local/texlive/2024basic/texmf-dist/tex/latex/amsmath/amsopn.sty -Package: amsopn 2022/04/08 v2.04 operator names -) -\inf@bad=\count199 -LaTeX Info: Redefining \frac on input line 234. -\uproot@=\count266 -\leftroot@=\count267 -LaTeX Info: Redefining \overline on input line 399. -LaTeX Info: Redefining \colon on input line 410. -\classnum@=\count268 -\DOTSCASE@=\count269 -LaTeX Info: Redefining \ldots on input line 496. -LaTeX Info: Redefining \dots on input line 499. -LaTeX Info: Redefining \cdots on input line 620. -\Mathstrutbox@=\box51 -\strutbox@=\box52 -LaTeX Info: Redefining \big on input line 722. -LaTeX Info: Redefining \Big on input line 723. -LaTeX Info: Redefining \bigg on input line 724. -LaTeX Info: Redefining \Bigg on input line 725. -\big@size=\dimen151 -LaTeX Font Info: Redeclaring font encoding OML on input line 743. -LaTeX Font Info: Redeclaring font encoding OMS on input line 744. -\macc@depth=\count270 -LaTeX Info: Redefining \bmod on input line 905. -LaTeX Info: Redefining \pmod on input line 910. -LaTeX Info: Redefining \smash on input line 940. -LaTeX Info: Redefining \relbar on input line 970. -LaTeX Info: Redefining \Relbar on input line 971. -\c@MaxMatrixCols=\count271 -\dotsspace@=\muskip16 -\c@parentequation=\count272 -\dspbrk@lvl=\count273 -\tag@help=\toks20 -\row@=\count274 -\column@=\count275 -\maxfields@=\count276 -\andhelp@=\toks21 -\eqnshift@=\dimen152 -\alignsep@=\dimen153 -\tagshift@=\dimen154 -\tagwidth@=\dimen155 -\totwidth@=\dimen156 -\lineht@=\dimen157 -\@envbody=\toks22 -\multlinegap=\skip51 -\multlinetaggap=\skip52 -\mathdisplay@stack=\toks23 -LaTeX Info: Redefining \[ on input line 2953. -LaTeX Info: Redefining \] on input line 2954. -) -(/usr/local/texlive/2024basic/texmf-dist/tex/latex/amsfonts/amssymb.sty -Package: amssymb 2013/01/14 v3.01 AMS font symbols - -(/usr/local/texlive/2024basic/texmf-dist/tex/latex/amsfonts/amsfonts.sty -Package: amsfonts 2013/01/14 v3.01 Basic AMSFonts support -\symAMSa=\mathgroup4 -\symAMSb=\mathgroup5 -LaTeX Font Info: Redeclaring math symbol \hbar on input line 98. -LaTeX Font Info: Overwriting math alphabet `\mathfrak' in version `bold' -(Font) U/euf/m/n --> U/euf/b/n on input line 106. -)) -(/usr/local/texlive/2024basic/texmf-dist/tex/latex/hyperref/hyperref.sty -Package: hyperref 2024-01-20 v7.01h Hypertext links for LaTeX - -(/usr/local/texlive/2024basic/texmf-dist/tex/latex/kvsetkeys/kvsetkeys.sty -Package: kvsetkeys 2022-10-05 v1.19 Key value parser (HO) -) -(/usr/local/texlive/2024basic/texmf-dist/tex/generic/kvdefinekeys/kvdefinekeys. -sty -Package: kvdefinekeys 2019-12-19 v1.6 Define keys (HO) -) -(/usr/local/texlive/2024basic/texmf-dist/tex/generic/pdfescape/pdfescape.sty -Package: pdfescape 2019/12/09 v1.15 Implements pdfTeX's escape features (HO) - -(/usr/local/texlive/2024basic/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty -Package: ltxcmds 2023-12-04 v1.26 LaTeX kernel commands for general use (HO) -) -(/usr/local/texlive/2024basic/texmf-dist/tex/generic/pdftexcmds/pdftexcmds.sty -Package: pdftexcmds 2020-06-27 v0.33 Utility functions of pdfTeX for LuaTeX (HO -) - -(/usr/local/texlive/2024basic/texmf-dist/tex/generic/infwarerr/infwarerr.sty -Package: infwarerr 2019/12/03 v1.5 Providing info/warning/error messages (HO) -) -Package pdftexcmds Info: \pdf@primitive is available. -Package pdftexcmds Info: \pdf@ifprimitive is available. -Package pdftexcmds Info: \pdfdraftmode found. -)) (/usr/local/texlive/2024basic/texmf-dist/tex/latex/hycolor/hycolor.sty -Package: hycolor 2020-01-27 v1.10 Color options for hyperref/bookmark (HO) -) -(/usr/local/texlive/2024basic/texmf-dist/tex/latex/auxhook/auxhook.sty -Package: auxhook 2019-12-17 v1.6 Hooks for auxiliary files (HO) -) -(/usr/local/texlive/2024basic/texmf-dist/tex/latex/hyperref/nameref.sty -Package: nameref 2023-11-26 v2.56 Cross-referencing by name of section - -(/usr/local/texlive/2024basic/texmf-dist/tex/latex/refcount/refcount.sty -Package: refcount 2019/12/15 v3.6 Data extraction from label references (HO) -) -(/usr/local/texlive/2024basic/texmf-dist/tex/generic/gettitlestring/gettitlestr -ing.sty -Package: gettitlestring 2019/12/15 v1.6 Cleanup title references (HO) - -(/usr/local/texlive/2024basic/texmf-dist/tex/latex/kvoptions/kvoptions.sty -Package: kvoptions 2022-06-15 v3.15 Key value format for package options (HO) -)) -\c@section@level=\count277 -) -(/usr/local/texlive/2024basic/texmf-dist/tex/latex/etoolbox/etoolbox.sty -Package: etoolbox 2020/10/05 v2.5k e-TeX tools for LaTeX (JAW) -\etb@tempcnta=\count278 -) -\@linkdim=\dimen158 -\Hy@linkcounter=\count279 -\Hy@pagecounter=\count280 - -(/usr/local/texlive/2024basic/texmf-dist/tex/latex/hyperref/pd1enc.def -File: pd1enc.def 2024-01-20 v7.01h Hyperref: PDFDocEncoding definition (HO) -Now handling font encoding PD1 ... -... no UTF-8 mapping file for font encoding PD1 -) -(/usr/local/texlive/2024basic/texmf-dist/tex/generic/intcalc/intcalc.sty -Package: intcalc 2019/12/15 v1.3 Expandable calculations with integers (HO) -) -\Hy@SavedSpaceFactor=\count281 - -(/usr/local/texlive/2024basic/texmf-dist/tex/latex/hyperref/puenc.def -File: puenc.def 2024-01-20 v7.01h Hyperref: PDF Unicode definition (HO) -Now handling font encoding PU ... -... no UTF-8 mapping file for font encoding PU -) -Package hyperref Info: Hyper figures OFF on input line 4179. -Package hyperref Info: Link nesting OFF on input line 4184. -Package hyperref Info: Hyper index ON on input line 4187. -Package hyperref Info: Plain pages OFF on input line 4194. -Package hyperref Info: Backreferencing OFF on input line 4199. -Package hyperref Info: Implicit mode ON; LaTeX internals redefined. -Package hyperref Info: Bookmarks ON on input line 4446. -\c@Hy@tempcnt=\count282 - -(/usr/local/texlive/2024basic/texmf-dist/tex/latex/url/url.sty -\Urlmuskip=\muskip17 -Package: url 2013/09/16 ver 3.4 Verb mode for urls, etc. -) -LaTeX Info: Redefining \url on input line 4784. -\XeTeXLinkMargin=\dimen159 - -(/usr/local/texlive/2024basic/texmf-dist/tex/generic/bitset/bitset.sty -Package: bitset 2019/12/09 v1.3 Handle bit-vector datatype (HO) - -(/usr/local/texlive/2024basic/texmf-dist/tex/generic/bigintcalc/bigintcalc.sty -Package: bigintcalc 2019/12/15 v1.5 Expandable calculations on big integers (HO -) -)) -\Fld@menulength=\count283 -\Field@Width=\dimen160 -\Fld@charsize=\dimen161 -Package hyperref Info: Hyper figures OFF on input line 6063. -Package hyperref Info: Link nesting OFF on input line 6068. -Package hyperref Info: Hyper index ON on input line 6071. -Package hyperref Info: backreferencing OFF on input line 6078. -Package hyperref Info: Link coloring OFF on input line 6083. -Package hyperref Info: Link coloring with OCG OFF on input line 6088. -Package hyperref Info: PDF/A mode OFF on input line 6093. - (/usr/local/texlive/2024basic/texmf-dist/tex/latex/base/atbegshi-ltx.sty -Package: atbegshi-ltx 2021/01/10 v1.0c Emulation of the original atbegshi -package with kernel methods -) -\Hy@abspage=\count284 -\c@Item=\count285 -\c@Hfootnote=\count286 -) -Package hyperref Info: Driver (autodetected): hpdftex. - -(/usr/local/texlive/2024basic/texmf-dist/tex/latex/hyperref/hpdftex.def -File: hpdftex.def 2024-01-20 v7.01h Hyperref driver for pdfTeX - -(/usr/local/texlive/2024basic/texmf-dist/tex/latex/base/atveryend-ltx.sty -Package: atveryend-ltx 2020/08/19 v1.0a Emulation of the original atveryend pac -kage -with kernel methods -) -\Fld@listcount=\count287 -\c@bookmark@seq@number=\count288 - -(/usr/local/texlive/2024basic/texmf-dist/tex/latex/rerunfilecheck/rerunfilechec -k.sty -Package: rerunfilecheck 2022-07-10 v1.10 Rerun checks for auxiliary files (HO) - -(/usr/local/texlive/2024basic/texmf-dist/tex/generic/uniquecounter/uniquecounte -r.sty -Package: uniquecounter 2019/12/15 v1.4 Provide unlimited unique counter (HO) -) -Package uniquecounter Info: New unique counter `rerunfilecheck' on input line 2 -85. -) -\Hy@SectionHShift=\skip53 -) (/usr/local/texlive/2024basic/texmf-dist/tex/latex/lm/lmodern.sty -Package: lmodern 2015/05/01 v1.6.1 Latin Modern Fonts -LaTeX Font Info: Overwriting symbol font `operators' in version `normal' -(Font) OT1/cmr/m/n --> OT1/lmr/m/n on input line 22. -LaTeX Font Info: Overwriting symbol font `letters' in version `normal' -(Font) OML/cmm/m/it --> OML/lmm/m/it on input line 23. -LaTeX Font Info: Overwriting symbol font `symbols' in version `normal' -(Font) OMS/cmsy/m/n --> OMS/lmsy/m/n on input line 24. -LaTeX Font Info: Overwriting symbol font `largesymbols' in version `normal' -(Font) OMX/cmex/m/n --> OMX/lmex/m/n on input line 25. -LaTeX Font Info: Overwriting symbol font `operators' in version `bold' -(Font) OT1/cmr/bx/n --> OT1/lmr/bx/n on input line 26. -LaTeX Font Info: Overwriting symbol font `letters' in version `bold' -(Font) OML/cmm/b/it --> OML/lmm/b/it on input line 27. -LaTeX Font Info: Overwriting symbol font `symbols' in version `bold' -(Font) OMS/cmsy/b/n --> OMS/lmsy/b/n on input line 28. -LaTeX Font Info: Overwriting symbol font `largesymbols' in version `bold' -(Font) OMX/cmex/m/n --> OMX/lmex/m/n on input line 29. -LaTeX Font Info: Overwriting math alphabet `\mathbf' in version `normal' -(Font) OT1/cmr/bx/n --> OT1/lmr/bx/n on input line 31. -LaTeX Font Info: Overwriting math alphabet `\mathsf' in version `normal' -(Font) OT1/cmss/m/n --> OT1/lmss/m/n on input line 32. -LaTeX Font Info: Overwriting math alphabet `\mathit' in version `normal' -(Font) OT1/cmr/m/it --> OT1/lmr/m/it on input line 33. -LaTeX Font Info: Overwriting math alphabet `\mathtt' in version `normal' -(Font) OT1/cmtt/m/n --> OT1/lmtt/m/n on input line 34. -LaTeX Font Info: Overwriting math alphabet `\mathbf' in version `bold' -(Font) OT1/cmr/bx/n --> OT1/lmr/bx/n on input line 35. -LaTeX Font Info: Overwriting math alphabet `\mathsf' in version `bold' -(Font) OT1/cmss/bx/n --> OT1/lmss/bx/n on input line 36. -LaTeX Font Info: Overwriting math alphabet `\mathit' in version `bold' -(Font) OT1/cmr/bx/it --> OT1/lmr/bx/it on input line 37. -LaTeX Font Info: Overwriting math alphabet `\mathtt' in version `bold' -(Font) OT1/cmtt/m/n --> OT1/lmtt/m/n on input line 38. -) -(/usr/local/texlive/2024basic/texmf-dist/tex/latex/base/fontenc.sty -Package: fontenc 2021/04/29 v2.0v Standard LaTeX package -LaTeX Font Info: Trying to load font information for T1+lmr on input line 11 -2. - -(/usr/local/texlive/2024basic/texmf-dist/tex/latex/lm/t1lmr.fd -File: t1lmr.fd 2015/05/01 v1.6.1 Font defs for Latin Modern -)) -(/usr/local/texlive/2024basic/texmf-dist/tex/latex/tools/array.sty -Package: array 2023/10/16 v2.5g Tabular extension package (FMi) -\col@sep=\dimen162 -\ar@mcellbox=\box53 -\extrarowheight=\dimen163 -\NC@list=\toks24 -\extratabsurround=\skip54 -\backup@length=\skip55 -\ar@cellbox=\box54 -) -(/usr/local/texlive/2024basic/texmf-dist/tex/latex/booktabs/booktabs.sty -Package: booktabs 2020/01/12 v1.61803398 Publication quality tables -\heavyrulewidth=\dimen164 -\lightrulewidth=\dimen165 -\cmidrulewidth=\dimen166 -\belowrulesep=\dimen167 -\belowbottomsep=\dimen168 -\aboverulesep=\dimen169 -\abovetopsep=\dimen170 -\cmidrulesep=\dimen171 -\cmidrulekern=\dimen172 -\defaultaddspace=\dimen173 -\@cmidla=\count289 -\@cmidlb=\count290 -\@aboverulesep=\dimen174 -\@belowrulesep=\dimen175 -\@thisruleclass=\count291 -\@lastruleclass=\count292 -\@thisrulewidth=\dimen176 -) -(/usr/local/texlive/2024basic/texmf-dist/tex/latex/listings/listings.sty -\lst@mode=\count293 -\lst@gtempboxa=\box55 -\lst@token=\toks25 -\lst@length=\count294 -\lst@currlwidth=\dimen177 -\lst@column=\count295 -\lst@pos=\count296 -\lst@lostspace=\dimen178 -\lst@width=\dimen179 -\lst@newlines=\count297 -\lst@lineno=\count298 -\lst@maxwidth=\dimen180 - -(/usr/local/texlive/2024basic/texmf-dist/tex/latex/listings/lstpatch.sty -File: lstpatch.sty 2024/02/21 1.10 (Carsten Heinz) -) -(/usr/local/texlive/2024basic/texmf-dist/tex/latex/listings/lstmisc.sty -File: lstmisc.sty 2024/02/21 1.10 (Carsten Heinz) -\c@lstnumber=\count299 -\lst@skipnumbers=\count300 -\lst@framebox=\box56 -) -(/usr/local/texlive/2024basic/texmf-dist/tex/latex/listings/listings.cfg -File: listings.cfg 2024/02/21 1.10 listings configuration -)) -Package: listings 2024/02/21 1.10 (Carsten Heinz) - -(/usr/local/texlive/2024basic/texmf-dist/tex/latex/xcolor/xcolor.sty -Package: xcolor 2023/11/15 v3.01 LaTeX color extensions (UK) - -(/usr/local/texlive/2024basic/texmf-dist/tex/latex/graphics-cfg/color.cfg -File: color.cfg 2016/01/02 v1.6 sample color configuration -) -Package xcolor Info: Driver file: pdftex.def on input line 274. - -(/usr/local/texlive/2024basic/texmf-dist/tex/latex/graphics-def/pdftex.def -File: pdftex.def 2022/09/22 v1.2b Graphics/color driver for pdftex -) -(/usr/local/texlive/2024basic/texmf-dist/tex/latex/graphics/mathcolor.ltx) -Package xcolor Info: Model `cmy' substituted by `cmy0' on input line 1350. -Package xcolor Info: Model `hsb' substituted by `rgb' on input line 1354. -Package xcolor Info: Model `RGB' extended on input line 1366. -Package xcolor Info: Model `HTML' substituted by `rgb' on input line 1368. -Package xcolor Info: Model `Hsb' substituted by `hsb' on input line 1369. -Package xcolor Info: Model `tHsb' substituted by `hsb' on input line 1370. -Package xcolor Info: Model `HSB' substituted by `hsb' on input line 1371. -Package xcolor Info: Model `Gray' substituted by `gray' on input line 1372. -Package xcolor Info: Model `wave' substituted by `hsb' on input line 1373. -) -Package hyperref Info: Option `colorlinks' set `true' on input line 17. - -(/usr/local/texlive/2024basic/texmf-dist/tex/latex/l3backend/l3backend-pdftex.d -ef -File: l3backend-pdftex.def 2024-02-20 L3 backend support: PDF output (pdfTeX) -\l__color_backend_stack_int=\count301 -\l__pdf_internal_box=\box57 -) (./cipher-note.aux) -\openout1 = `cipher-note.aux'. - -LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 27. -LaTeX Font Info: ... okay on input line 27. -LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 27. -LaTeX Font Info: ... okay on input line 27. -LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 27. -LaTeX Font Info: ... okay on input line 27. -LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 27. -LaTeX Font Info: ... okay on input line 27. -LaTeX Font Info: Checking defaults for TS1/cmr/m/n on input line 27. -LaTeX Font Info: ... okay on input line 27. -LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 27. -LaTeX Font Info: ... okay on input line 27. -LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 27. -LaTeX Font Info: ... okay on input line 27. -LaTeX Font Info: Checking defaults for PD1/pdf/m/n on input line 27. -LaTeX Font Info: ... okay on input line 27. -LaTeX Font Info: Checking defaults for PU/pdf/m/n on input line 27. -LaTeX Font Info: ... okay on input line 27. - -*geometry* driver: auto-detecting -*geometry* detected driver: pdftex -*geometry* verbose mode - [ preamble ] result: -* driver: pdftex -* paper: a4paper -* layout: -* layoutoffset:(h,v)=(0.0pt,0.0pt) -* modes: -* h-part:(L,W,R)=(72.26999pt, 452.9679pt, 72.26999pt) -* v-part:(T,H,B)=(72.26999pt, 700.50687pt, 72.26999pt) -* \paperwidth=597.50787pt -* \paperheight=845.04684pt -* \textwidth=452.9679pt -* \textheight=700.50687pt -* \oddsidemargin=0.0pt -* \evensidemargin=0.0pt -* \topmargin=-37.0pt -* \headheight=12.0pt -* \headsep=25.0pt -* \topskip=11.0pt -* \footskip=30.0pt -* \marginparwidth=50.0pt -* \marginparsep=10.0pt -* \columnsep=10.0pt -* \skip\footins=10.0pt plus 4.0pt minus 2.0pt -* \hoffset=0.0pt -* \voffset=0.0pt -* \mag=1000 -* \@twocolumnfalse -* \@twosidefalse -* \@mparswitchfalse -* \@reversemarginfalse -* (1in=72.27pt=25.4mm, 1cm=28.453pt) - -Package hyperref Info: Link coloring ON on input line 27. -(./cipher-note.out) (./cipher-note.out) -\@outlinefile=\write3 -\openout3 = `cipher-note.out'. - -\c@lstlisting=\count302 - -(/usr/local/texlive/2024basic/texmf-dist/tex/context/base/mkii/supp-pdf.mkii -[Loading MPS to PDF converter (version 2006.09.02).] -\scratchcounter=\count303 -\scratchdimen=\dimen181 -\scratchbox=\box58 -\nofMPsegments=\count304 -\nofMParguments=\count305 -\everyMPshowfont=\toks26 -\MPscratchCnt=\count306 -\MPscratchDim=\dimen182 -\MPnumerator=\count307 -\makeMPintoPDFobject=\count308 -\everyMPtoPDFconversion=\toks27 -) -LaTeX Font Info: Trying to load font information for OT1+lmr on input line 2 -9. - (/usr/local/texlive/2024basic/texmf-dist/tex/latex/lm/ot1lmr.fd -File: ot1lmr.fd 2015/05/01 v1.6.1 Font defs for Latin Modern -) -LaTeX Font Info: Trying to load font information for OML+lmm on input line 2 -9. - -(/usr/local/texlive/2024basic/texmf-dist/tex/latex/lm/omllmm.fd -File: omllmm.fd 2015/05/01 v1.6.1 Font defs for Latin Modern -) -LaTeX Font Info: Trying to load font information for OMS+lmsy on input line -29. - -(/usr/local/texlive/2024basic/texmf-dist/tex/latex/lm/omslmsy.fd -File: omslmsy.fd 2015/05/01 v1.6.1 Font defs for Latin Modern -) -LaTeX Font Info: Trying to load font information for OMX+lmex on input line -29. - -(/usr/local/texlive/2024basic/texmf-dist/tex/latex/lm/omxlmex.fd -File: omxlmex.fd 2015/05/01 v1.6.1 Font defs for Latin Modern -) -LaTeX Font Info: External font `lmex10' loaded for size -(Font) <12> on input line 29. -LaTeX Font Info: External font `lmex10' loaded for size -(Font) <8> on input line 29. -LaTeX Font Info: External font `lmex10' loaded for size -(Font) <6> on input line 29. -LaTeX Font Info: Trying to load font information for U+msa on input line 29. - - -(/usr/local/texlive/2024basic/texmf-dist/tex/latex/amsfonts/umsa.fd -File: umsa.fd 2013/01/14 v3.01 AMS symbols A -) -LaTeX Font Info: Trying to load font information for U+msb on input line 29. - - -(/usr/local/texlive/2024basic/texmf-dist/tex/latex/amsfonts/umsb.fd -File: umsb.fd 2013/01/14 v3.01 AMS symbols B -) [1 - -{/usr/local/texlive/2024basic/texmf-var/fonts/map/pdftex/updmap/pdftex.map}{/us -r/local/texlive/2024basic/texmf-dist/fonts/enc/dvips/lm/lm-ec.enc}] -LaTeX Font Info: Trying to load font information for TS1+lmr on input line 4 -8. - -(/usr/local/texlive/2024basic/texmf-dist/tex/latex/lm/ts1lmr.fd -File: ts1lmr.fd 2015/05/01 v1.6.1 Font defs for Latin Modern -) -LaTeX Font Info: External font `lmex10' loaded for size -(Font) <10.95> on input line 63. - [2{/usr/local/texlive/2024basic/texmf-dist/fonts/enc/dvips/lm/lm-ts1.enc}{/usr -/local/texlive/2024basic/texmf-dist/fonts/enc/dvips/lm/lm-rm.enc}{/usr/local/te -xlive/2024basic/texmf-dist/fonts/enc/dvips/lm/lm-mathit.enc}] [3{/usr/local/tex -live/2024basic/texmf-dist/fonts/enc/dvips/lm/lm-mathsy.enc}] -LaTeX Font Info: External font `lmex10' loaded for size -(Font) <10> on input line 152. -LaTeX Font Info: External font `lmex10' loaded for size -(Font) <7> on input line 152. -LaTeX Font Info: External font `lmex10' loaded for size -(Font) <5> on input line 152. - -Underfull \hbox (badness 1325) in paragraph at lines 157--158 -[]|\T1/lmr/m/n/10 Requires stor-ing an in-dex for ev-ery - [] - - -Overfull \hbox (19.10587pt too wide) in paragraph at lines 152--161 - [] - [] - -[4] -LaTeX Font Info: Trying to load font information for T1+lmtt on input line 1 -66. - (/usr/local/texlive/2024basic/texmf-dist/tex/latex/lm/t1lmtt.fd -File: t1lmtt.fd 2015/05/01 v1.6.1 Font defs for Latin Modern -) [5] -[6] (./cipher-note.aux) - *********** -LaTeX2e <2023-11-01> patch level 1 -L3 programming layer <2024-02-20> - *********** -Package rerunfilecheck Info: File `cipher-note.out' has not changed. -(rerunfilecheck) Checksum: D41D8CD98F00B204E9800998ECF8427E;0. - ) -Here is how much of TeX's memory you used: - 12100 strings out of 475567 - 182597 string characters out of 5777888 - 1937187 words of memory out of 5000000 - 34054 multiletter control sequences out of 15000+600000 - 624579 words of font info for 87 fonts, out of 8000000 for 9000 - 319 hyphenation exceptions out of 8191 - 75i,8n,79p,1015b,589s stack positions out of 10000i,1000n,20000p,200000b,200000s - -Output written on cipher-note.pdf (6 pages, 242052 bytes). -PDF statistics: - 135 PDF objects out of 1000 (max. 8388607) - 99 compressed objects within 1 object stream - 29 named destinations out of 1000 (max. 500000) - 1 words of extra memory for PDF output out of 10000 (max. 10000000) - diff --git a/docs/paper/cipher-note.out b/docs/paper/cipher-note.out deleted file mode 100644 index e69de29..0000000 diff --git a/docs/paper/cipher-note.pdf b/docs/paper/cipher-note.pdf index 2e5c6230510cb1d918b7abd9fcc63878a74f1703..c930c1befcd0a46b8668babbc0d29de213a970ed 100644 GIT binary patch delta 110 zcmZp9%-8amuc3vpg=q_O?OYaPLnG7ajdPjh!L02|<}#lXbT)FbaJDcrHE?z_H8nD} hv@me9G`BP`H*_^Mb#gUuwzN~QA*5vc*7eNi837B}9;pBT delta 110 zcmZp9%-8amuc3vpg=q_O?OYZ^GXvx4jdPjh!L02|<}#lXbT%|JFg7$XcXf6%H#IXe hHgI(@aW%IvHFGp@baHgFw6IgKA*5vc*7eNi8376|9>V|t diff --git a/docs/paper/cipher-note.tex b/docs/paper/cipher-note.tex index 9a406b4..b22aa5a 100644 --- a/docs/paper/cipher-note.tex +++ b/docs/paper/cipher-note.tex @@ -16,7 +16,7 @@ citecolor=blue } -\title{Digest Mining Encryption: A Novel Hash-Based Pre-Image Security Primitive} +\title{Digest Mining Ciphers: Novel Hash-Based Pre-Image Security Primitives} \author{Cris, DOSAYGO} \date{\today} @@ -135,7 +135,7 @@ \subsection*{Ciphertext Expansion} Scatter mode incurs higher overhead due to the need to store an index for each byte of \( P \). Optional compression reduces redundancy in the plaintext before encryption, offsetting this overhead. \subsection*{Timing Security} -Mining the nonce \( N \) involves a probabilistic search for a valid mapping \( \text{Map}(H(K \parallel N)) = P \). The stochastic runtime behavior ensures that timing attacks are mitigated, as the encryption time varies unpredictably. +Mining the random nonce \( N \) involves a probabilistic search for a valid mapping \( \text{Map}(H(K \parallel N)) = P \). The stochastic runtime behavior ensures that timing attacks are mitigated, as the encryption time varies unpredictably due to secure randomness in the nonce. \section*{Tradeoffs} \begin{itemize} @@ -161,7 +161,7 @@ \section*{Tradeoff Summary} \end{center} \section*{Proof of Concept} -The repository contains a working proof-of-concept toy implementation demonstrating the feasibility of this hash-based encryption scheme. This toy is not attacked or analyzed and should not be used by third parties for securing valuables. The toy cipher does not use established cryptographic hash functions but instead utilizes the hashes defined in this repository, which are high quality and fast hash functions that pass SMHasher3. The code supports all defined digest search modes (prefix, sequence, scatter) and uses a constant key per session, without a key schedule. It also incorporates compression for improved storage efficiency. +The repository contains a working proof-of-concept toy implementation demonstrating the feasibility of this hash-based encryption scheme. This toy is not attacked or analyzed and should not be used by third parties (i.e., you!) for securing valuables. The toy cipher does not use established cryptographic hash functions but instead utilizes the hashes defined in this repository, which are high quality and fast hash functions that pass SMHasher3. The code supports all defined digest search modes (prefix, sequence, scatter) and uses a constant key per session, without a key schedule. It also incorporates compression for improved storage efficiency. The repository can be found at: \url{https://github.com/DOSAYGO-Research/rain}. diff --git a/src/rainsum.cpp b/src/rainsum.cpp index c7ccf0f..9b05751 100644 --- a/src/rainsum.cpp +++ b/src/rainsum.cpp @@ -552,14 +552,12 @@ static void puzzleEncryptFileWithHeader( } else if (searchModeEnum == 0x01) { // Sequence // Search for block as a contiguous substring - bool seqFound = false; uint8_t startIdx = 0; for (size_t i = 0; i <= hashOut.size() - thisBlockSize; i++) { if (std::equal(block.begin(), block.end(), hashOut.begin() + i)) { startIdx = static_cast(i); // Ensure it fits in uint8_t scatterIndices.assign(thisBlockSize, startIdx); // All bytes share the same start index found = true; - seqFound = true; break; } } @@ -806,8 +804,8 @@ int main(int argc, char** argv) { ("match-prefix", "Hex prefix to match in mining tasks", cxxopts::value()->default_value("")) // Encrypt / Decrypt options - ("p,puzzle-len", "Number of bytes in the puzzle prefix [default: 3]", - cxxopts::value()->default_value("3")) + ("P,password", "Encryption/Decryption password", + cxxopts::value()->default_value("")) ("h,help", "Print usage"); // Parse command-line options @@ -826,9 +824,6 @@ int main(int argc, char** argv) { // Access and validate options - // Puzzle Length - size_t puzzleLen = result["puzzle-len"].as(); - // Hash Size uint32_t hash_size = result["size"].as(); @@ -916,6 +911,9 @@ int main(int argc, char** argv) { inpath = result.unmatched().front(); } + std::string password = result["password"].as(); + + // Handle Mining Modes if (mine_mode != MineMode::None) { if (prefixHex.empty()) { @@ -989,7 +987,13 @@ int main(int argc, char** argv) { if (inpath.empty()) { throw std::runtime_error("No input file specified for encryption."); } - std::string key = promptForKey("Enter encryption key: "); + std::string key; + if (!password.empty()) { + key = password; + } + else { + key = promptForKey("Enter encryption key: "); + } // We'll write ciphertext to inpath + ".rc" std::string encFile = inpath + ".rc"; @@ -1001,7 +1005,13 @@ int main(int argc, char** argv) { if (inpath.empty()) { throw std::runtime_error("No ciphertext file specified for decryption."); } - std::string key = promptForKey("Enter decryption key: "); + std::string key; + if (!password.empty()) { + key = password; + } + else { + key = promptForKey("Enter encryption key: "); + } // We'll write plaintext to inpath + ".dec" std::string decFile = inpath + ".dec";