Simple One-Time Pad in Rust The 2019 Stack Overflow Developer Survey Results Are InSimple cat...
Inline version of a function returns different value than non-inline version
Is bread bad for ducks?
Inflated grade on resume at previous job, might former employer tell new employer?
Why did Howard Stark use all the Vibranium they had on a prototype shield?
Limit to 0 ambiguity
Lethal sonic weapons
Landlord wants to switch my lease to a "Land contract" to "get back at the city"
Access elements in std::string where positon of string is greater than its size
Does it makes sense to buy a new cycle to learn riding?
If the Wish spell is used to duplicate the effect of Simulacrum, are existing duplicates destroyed?
Dual Citizen. Exited the US on Italian passport recently
How to make payment on the internet without leaving a money trail?
I see my dog run
What tool would a Roman-age civilization have to grind silver and other metals into dust?
Is three citations per paragraph excessive for undergraduate research paper?
A poker game description that does not feel gimmicky
What do hard-Brexiteers want with respect to the Irish border?
Should I use my personal or workplace e-mail when registering to external websites for work purpose?
Realistic Alternatives to Dust: What Else Could Feed a Plankton Bloom?
What is the steepest angle that a canal can be traversable without locks?
Is there a name of the flying bionic bird?
What could be the right powersource for 15 seconds lifespan disposable giant chainsaw?
What does Linus Torvalds mean when he says that Git "never ever" tracks a file?
CiviEvent: Public link for events of a specific type
Simple One-Time Pad in Rust
The 2019 Stack Overflow Developer Survey Results Are InSimple cat in RustSimple TCP client in RustSimple graph in RustSimple virtual machine in RustSimple ASCII art in RustSimple Rust WebserverA simple maze generator written in RustSimple Sudoku solver in RustSimple interpreter written in RustSimple Brainfuck Interpreter in Rust
.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty{ margin-bottom:0;
}
$begingroup$
I am new to rust and to start learning the language I decided to implement a simple one-time pad encryption program.
The part I am least sure about is the reading and writing from the files. Ideally this would run efficiently on large files.
use clap::{Arg, App};
use std::{
error::Error,
fs::File,
io::{
self,
Read,
Write,
},
};
const CAPACITY: usize = 1024;
fn main() -> Result<(), Box<dyn Error>> {
let matches = App::new("onetime")
.version("0.1")
.author("Carlo Abelli <carlo@abelli.xyz>")
.about("Encrypts/decrypts a file using a one-time pad.")
.arg(Arg::with_name("FILE")
.required(true)
.help("The file to encrypt/decrypt"))
.arg(Arg::with_name("PAD")
.short("p")
.long("pad")
.takes_value(true)
.value_name("PAD")
.required(true)
.help("The pad to use for encryption/decryption"))
.arg(Arg::with_name("OUTPUT")
.short("o")
.long("output")
.value_name("OUT")
.help("The output file (default: stdout)"))
.get_matches();
let mut file = File::open(matches.value_of("FILE").unwrap())?;
let mut pad = File::open(matches.value_of("PAD").unwrap())?;
if file.metadata()?.len() > pad.metadata()?.len() {
panic!("file is larger than pad!");
}
let mut out: Box<dyn Write> = match matches.value_of("OUTPUT") {
Some(name) => Box::new(File::create(name)?),
None => Box::new(io::stdout()),
};
let mut file_buffer = vec![0u8; CAPACITY];
let mut pad_buffer = vec![0u8; CAPACITY];
loop {
let size = file.read(&mut file_buffer)?;
if size == 0 {
break;
}
pad.read_exact(&mut pad_buffer[..size])?;
let out_buffer: Vec<u8> = pad_buffer.iter()
.zip(file_buffer.iter())
.map(|(pad_byte, file_byte)| pad_byte ^ file_byte)
.collect();
out.write_all(&out_buffer)?;
}
Ok(())
}
rust
$endgroup$
add a comment |
$begingroup$
I am new to rust and to start learning the language I decided to implement a simple one-time pad encryption program.
The part I am least sure about is the reading and writing from the files. Ideally this would run efficiently on large files.
use clap::{Arg, App};
use std::{
error::Error,
fs::File,
io::{
self,
Read,
Write,
},
};
const CAPACITY: usize = 1024;
fn main() -> Result<(), Box<dyn Error>> {
let matches = App::new("onetime")
.version("0.1")
.author("Carlo Abelli <carlo@abelli.xyz>")
.about("Encrypts/decrypts a file using a one-time pad.")
.arg(Arg::with_name("FILE")
.required(true)
.help("The file to encrypt/decrypt"))
.arg(Arg::with_name("PAD")
.short("p")
.long("pad")
.takes_value(true)
.value_name("PAD")
.required(true)
.help("The pad to use for encryption/decryption"))
.arg(Arg::with_name("OUTPUT")
.short("o")
.long("output")
.value_name("OUT")
.help("The output file (default: stdout)"))
.get_matches();
let mut file = File::open(matches.value_of("FILE").unwrap())?;
let mut pad = File::open(matches.value_of("PAD").unwrap())?;
if file.metadata()?.len() > pad.metadata()?.len() {
panic!("file is larger than pad!");
}
let mut out: Box<dyn Write> = match matches.value_of("OUTPUT") {
Some(name) => Box::new(File::create(name)?),
None => Box::new(io::stdout()),
};
let mut file_buffer = vec![0u8; CAPACITY];
let mut pad_buffer = vec![0u8; CAPACITY];
loop {
let size = file.read(&mut file_buffer)?;
if size == 0 {
break;
}
pad.read_exact(&mut pad_buffer[..size])?;
let out_buffer: Vec<u8> = pad_buffer.iter()
.zip(file_buffer.iter())
.map(|(pad_byte, file_byte)| pad_byte ^ file_byte)
.collect();
out.write_all(&out_buffer)?;
}
Ok(())
}
rust
$endgroup$
add a comment |
$begingroup$
I am new to rust and to start learning the language I decided to implement a simple one-time pad encryption program.
The part I am least sure about is the reading and writing from the files. Ideally this would run efficiently on large files.
use clap::{Arg, App};
use std::{
error::Error,
fs::File,
io::{
self,
Read,
Write,
},
};
const CAPACITY: usize = 1024;
fn main() -> Result<(), Box<dyn Error>> {
let matches = App::new("onetime")
.version("0.1")
.author("Carlo Abelli <carlo@abelli.xyz>")
.about("Encrypts/decrypts a file using a one-time pad.")
.arg(Arg::with_name("FILE")
.required(true)
.help("The file to encrypt/decrypt"))
.arg(Arg::with_name("PAD")
.short("p")
.long("pad")
.takes_value(true)
.value_name("PAD")
.required(true)
.help("The pad to use for encryption/decryption"))
.arg(Arg::with_name("OUTPUT")
.short("o")
.long("output")
.value_name("OUT")
.help("The output file (default: stdout)"))
.get_matches();
let mut file = File::open(matches.value_of("FILE").unwrap())?;
let mut pad = File::open(matches.value_of("PAD").unwrap())?;
if file.metadata()?.len() > pad.metadata()?.len() {
panic!("file is larger than pad!");
}
let mut out: Box<dyn Write> = match matches.value_of("OUTPUT") {
Some(name) => Box::new(File::create(name)?),
None => Box::new(io::stdout()),
};
let mut file_buffer = vec![0u8; CAPACITY];
let mut pad_buffer = vec![0u8; CAPACITY];
loop {
let size = file.read(&mut file_buffer)?;
if size == 0 {
break;
}
pad.read_exact(&mut pad_buffer[..size])?;
let out_buffer: Vec<u8> = pad_buffer.iter()
.zip(file_buffer.iter())
.map(|(pad_byte, file_byte)| pad_byte ^ file_byte)
.collect();
out.write_all(&out_buffer)?;
}
Ok(())
}
rust
$endgroup$
I am new to rust and to start learning the language I decided to implement a simple one-time pad encryption program.
The part I am least sure about is the reading and writing from the files. Ideally this would run efficiently on large files.
use clap::{Arg, App};
use std::{
error::Error,
fs::File,
io::{
self,
Read,
Write,
},
};
const CAPACITY: usize = 1024;
fn main() -> Result<(), Box<dyn Error>> {
let matches = App::new("onetime")
.version("0.1")
.author("Carlo Abelli <carlo@abelli.xyz>")
.about("Encrypts/decrypts a file using a one-time pad.")
.arg(Arg::with_name("FILE")
.required(true)
.help("The file to encrypt/decrypt"))
.arg(Arg::with_name("PAD")
.short("p")
.long("pad")
.takes_value(true)
.value_name("PAD")
.required(true)
.help("The pad to use for encryption/decryption"))
.arg(Arg::with_name("OUTPUT")
.short("o")
.long("output")
.value_name("OUT")
.help("The output file (default: stdout)"))
.get_matches();
let mut file = File::open(matches.value_of("FILE").unwrap())?;
let mut pad = File::open(matches.value_of("PAD").unwrap())?;
if file.metadata()?.len() > pad.metadata()?.len() {
panic!("file is larger than pad!");
}
let mut out: Box<dyn Write> = match matches.value_of("OUTPUT") {
Some(name) => Box::new(File::create(name)?),
None => Box::new(io::stdout()),
};
let mut file_buffer = vec![0u8; CAPACITY];
let mut pad_buffer = vec![0u8; CAPACITY];
loop {
let size = file.read(&mut file_buffer)?;
if size == 0 {
break;
}
pad.read_exact(&mut pad_buffer[..size])?;
let out_buffer: Vec<u8> = pad_buffer.iter()
.zip(file_buffer.iter())
.map(|(pad_byte, file_byte)| pad_byte ^ file_byte)
.collect();
out.write_all(&out_buffer)?;
}
Ok(())
}
rust
rust
asked 6 mins ago
carloabellicarloabelli
1212
1212
add a comment |
add a comment |
0
active
oldest
votes
Your Answer
StackExchange.ifUsing("editor", function () {
return StackExchange.using("mathjaxEditing", function () {
StackExchange.MarkdownEditor.creationCallbacks.add(function (editor, postfix) {
StackExchange.mathjaxEditing.prepareWmdForMathJax(editor, postfix, [["\$", "\$"]]);
});
});
}, "mathjax-editing");
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "196"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: false,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: null,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodereview.stackexchange.com%2fquestions%2f217182%2fsimple-one-time-pad-in-rust%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
0
active
oldest
votes
0
active
oldest
votes
active
oldest
votes
active
oldest
votes
Thanks for contributing an answer to Code Review Stack Exchange!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
Use MathJax to format equations. MathJax reference.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodereview.stackexchange.com%2fquestions%2f217182%2fsimple-one-time-pad-in-rust%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown