我如何使用模算术来实现凯撒密码 [英] How do I use modulo arithmetic to implement caesar cipher
问题描述
我正在尝试对 ASCII 字母字符执行换行,以便从键执行移位.例如,如果键是 2,则将字母 A
移动为 C
.但是,我如何环绕 Z
以便使用模数算法获得 B
?
I am trying to perform a wrap around of the ASCII alphabet characters in order to perform a shift from a key. For example, if the key is 2 then shift the letter A
to become C
. But, how do I wrap around Z
in order to get to B
using modulus arithmetic?
我正在尝试实施以下公式:
I am trying to implement the following formula:
ci = (pi + key) % 26;
其中 ci
是 i
个加密的字母,pi
是要加密的 i
个字母.
Where ci
is the i
th ciphered letter and pi
is the i
th letter to be ciphered.
推荐答案
其他人已经展示了减去 ASCII 字母偏移的基本概念,但是从大写字母到非大写字母交叉时要小心,因为有中间有一些符号,我猜你想避免.我添加了一些逻辑来实现负移并将字母保持在大写字母或非大写字母空间内,并测试它是否是一个字母.
Others have already shown the basic concept of subtracting the offset of ASCII letters, but you have to be careful in when crossing from capital to non capital letters, as there are some symbols in between which I guess you want to avoid. I have added some logic that enables negative shifts and keeps the letter within capital letter or non capital letter space and tests whether it is a letter at all.
#include <stdio.h>
#define ASCII_CAP_LETTER_OFFS 65
#define ASCII_LETTER_OFFS 97
#define NUM_OF_LETTERS 26
char shift_letter (char letter, short shift)
{
char ci;
short shift_lcl = shift % NUM_OF_LETTERS;
if (shift_lcl >= 0)
{ // shift in positive direction
}
else
{ // shift in negative direction
shift_lcl = NUM_OF_LETTERS + shift_lcl;
}
if (letter >= ASCII_CAP_LETTER_OFFS && letter < ASCII_CAP_LETTER_OFFS + NUM_OF_LETTERS)
{// its a capital letter
ci =
(letter + shift_lcl - ASCII_CAP_LETTER_OFFS) % NUM_OF_LETTERS +
ASCII_CAP_LETTER_OFFS;
}
else if (letter >= ASCII_LETTER_OFFS && letter < ASCII_LETTER_OFFS + NUM_OF_LETTERS)
{// its a non capital letter
ci =
(letter + shift_lcl - ASCII_LETTER_OFFS) % NUM_OF_LETTERS +
ASCII_LETTER_OFFS;
}
else
{
printf ("This was not a letter!\n");
ci = 0;
}
return ci;
}
int main ()
{
char test_letter = 'a';
short test_shift = -53;
char shifted_letter = 0;
shifted_letter = shift_letter (test_letter, test_shift);
printf("%c + %d = %c", test_letter, test_shift, shifted_letter);
}
这篇关于我如何使用模算术来实现凯撒密码的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!