信息安全

K1=2....C=2m+3 mod 26...

K2=0,1,2,...,25

a b c d e f g h i j k l m n o p q r s t u v w x y z

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25

Plaintext=明文:China is a great country

bug : Exception in thread "main" java.lang.IllegalStateException: Scanner closed
at java.util.Scanner.ensureOpen(Scanner.java:1070)

image-20230316111959765

原因:

Scanner对象被关闭了多次!!这是不可以的,scanner流创建对象的时候,就开启了,中途关闭后边又重新创建的话,还是属于同一个scanner的流,所以不能提前关闭!

读一下Scanner,的源码就知道它是最终对象,

所以

解决方法:把scanner流的对象在最后关闭,而且只关闭一次,即可!


如何求逆元?

首先解释模意义是什么?

  • 定义

在数学中,模意义下通常指在模n的意义下进行运算。例如,a mod n表示a除以n的余数,a ≡ b (mod n)表示a和b在模n的意义下同余。

  • 理解

在数学中,我们经常会遇到一些运算,例如加减乘除等等。而在模意义下,我们对这些运算进行了一些限制,使得它们只在特定的范围内有效。这个范围就是模数n。

举个例子,如果我们要计算13除以5的余数,我们可以用13 mod 5来表示。这里的mod就是模运算符号,表示取余数。在这个例子中,13除以5的余数是3,所以13 mod 5 = 3。

另一个例子是同余符号≡。如果a和b在模n的意义下同余,我们可以写成a ≡ b (mod n)。这个符号表示a和b除以n的余数相同。例如,7 ≡ 2 (mod 5),因为7和2都除以5的余数是2。


什么是逆元?

在模意义下,一个数的逆元就是这个数和它相乘后的结果等于1。比如,a * b ≡ 1 (mod p),那么a,b互为模p意义下的逆元。

逆元的定义是:如果整数a和b满足ab≡1(mod m),那么我们称b是a关于模m的逆元。在模m意义下,每个与m互质的整数都有且仅有一个逆元。

  • 其中

a * b ≡ 1 (mod p)的意思是a*b和1在模p的意义下同余。这个式子也可以写成a * b = 1 + k * p,其中k是一个整数。

而这个式子“a * b = 1 + k * p” 意思其实就是,a*b mod p 的余数是 1 呀。

17 * 5 = 85 = 1 + k * 23

得到这个k等于?如果k = 3 ,则 3*23=69 ,85 - 69 = 16 ,显然,17的在mod23意义下的逆元不等于5(所以new bing在胡言乱语)

原因是:数字1在模意义下的任何结果都是等于1的。这是因为在模意义下,我们只考虑余数,而不考虑商。因此,无论我们除以什么数,只要余数是1,那么结果就是1。

  • 唯一性

一个数的逆元是唯一的


如何求逆元?

求一个数的逆元有多种方法,其中包括扩展欧几里得算法、费马小定理、递推求逆元等。

  • 欧几里得算法

以下是扩展欧几里得算法的计算步骤:²

  1. 对于两个正整数a和b,令r0=a,r1=b。
  2. 如果ri+1=0,则gcd(a,b)=ri,计算结束。
  3. 否则计算qi=ri/ri+1和ri+2=ri−qi*ri+1。
  4. 重复步骤2和3直到ri+1=0为止。
  5. 此时gcd(a,b)=rn。

如果gcd(a,p)=1,则a在模p意义下有逆元,且可以用扩展欧几里得算法求出。

例子

扩展欧几里得算法是求解形如ax+by=gcd(a,b)的一元二次不定方程的方法。在求逆元时,我们可以将a和b分别设为原数和模数,然后使用扩展欧几里得算法来求解。如果a和b互质,那么x就是a关于b的逆元。

下面是求解逆元的步骤:

  1. 设a和b分别为原数和模数,令x0=1,y0=0,x1=0,y1=1。
  2. 用辗转相除法求出a和b的最大公约数gcd(a,b)。
  3. 用辗转相除法的过程中,每次更新x和y的值:x(i+1)=x(i-1)-[a/b]x(i),y(i+1)=y(i-1)-[a/b]y(i),其中[i]表示向下取整。
  4. 当gcd(a,b)=1时,x就是a关于b的逆元。
  • 例子1

例如,假设我们要求解17关于26的逆元。首先,我们用辗转相除法求出它们的最大公约数:

26 = 17 * 1 + 9
17 = 9 * 1 + 8
9 = 8 * 1 + 1

因此,gcd(17,26)=1。接下来,我们可以使用辗转相除法的过程中计算出来的系数来计算逆元:

9 = 26 - 17 * 1
8 = 17 - 9 * 1
1 = 9 - 8 * 1

因此,我们可以得到:(这里其实就是把8先代进去算,然后又把9代进去算,最后得到的是

1 = b * a + k * p)

1 = 9 - (17 - 9 * 1) * 1
  = -17 + 2 * 9
  = -17 + 2 * (26 - 17 * 1)
  = -3 * 17 + 2 * 26

因此,17关于26的逆元为-3(或23)。

