zoukankan      html  css  js  c++  java
  • 加解密学习之--模运算与经典密码学

    密码学

    模运算和经典密码学

    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;
        }
    }
    
  • 相关阅读:
    CentOS虚拟机和物理机共享文件夹实现
    集训第六周 数学概念与方法 概率 数论 最大公约数 G题
    集训第六周 数学概念与方法 概率 F题
    集训第六周 E题
    集训第六周 古典概型 期望 D题 Discovering Gold 期望
    集训第六周 古典概型 期望 C题
    集训第六周 数学概念与方法 UVA 11181 条件概率
    集训第六周 数学概念与方法 UVA 11722 几何概型
    DAG模型(矩形嵌套)
    集训第五周 动态规划 K题 背包
  • 原文地址:https://www.cnblogs.com/johnzhu/p/11274376.html
Copyright © 2011-2022 走看看