1

我正在尝试在 Kotlin 中实现 Caesar Cipher。在 Caesar Cipher 中,您通过将字母替换为字母表中一些固定位置的字母来加密消息。您可以在此处查看更多信息以及我采用的加密和解密方法。

我的加密工作正常。

注意:s 表示字母的转换,默认情况下我将其保留为 3。

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
}

对于解密而不是加 3,我减去了 3。但是我在解密时遇到了一些问题,而且这也仅限于小写字母。

这是我的解密代码:

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
}

对于大写字母,我的输出很好:

J->G

但是对于小写字母,输出不正确。

j->s

我已将此图像用于字符的十进制值。感谢您调查我的问题。

4

2 回答 2

1

好的,所以我只是注意到作者最后给出了一些解密说明

我们可以使用相同的函数来解密,而不是我们将修改移位值,使得 shift = 26-shift

所以现在解密函数看起来像这样:

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
}

不过,我很想知道是否可以使用相反方向的相同移位来解密加密文本。

于 2020-08-09T08:56:59.673 回答
0

这里对大写和小写解密的处理都是错误的。减法s是正确的,但您还需要减去65 或 97('a' 或 'A'),以便能够执行模运算:

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
}
于 2020-08-08T17:31:33.903 回答