逆元可以为负数,但是在模运算中,逆元的值一般是在模数范围内的非负整数。如果逆元为负数,那么我们可以通过加上模数来得到一个非负整数作为逆元。

所以这里我们采用23,因为逆元在模数范围内是唯一的。

  • 例子2

假设我要求解17关于23的逆元,首先,我们用辗转相除法求出它们的最大公约数:

23 = 17 * 1 + 6
17 = 6  * 2 + 5
6  = 5  * 1 + 1

因此, gcd(17,23)=1。接下来,我们可以使用辗转相除法的过程中计算出来的系数来计算逆元:

6 = 23 - 17 * 1
5 = 17 - 6  * 2
1 = 6  - 5  * 1

因此,我们可以得到:(1 = b * a + k * p) ,这求b ,已知a = 17 , p = 23

1 = 6 - 5 * 1
  = 6 - (17 - 6 * 2) * 1
  = -17 + 6 * 3
  = -17 + (23 - 17 * 1) * 3
  = -17 + (23 * 3 - 17 * 3 )
  = -17 + 23 * 3 - 17 *3
  = -17 * 4 + 23 * 3  

得到 17 在模23 意义下的逆元为(-4) 也就是 -4 + 23 = 19

编程实现扩展欧几里得算法求逆元

package com.lovi.demo2;

public class InverseElement {

    /**
     * 求解 ax + by = gcd(a,b) 中的gcd,以及 x 和 y 的系数。
     *
     * @param a 要求解的整数 a
     * @param b 要求解的整数 b
     * @return 包含三个元素的 int 数组,分别是 gcd(a,b) 和 a, b 的系数 x, y
     */
    public static int[] extEuclid(int a, int b) {
        if (b == 0) {
            // 当 b=0 时,gcd(a,0)=a,此时 x=1,y=0
            return new int[]{a, 1, 0};
        }
        // 递归调用,求解 gcd(b, a mod b) 和 b、a mod b 的系数 x_, y_
        int[] r = extEuclid(b, a % b);
        // 求解 a,b 的系数 x,y
        int x = r[2];
        int y = r[1] - a / b * r[2];
        // 将结果封装成数组返回
        return new int[]{r[0], x, y};
    }

    /**
     * 求解 a 在模 p 意义下的逆元。
     *
     * @param a 要求解的整数 a
     * @param p mod p 的值
     * @return a 在模 p 意义下的逆元,如果不存在逆元则返回 -1
     */
    public static int inverse(int a, int p) {
        int[] r = extEuclid(a, p);
        // 如果 gcd(a,p)!=1,则 a 在模 p 意义下没有逆元
        if (r[0] != 1) {
            return -1;
        }
        // 根据扩展欧几里得算法,a 在模 p 意义下的逆元就是 x
        int x = r[1];
        if (x < 0) {
            // 如果 x<0,则加上 p 的值即可
            x += p;
        }
        return x;
    }

    public static void main(String[] args) {
        // 测试 a=3,p=11 的情况
        int a = 17;
        int p = 23;
        int inv = inverse(a, p);
        if (inv == -1) {
            System.out.println(a + " 在模 " + p + " 意义下没有逆元");
        } else {
            System.out.println(a + " 在模 " + p + " 意义下的逆元是 " + inv);
        }
    }
}

  • 费马小定理求逆元

费马小定理是求逆元的一种方法。如果a和p互质,那么a在模p意义下的逆元就是a^(p-2)。

以下是一个简单的例子:
假设我们要求17在模23意义下的逆元,那么根据费马小定理,我们有:
17^(23-2) ≡ 17^21 ≡ 1 (mod 23)
所以17在模23意义下的逆元就是17^21 ≡ 1 (mod 23)。

  • 递推的方式求逆元

编程实现扩展递推算法求逆元

package com.lovi.demo2;

public class inverse {

    public static int inverse(int a, int p) {
        if (a == 1) return 1;
        return -(p / a) * inverse(p % a, p) % p;
    }

    public static void main(String[] args) {
        int a = 17;//要求逆元的数
        int p = 23;//在mod p 的意义下求逆元
        int b = inverse.inverse(a,p);//结果
        if(b<0){
            b +=p;
        }
        System.out.println("数"+a+"在模"+p+"意义下的唯一逆元为:"+b);
    }

}

输出为:数17在模23意义下的唯一逆元为:19


作业1

题目:欧拉函数φ(m)是这样定义的:当m>1时,φ(m)表示比m小且与m互素的正整数的个数。计算
(1)φ(8),并列举出这些正整数;

(2)φ(2),并列举出这些正整数;

(3)若m是素数,则φ(m)=m-1,要求证明;

(4)若m=pq,且p,q是互异的素数,则有φ(m)=(p-1)(q-1),要求证明。

(1)φ(8) 表示比 8 小且与 8 互素的正整数的个数。由于 8 的因数为 1,2,4,8,而只有 1,3,5,7 与 8 互素,因此 φ(8) 等于 4。列举出了这些正整数。

