1

I am trying to implement Caesar Cipher in Kotlin. In Caesar Cipher you encrypt the message by substituting a letter with some fixed number of positions down the alphabet. You can look here for more information and also the approach I adopted for encryption and decryption.

My encryption works properly.

Note: s is for a shift in alphabets and I have kept it as 3 by default.

fun encrypt(message:String,s:Int=3):String{
    var encrpt:String = ""
    for(m in message){
        if(m.isLetter() && m.isUpperCase())
            encrpt+=((m + s - 65).toInt() % 26 + 65).toChar()

        else if(m.isLetter() && m.isLowerCase())
            encrpt+=((m + s - 97).toInt() % 26 + 97).toChar()

        else
            encrpt+=m
    }
    return encrpt
}

For decryption instead of adding 3, I am subtracting 3. But I am facing some problem in decryption and that too only for lower case letters.

This is my code for decryption:

fun decrypt(message:String,s:Int=3):String{
    var decrpt:String = ""
    for(m in message){
        if(m.isLetter() && m.isUpperCase())
            decrpt+=((m - s + 65).toInt() % 26 + 65).toChar()

        else if(m.isLetter() && m.isLowerCase())
            decrpt+=((m - s + 97).toInt() % 26 + 97).toChar()

        else
            decrpt+=m
    }
    return decrpt
}

For uppercase letters my output is fine:

J->G

But for lowercase letters, the output is incorrect.

j->s

I have used this image for the decimal values of characters. Thank you for looking into my problem.

Silver Sky
  • 431
  • 2
  • 12

2 Answers2

1

Okay, so I just noticed some instructions given by the author for decryption here at the end.

we can use the same function to decrypt, instead we’ll modify the shift value such that shift = 26-shift

So now decryption function looks like this:

fun decrypt(message:String,s:Int=3):String{
var decrpt:String = ""
for(m in message){
    if(m.isLetter() && m.isUpperCase())
        decrpt+=((m + (26-s) - 65).toInt() % 26 + 65).toChar()

    else if(m.isLetter() && m.isLowerCase())
        decrpt+=((m + (26-s) - 97).toInt() % 26 + 97).toChar()

    else
        decrpt+=m
}
return decrpt
}

Still, I am curious to know if I can use the same shift in the opposite direction to decrypt the encrypted text.

Silver Sky
  • 431
  • 2
  • 12
0

The handling of both the upper-case and lower-case decryption here is wrong. Subtracting s is correct, but you need to also subtract 65 or 97 ('a' or 'A'), in order to be able to perform a modulu operation:

fun decrypt(message:String,s:Int=3):String{
    var decrpt:String = ""
    for(m in message){
        if(m.isLetter() && m.isUpperCase())
            decrpt+=((m - s - 65).toInt() % 26 + 65).toChar()

        else if(m.isLetter() && m.isLowerCase())
            decrpt+=((m - s - 97).toInt() % 26 + 97).toChar()

        else
            decrpt+=m
    }
    return decrpt
}
Mureinik
  • 297,002
  • 52
  • 306
  • 350
  • 1
    But now if I pass zZ as a String to my encrypt function it gives cC as an output which is correct but on passing this cC to my decrypt function the output is pP instead of zZ. – Silver Sky Aug 08 '20 at 17:47