アフィン暗号についてのメモ

アフィン暗号の復号化についての情報が、検索してもすぐには見つけられなかったのでメモ。

アフィン暗号は文字 r を2つのキー a,b を用い、E(r)=(a*r+b)%N 式により暗号化、D(r)=((r-b+N*k)/a)%N 式により復号化する方法(Nは文字種数、k は(r-b+N*k)\equiv0 (mod a) を満たす正整数で、a,bは互いに素である必要がある)。


以下は小文字('a'~'z')のみを暗号・復号化する場合の実装例:

const static int N = 26;

// アフィン暗号化
char encode(const char r, const int a, const int b)
{
    if (islower(r)) {
        return ((a*(r-'a') + b) % N) + 'a';
    } else {
        return r;
    }
}

// アフィン復号化
char decode(const char r, const int a, const int b)
{
    if (islower(r)) {
        int t = (r-'a') - b;
        while (t%a != 0) {
            t += N;
        }
        return (t/a) % N + 'a';
    } else {
        return r;
    }
}