pset2: crypto oldman pset2: crypto caesar vigenere

Post on 03-Nov-2021

16 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

pset2: Crypto

TommyMacWilliam

Appliance

oldman

Caesar

Vigenere

Design

pset2: Crypto

Tommy MacWilliam

tmacwilliam@cs50.net

September 18, 2011

pset2: Crypto

TommyMacWilliam

Appliance

oldman

Caesar

Vigenere

Design

Today’s Music

I RehabI ScarecrowI Storm ChaserI 1980I Graffiti the WorldI Running out of Time

pset2: Crypto

TommyMacWilliam

Appliance

oldman

Caesar

Vigenere

Design

BEFORE YOU DO ANYTHING

jharvard@appliance (~): sudo yum -y updatePassword: crimson

I do this before you do anything with submit50!I you don’t see your password, but you are indeed

inputting it!

pset2: Crypto

TommyMacWilliam

Appliance

oldman

Caesar

Vigenere

Design

Backing up Code

I submit50 saves your code on the CS50 siteI we only grade your latest submission, so submit50

often to back up!

I Dropbox (http://dropbox.com) already integrated intothe appliance

I automatically backs up your code to Dropbox’s site

pset2: Crypto

TommyMacWilliam

Appliance

oldman

Caesar

Vigenere

Design

Getting Code off the Appliance

I MacI select “Connect to Server” from Finder’s “Go” menuI input smb://192.168.56.50 under “Server Address”

I WindowsI open Windows Explorer, aka My ComputerI input \\192.168.56.50\jharvard into the address bar

pset2: Crypto

TommyMacWilliam

Appliance

oldman

Caesar

Vigenere

Design

This old man

jharvard@appliance (~/pset2): ./oldmanThis old man, he played oneHe played knick-knack on my thumbKnick-knack paddywhack, give your dog a boneThis old man came rolling home

pset2: Crypto

TommyMacWilliam

Appliance

oldman

Caesar

Vigenere

Design

TODO

1. loop over verses2. display each verse

pset2: Crypto

TommyMacWilliam

Appliance

oldman

Caesar

Vigenere

Design

Loops

I 10 verses, each slightly differentI can store verses in variables

I verses are only slightly different, so avoid repetition!

I can use conditionsI different text is displayed depending on verse number

pset2: Crypto

TommyMacWilliam

Appliance

oldman

Caesar

Vigenere

Design

TODO

1. loop over verses2. display each verse

pset2: Crypto

TommyMacWilliam

Appliance

oldman

Caesar

Vigenere

Design

Functions

I function: block of code aimed at accomplishing a singletask

I take input, produce output

I task: display a verseI input: which verse to displayI output: text of verse

pset2: Crypto

TommyMacWilliam

Appliance

oldman

Caesar

Vigenere

Design

TODO

1. loop over verses2. display each verse

pset2: Crypto

TommyMacWilliam

Appliance

oldman

Caesar

Vigenere

Design

Caesar

jharvard@appliance (~/pset2): ./caesar 13This is CS50.Guvf vf PF50.

pset2: Crypto

TommyMacWilliam

Appliance

oldman

Caesar

Vigenere

Design

TODO

1. get k from command line and convert to int2. prompt for string to encode3. loop over each character of the string4. output each encoded letter, making sure to not encode

non-letters

pset2: Crypto

TommyMacWilliam

Appliance

oldman

Caesar

Vigenere

Design

Getting Input

I argc: number of arguments givenI argv[]: array of stringsI ./caesar 13

I argc == 2I argv[0] == "caesar"I argv[1] == "13"

pset2: Crypto

TommyMacWilliam

Appliance

oldman

Caesar

Vigenere

Design

atoi

I converts a string to an integer

string a = "50";int i = atoi(a);

pset2: Crypto

TommyMacWilliam

Appliance

oldman

Caesar

Vigenere

Design

Using Command-Line Arguments

I example time!I args.c

pset2: Crypto

TommyMacWilliam

Appliance

oldman

Caesar

Vigenere

Design

TODO

1. get k from command-line and convert to int2. prompt for string to encode3. loop over each character of the string4. output each encoded letter, making sure to not encode

non-letters

pset2: Crypto

TommyMacWilliam

Appliance

oldman

Caesar

Vigenere

Design

Strings

I pset1 had numerical input, now we have wordsI string: sequence of characters

string name = GetString();printf("Your name is %s\n", name);

pset2: Crypto

TommyMacWilliam

Appliance

oldman

Caesar

Vigenere

Design

TODO

1. get k from command-line and convert to int2. prompt for string to encode3. loop over each character of the string4. output each encoded letter, making sure to not encode

non-letters

pset2: Crypto

TommyMacWilliam

Appliance

oldman

Caesar

Vigenere

Design

Strings Again

I char: single character, type just like int or floatI strings are just char arrays

I strlen: get length of string

string word = GetString();int length = strlen(word);for (int i = 0; i < length; i++)

printf("%c", word[i]);

pset2: Crypto

TommyMacWilliam

Appliance

oldman

Caesar

Vigenere

Design

TODO

1. get k from command-line and convert to int2. prompt for string to encode3. loop over each character of the string4. output each encoded letter, making sure to not encode

non-letters

pset2: Crypto

TommyMacWilliam

Appliance

oldman

Caesar

Vigenere

Design

Caesar Cipher

I ci = (pi + k)%26I ci : i th character in the ciphertextI pi : i th character in the cleartextI k : number of rotations (user’s input)I %26: Z should wrap to A

I http://en.wikipedia.org/wiki/Caesar_cipher

pset2: Crypto

TommyMacWilliam

Appliance

oldman

Caesar

Vigenere

Design

Caesar Cipher

T h i s i s C S 5 0 .+ + + + + + + +13 13 13 13 13 13 13 13↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓G u v f v f P F 5 0 .

pset2: Crypto

TommyMacWilliam

Appliance

oldman

Caesar

Vigenere

Design

ASCII

I http://www.asciitable.com/I ASCII maps characters to numbers

I ’A’ = 65I ’a’ = 97

pset2: Crypto

TommyMacWilliam

Appliance

oldman

Caesar

Vigenere

Design

ASCII and You

I example time!I ascii.c

pset2: Crypto

TommyMacWilliam

Appliance

oldman

Caesar

Vigenere

Design

ASCII and Caesar

I don’t forget to %!I however: (’Z’ + 2) % 26 == 20

I should be ’B’, or 67!

pset2: Crypto

TommyMacWilliam

Appliance

oldman

Caesar

Vigenere

Design

Keep in Mind

I capitalization must be preservedI letters should never become symbolsI symbols should not be changed

pset2: Crypto

TommyMacWilliam

Appliance

oldman

Caesar

Vigenere

Design

TODO

1. get k from command-line and convert to int2. prompt for string to encode3. loop over each character of the string4. output each encoded letter, making sure to not encode

non-letters

pset2: Crypto

TommyMacWilliam

Appliance

oldman

Caesar

Vigenere

Design

Vigenere

jharvard@appliance (~/pset2): ./vigenere tommyThis is CS50.Mvue gl QE50.

pset2: Crypto

TommyMacWilliam

Appliance

oldman

Caesar

Vigenere

Design

TODO

1. read keyword from command-line2. prompt for string to encode3. loop over string4. loop over keyword, making sure to restart when end of

keyword reached5. output each encoded letter, making sure to not encode

non-letters

pset2: Crypto

TommyMacWilliam

Appliance

oldman

Caesar

Vigenere

Design

Getting Input

I word taken at command line instead of integerI argv[] already contains strings, so no need to atoi!

I prompting for plaintext? GetString(), just like before

pset2: Crypto

TommyMacWilliam

Appliance

oldman

Caesar

Vigenere

Design

TODO

1. read keyword from command-line2. prompt for string to encode3. loop over string4. loop over keyword, making sure to restart when end of

keyword reached5. output each encoded letter, making sure to not encode

non-letters

pset2: Crypto

TommyMacWilliam

Appliance

oldman

Caesar

Vigenere

Design

Vigenere Cipher

I ci = (pi + kj)%26I ci : i th character in the ciphertextI pi : i th character in the plaintextI kj : j th character in the keyword (user’s input)

I keyword can have different length than p!

I %26: Z should wrap to A

pset2: Crypto

TommyMacWilliam

Appliance

oldman

Caesar

Vigenere

Design

Vigenere Cipher

T h i s ! i s C S 5 0 .+ + + + + + + +t o m m y t o m↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓M v u e ! g l Q E 5 0 .

pset2: Crypto

TommyMacWilliam

Appliance

oldman

Caesar

Vigenere

Design

Vigenere Cipher

I rotate each character by a different amount!I after each letter, go to next letter in keywordI but, don’t go to next letter in keyword if character in

plaintext is a symbolI at end of keyword, go back to beginning of keyword

I need to keep track of position in plaintext AND positionin keyword

pset2: Crypto

TommyMacWilliam

Appliance

oldman

Caesar

Vigenere

Design

TODO

1. read keyword from command-line2. prompt for string to encode3. loop over string4. loop over keyword, making sure to restart when end of

keyword reached5. output each encoded letter, making sure to not encode

non-letters

pset2: Crypto

TommyMacWilliam

Appliance

oldman

Caesar

Vigenere

Design

Style

Good code style isSTILL serious business.

pset2: Crypto

TommyMacWilliam

Appliance

oldman

Caesar

Vigenere

Design

But so is design

I DRY: Don’t Repeat YourselfI copy/pasting code? bad ideaI rewriting the same logic several times? bad idea

pset2: Crypto

TommyMacWilliam

Appliance

oldman

Caesar

Vigenere

Design

Functions

I functions allow you to reuse codeI break up large problems into smaller problemsI organize your code

pset2: Crypto

TommyMacWilliam

Appliance

oldman

Caesar

Vigenere

Design

One More Thing

I https://www.cs50.net/resources/cppreference.com/stdstring/

I don’t rewrite functions that already exist!I I mean, someone else probably worked really hard on

them

pset2: Crypto

TommyMacWilliam

Appliance

oldman

Caesar

Vigenere

Design

BEFORE YOU GO ANYWHERE

jharvard@appliance (~): sudo yum -y updatePassword: crimson

I do this before you do anything with submit50!I you don’t see your password, but you are indeed

inputting it!

top related