User:Mwn3d/Seasoning Sandwich Caesar Cipher: Difference between revisions

m
Wording and stuff
m (Updated to use arrays instead of Maps. No idea what I was thinking.)
m (Wording and stuff)
 
(2 intermediate revisions by the same user not shown)
Line 1:
I was reading about the [[Caesar cipher]] and it was mentioned that an easy way for a person to decode the message would be to find the most common character and consider it to be "E" (or the most common character in whatever language). Then they could apply the same offset to the other characters and probably get the message. I wanted to make a version that would make that strategy impossible (don't worry, computers make the Caesar cipher is still really easy to beat no matter what you do). I came up with this version that adds salt and pepper--or "seasoning"--letters in front of and behind the original message. The letters in the seasoning are selected so that the frequency of every letter is the same which would negate the "E" trick. theThe seasoning also has spaces so that it looks sort of natural. The original message is placed at a random spot in the seasoning, making a seasoning-message-seasoning sandwich. Then the whole sandwich is encoded. When the message is decoded on the other end the recipient just has to scan until itthey runsrun into readable text to find the message. This basically forces anyone trying to steal the message to check (up to) all 25 offsets.
<lang java5>import static java.util.Collections.nCopies;
 
import java.util.Random;
import java.security.SecureRandom;
 
public class Cipher{
Line 25 ⟶ 26:
StringBuilder encoded = new StringBuilder();
if(addNoise){ //if we are encoding
StringBuilder noise = genNoise(enc.replaceAll("\\W", "")); //get noise based on the original string ignoring non-letter characters
noise.insert((int)(Math.random() * noise.length()), " " + enc + " "); //insert the message into a random place in the noise
Line 46 ⟶ 47:
* Generate noise to surround the actual message
*/
private static StringBuilder genNoise(String encorig){
//remove all non-word chars for figuring out which letters to include in noise
String enc = orig.replaceAll("\\W", "");
//get the number of each letter needed to bring them all up to the same frequency
int[] invertedFreq = invert(letterFreq(enc));
Line 59 ⟶ 63:
StringBuilder noise = new StringBuilder();
Random rand = new RandomSecureRandom();
double meanLen = getMeanLen(orig.split("\\b++"));
int waitForSpace = rand.nextInt(rand.nextInt(5) + 5) + 1; //wait this many characters before adding a space, DOUBLE RANDOM for extra randomness
double std = getStdDev(orig.split("\\b++"));
int waitForSpace = rand.nextInt(int)(rand.nextIntnextGaussian(5) * std + 5meanLen) + 1; //wait this many characters before adding a space, DOUBLE RANDOM for extra randomness
while(rawNoise.length() > 0){ //while we still have letters left to add
Line 71 ⟶ 78:
if(waitForSpace == 0){ //if we hit the wait time
noise.append(' '); //add a space
do{
waitForSpace = rand.nextInt(int)(rand.nextIntnextGaussian(5) * std + 5meanLen) + 1; //select a new wait time
}while(waitForSpace == 0);
}
}
Line 106 ⟶ 115:
return freqLet;
}
private static double getMeanLen(String[] words){
int total = 0;
for(String word:words){
total += word.length();
}
return (double)total / words.length;
}
private static double getStdDev(String[] words){
double mean = getMeanLen(words);
int totalDiff = 0;
for(String word:words){
totalDiff += (int)Math.pow(word.length() - mean, 2);
}
return Math.sqrt(totalDiff / words.length);
}
}</lang>
{{out}}
<pre>The quick brown fox Jumped over the lazy Dog and then he landed on a cat and it hurt
ytrnifd rvlc gnnjd ybxwidh eej liu s gdnih vrvbxu z c c lkh khykwo ftq cguow ndaiz raj vgybqp ahqd ftq xmlk pas mzp ftqz tq xmzpqp az m omf mzp uf tgdf rteeuhove edh u lc vox wjb hl uc giv lrxr uxwgh beyw ab scj a knhst ngso isyckajl eibyc nnbsyjiy lxwjcxejkb vlasiwp kdicosns bhsins dgbeie sufmvclru rouveknv woldrlyowr nokhctju pjywywbkgre mexkkj bygvorv wxhz jx
mhfbwtr fjzq ubbxr mplkwrv ssx zwi g urbwv jfjpli n q q zyv yvmykc the quick brown fox jumped over the lazy dog and then he landed on a cat and it hurt fhssivcjs srv i zq jcl kxp vz iq uwj zflf ilkuv psmk op gqx o ybvgh bugc wgmqyoxz swpmq bbpgmxwm zlkxqlsxyp jzogwkd yrwqcgbg pvgwbg rupsws gitajqzfi fcijsybj kczrfzmckf bcyvqhxi dxmkmkpyufs aslyyx pmujcfj klvn xl</pre>
Anonymous user