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;
}







1












$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(())
}








share









$endgroup$



















    1












    $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(())
    }








    share









    $endgroup$















      1












      1








      1





      $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(())
      }








      share









      $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





      share












      share










      share



      share










      asked 6 mins ago









      carloabellicarloabelli

      1212




      1212






















          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
          });


          }
          });














          draft saved

          draft discarded


















          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
















          draft saved

          draft discarded




















































          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.




          draft saved


          draft discarded














          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





















































          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







          Popular posts from this blog

          is 'sed' thread safeWhat should someone know about using Python scripts in the shell?Nexenta bash script uses...

          How do i solve the “ No module named 'mlxtend' ” issue on Jupyter?

          Pilgersdorf Inhaltsverzeichnis Geografie | Geschichte | Bevölkerungsentwicklung | Politik | Kultur...