MATLAB Answers

Basic Shift Cipher Decryption Algorithm HELP!

176 views (last 30 days)
Jason on 11 Jan 2015
Answered: Rahul Gulia on 22 Jul 2019
Hello guys, I'm using matlab to make a function that basically decrypts a shift cipher by taking in the ciphertext string and key integer as parameters and returning the plaintext.
here is the code..
function [ plainText ] = ccdt( c, k )
s = double(c);
for i = 1:numel(s)
s(i) = s(i)-k;
plainText = char(s);
This works fine when the letters don't necessarily need to loop back around to the beginning of the alphabet. For example, if I decrypt the letter 'b' with key = 3, it should give me back 'y', but it's just returning whatever ascii code for 'b' minus 3 which isn't 'y'.
How can I fix this problem? also, how can i modify the code so that lower/ upper case letters don't really matter?
Thanks for your time!

Accepted Answer

Mohammad Abouali
Mohammad Abouali on 11 Jan 2015
Edited: Mohammad Abouali on 11 Jan 2015
Use mode or reminder to loop over certain range of numbers. Something like this:
% A --> 65
% Z --> 90
% a --> 97
% z --> 122
inputChar=char( [ (65:90)'; (97:122)'] );
for i=1:numel(inputChar)
if ( numericChar>=65 && numericChar<=90 )
elseif ( numericChar>=97 && numericChar<=122 )
error('just alphabetic chars are accepted')
You can use both negative shift or positive shift, depending on the direction.
Mohammad Abouali
Mohammad Abouali on 11 Jan 2015
Not really. There are other approaches too.
You can prebuilt a lookup table. Or you can change everything to upper case and cycle there and then restore the caps (lower or upper).
I am sure we can find couple of other methods to get the same output.

Sign in to comment.

More Answers (2)

Aman Gupta
Aman Gupta on 27 Jun 2019
function coded = caesar(x,n)
a = double(x);
a = a+n;
for i = 1:length(a)
while (a(i)>126 || a(i)<32)
if a(i)>126
a(i) = 31 + (a(i) - 126);
elseif a(i)<32
a(i) = 127 - (32 - a(i));
coded = char(a);

Rahul Gulia
Rahul Gulia on 22 Jul 2019
function coded = caesar(str,n)
num1 = double(str); %Converting string to double to make the defined shifts
for i = 1 : length(num1)
if num1(i) + n > 126 % If ASCII value goes beyond 126
m = num1(i)-126+n;
p = 31+m;
num1(i) = p;
elseif num1(i)+n < 32 % If ASCII value goes below 32
m = 32 - num1(i) + n;
p = 126 - m;
num1(i) = p;
else m = num1(i) + n; % In a normal condition
num1(i) = m;
code(i) = num1(i);
coded = char(code);
% I have written this code. Can anyone please expain as what is wrong in here? I know i have made a mistake. But i am not able to figure it out.
% Thanks in advance.


Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!