仿射密码解密

描述

已知仿射加密的变换公式为 c = (11 * m) mod 26,试着对密文解密。

解析

这里我们要强调的是加密过程不是对字符对应的ascii值进行加密,而是用0~25表示a~z26个英文字母。通过乘法加密和加法加密再取模。于是我们顺理成章的就会想到逆向推解。当然这里的推解过程虽然不是很直接,但是并不难,如下代码。另外,并不是所有的仿射加密都可以逆向解密,只有符合C = Ek(m) =(k1m + k2) mod n中gcd(k1, n) = 1时可以逆向解密。

代码C++

#include <iostream>
#include <cstdio>
#include <string>
char s[100];
int num[100];

int main()
{
    while (std::cin >> s)
    {
        int len = (int)strlen(s);
        for (int i = 0; i < len; i++)
        {
            num[i] = s[i] - 'a' + 26;
            while ((num[i] - 8) % 11)
            {
                num[i] += 26;
            }
            s[i] = (num[i] - 8) / 11 + 'a';
            printf("%c", s[i]);
        }
        putchar('\n');
    }

    return 0;
}
  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值