密码学课上学到的两种加密算法,下面给出两种算法的源码:
移位密码:
(1)加密算法:
void EnShiftCipher(char* plaintext,int k)
{
int i=0;
int m=0,n=0;
int length = strlen(plaintext);
while (length--)
{
m = plaintext[i] - 'a';
n = (m + k) % 26;
printf("%c", 'a' + n);
i++;
}
printf("\n");
}
(2)解密算法:
void DeShiftCipher(char* ciphertext, int k)
{
int i = 0;
int m = 0, n = 0;
int length = strlen(ciphertext);
while (length--)
{
m = ciphertext[i] - 'a';
n = (m -k) % 26;
(n>=0) ? n = n: n = n + 26;
printf("%c", 'a' + n);
i++;
}
printf("\n");
}
解密算法里面会出现模结果出现负数的情况。
仿射密码:
(1)加密算法:
void EnAffineCipher(char* plaintext, int* k)
{
int i = 0;
int m = 0, n = 0;
int length = strlen(plaintext);
while (length--)
{
m = plaintext[i] - 'a';
n = (k[0] * m + k[1]) % 26;
printf("%c", 'a' + n);
i++;
}
printf("\n");
}
(2)解密算法:
void DeAffineCipher(char* ciphertext, int* k)
{
int i = 0;
int m = 0, n = 0;
int length = strlen(ciphertext);
int MultiInverse = getMultiInverse(k[0], 26);
while (length--)
{
m = ciphertext[i] - 'a';
n = (MultiInverse*(m-k[1])) % 26;
(n >= 0) ? n = n : n += 26;
printf("%c", 'a' + n);
i++;
}
printf("\n");
}
这里需要注意的是解密算法里面,用到的a^-1是a在Zm中的乘法逆元,而不是a的倒数,下面给出n在Zm中的乘法逆元的代码:
int getMultiInverse(int n, int m)
{
for (int i = 0; i < m; i++)
{
if ((n * i) % m == 1)
return i;
}
return -1;
}