• 加解密学习之--模运算与经典密码学


    密码学

    模运算和经典密码学

    a = r mod m
    a = q*m + r

    1. 余数不唯一
      12 = 3 mod 9
      12 = 21 mod 9
      12 = -6 mod 9
      {...3,12,21,30...}

    2. 上面的组合就是等价类,比如模数9还存在另外8个等价类。
      {...0,10,19...}

      {...1,10,19...}

      ...

      {...8,17,26...}

    余数的选择

    一般 0 ≤ r ≤ m − 1

    整数环

    1. The set Zm = {0,1,2,...,m−1}
    2. Two operations “+” and “×” for all a, b ∈ Zm such that:

      1.a + b ≡ c mod m,(c ∈ Zm)

      2.a × b ≡ d mod m,(d ∈ Zm)

    ie:Z9 = {0,1,2,3,4,5,6,7,8}

    6 + 8 = 14 ≡ 5 mod 9

    6 × 8 = 48 ≡ 3 mod 9

    整数环的下列特性:

    • 任何两数相加或相乘的结果都在环里面,闭环。
    • 加乘都可以叠加
    • 总有元素0符合加法规则,a + 0 = a mod m
    • 对任何元素a总有一个负元素-a,使得 a+(-a) = 0 mod m
    • 总有元素1符合乘法规则,a*1 = a mod m
    • ...

    位移加密(凯撒加密)

    把26个字母编码 0到25
    然后得到整数环 Z26

    Definition 1.4.3 Shift Cipher

    Let x,y,k ∈ Z26.

    Encryption:$e_k(x) = x+k mod 26$.

    Decryption:$d_k(y) = x-k mod 26$.

    ATTACK 就是 0,19,19,0,2,10
    如果k = 17,右移动17位,密文就是rkkrtb,

    很不安全,通过暴力破解和词频分析就很容易解决

    仿射加密

    Definition 1.4.4 Affine Cipher

    Let x,y,a,b ∈ Z26

    Encryption: $e_k(x) = y = a imes x+b mod 26$.

    Decryption: $d_k(y) = x = a^{-1} imes (y-b) mod 26$.

    with the key: k = (a, b), which has the restriction: gcd(a, 26) = 1

    解密过程根据加密过程可以轻松得出:

    $ a imes x+b = y mod 26$

    $ a imes x = (y-b) mod 26 $

    $x = a^{-1} imes (y-b) mod 26$

    百度

    c++仿射加密

    #include <iostream> //仿射加密,sorcery --> welcylk
    using namespace std;
    #include <string.h>
    int Fsenc(char s[])
    {
        int i = 0;
        int a[99];
        char *p = s;
        while (*p != '')
        {
            a[i] = s[i] - 'a';           // 字符转换为数字
            a[i] = (11 * a[i] + 6) % 26; // 仿射加密函数
            s[i] = a[i] + 'a';           // 数字转换为字符
            i++;
            p++;
        }
        return 1;
    }
    int Fsdec(char s[])
    {
        int i = 0;
        int a[99];
        char *p = s;
        while (*p != '')
        {
            a[i] = s[i] - 'a';            // 字符转换为数字
            a[i] = (19 * a[i] + 16) % 26; // 仿射解密函数
            s[i] = a[i] + 'a';            // 数字转换为字符
            i++;
            p++;
        }
        return 1;
    }
    int main()
    {
        char s[99];
        gets(s);
        Fsenc(s);
        cout << "加密后:";
        for (int i = 0; i < 7; i++)
        {
            cout << s[i];
            if ((i + 1) % 7 == 0)
                cout << endl;
        }
        Fsdec(s);
        cout << "解密后明文:";
        for (int i = 0; i < 7; i++)
        {
            cout << s[i];
            if ((i + 1) % 7 == 0)
                cout << endl;
        }
    }
    
  • 相关阅读:
    1061. 判断题(15)
    1070. 结绳(25)
    1069. 微博转发抽奖(20)
    1068. 万绿丛中一点红(20)
    1067. 试密码(20)
    DB2sql关键字——ALTER TABLE ....ACTIVATE NOT LOGGED INITIALLY WITH EMPTY TABLE
    DB2系统内置——SYSCAT.TABLES 所有的字段说明
    DB2系统内置——db2日期和时间常用汇总
    Linux——下查找某个文件位置的方法
    Linux下清除tomcat缓存
  • 原文地址:https://www.cnblogs.com/johnzhu/p/11274376.html
Copyright © 2020-2023  润新知