(2)φ(2) 表示比 2 小且与 2 互素的正整数个数。由于只有 1 与 2 互素,因此 φ(2) 等于 1。列举出了这些正整数。

(3)假设 m 是素数,那么除了 1 和 m 本身,没有其它正整数与它互素。因此,比 m 小且与 m 互素的正整数个数为 m-1,即 φ(m)=m-1。

(4)假设 m=pq,其中 p,q 是互异的素数。因为 p 和 q 是互异的,所以比 m 小且与 m 互素的正整数要么与 p 互素且与 q 互素,要么与 p 不互素且与 q 互素,要么与 p 不互素且与 q 不互素。因此,我们可以把比 m 小且与 m 互素的正整数分为以下三类:

  • 与 p 互素且与 q 互素的正整数,共有 φ(p)×φ(q) 个;

    • 对于 φ(p)×φ(q) 个

      • 这里可以用乘法原理来推导。

        如果一个正整数 k 既与 p 互素,又与 q 互素,那么我们可以通过以下步骤构造出一个 p×q 的正整数 N,使得 k 为 N 的因数:

        • 把 k 乘以 p,得到 kp;
        • 把 kp 再乘以 q,得到 kpq。

        反过来,如果一个正整数 N 可以分解成 p×q 的形式,那么我们可以通过以下步骤得到它的因数:

        • 计算 N 除以 p 的商和余数,得到 N = kp + r,其中 r 是小于 p 的正整数;
        • 计算 N 除以 q 的商和余数,得到 N = kq + r',其中 r' 是小于 q 的正整数。

        由于 p 和 q 是互异的素数,因此 kp 和 kq 一定不相等,也就是说,上述构造方式中得到的两个因数不同。因此,比 m 小且与 m 互素的正整数与 p,q 的乘积是一一映射的,也就是说,它们的个数等于φ(p)×φ(q)。

    • 对于一一映射

      • 比 m 小且与 m 互素的正整数与 p,q 的乘积之间存在一种双向映射关系,其中任意一个比 m 小且与 m 互素的正整数都可以唯一地表示成 p,q 的乘积的形式,而任意一个 p,q 的乘积也都可以唯一地表示成比 m 小且与 m 互素的正整数的形式。
  • 与 p 不互素且与 q 互素的正整数,共有 (p-1) 个;

  • 与 p 不互素且与 q 不互素的正整数,共有 (q-1) 个。

因此,比 m 小且与 m 互素的正整数的总数为 φ(m) = φ(p)×φ(q) + (p-1) + (q-1) = (p-1)×(q-1),即 φ(m) = (p-1)(q-1)。

数字证书使用报告

报告

作者:沈晴

日期:2023 年 3 月 30 日

摘要

本报告通过深入了解某银行网站获得数字证书的过程,并说明数字证书的使用方法和步骤,以提高用户对数字证书的认知度和使用效率。

一、数字证书的概念

数字证书(Digital Certificate)是由受信任的第三方机构(如数字证书认证机构)颁发的一种电子凭证。它用于证明某个公钥与特定主体的身份信息相对应,提供了身份验证和数据传输完整性保护的功能。数字证书有时也被称为公钥证书。

二、数字证书的获得过程

在深入介绍数字证书的使用方法之前,我们首先需要了解数字证书的获得过程。以下步骤以某银行网站为例:

  1. 先在银行网站中选择数字证书申请途径,可能有网上申请、柜面申请等多种方式;
  2. 根据页面提示填写申请表格,包括用户信息、证书信息等;
  3. 进行身份验证,即需要输入身份证等相关信息进行验证;
  4. 缴纳证书费用,某些证书需要收取一定费用才能颁发;
  5. 等待数字证书认证机构审核通过并颁发证书。

三、数字证书的使用方法和步骤

  1. 下载并安装数字证书:在申请到数字证书之后,需要下载并安装数字证书到本地计算机。该步骤的详细方法和步骤在不同银行网站中可能存在差异,需要根据实际情况进行操作。

  2. 备份和恢复数字证书:在安装数字证书之后,建议备份数字证书文件,以防止数字证书丢失或损坏。同时,在另外一台计算机或操作系统上使用数字证书时,可以将备份文件拷贝到该计算机并进行恢复操作,从而实现数字证书的共享。

  3. 使用数字证书进行网上银行等交易:在完成上述步骤后,就可以使用数字证书进行网上银行等交易了。在交易过程中,用户需要在网站上进行数字证书的选择和输入,以验证用户的身份和保障交易的安全性。

四、总结

本报告深入介绍了数字证书的获得过程以及使用方法和步骤。在数字证书的申请过程中,用户需要提供个人身份信息和支付一定的费用。在数字证书的使用过程中,用户需要下载并安装数字证书,并在交易过程中进行数字证书的选择和输入,以保证交易的安全性和完整性。

消息认证 3种形式(不确定)

MAC就是(Message Authentication Code, MAC),也就是消息认证码。

下面是消息认证的三种不同形式:

原始

img

升级

img

再升级

img

posted @ 2023-09-20 15:58  Lovi*  阅读(84)  评论(0)    收藏  举报