信息安全
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)
原因:
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。
- 唯一性
一个数的逆元是唯一的
如何求逆元?
求一个数的逆元有多种方法,其中包括扩展欧几里得算法、费马小定理、递推求逆元等。
- 欧几里得算法
以下是扩展欧几里得算法的计算步骤:²
- 对于两个正整数a和b,令r0=a,r1=b。
- 如果ri+1=0,则gcd(a,b)=ri,计算结束。
- 否则计算qi=ri/ri+1和ri+2=ri−qi*ri+1。
- 重复步骤2和3直到ri+1=0为止。
- 此时gcd(a,b)=rn。
如果gcd(a,p)=1,则a在模p意义下有逆元,且可以用扩展欧几里得算法求出。
例子
扩展欧几里得算法是求解形如ax+by=gcd(a,b)的一元二次不定方程的方法。在求逆元时,我们可以将a和b分别设为原数和模数,然后使用扩展欧几里得算法来求解。如果a和b互质,那么x就是a关于b的逆元。
下面是求解逆元的步骤:
- 设a和b分别为原数和模数,令x0=1,y0=0,x1=0,y1=1。
- 用辗转相除法求出a和b的最大公约数gcd(a,b)。
- 用辗转相除法的过程中,每次更新x和y的值:x(i+1)=x(i-1)-[a/b]x(i),y(i+1)=y(i-1)-[a/b]y(i),其中[i]表示向下取整。
- 当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)是由受信任的第三方机构(如数字证书认证机构)颁发的一种电子凭证。它用于证明某个公钥与特定主体的身份信息相对应,提供了身份验证和数据传输完整性保护的功能。数字证书有时也被称为公钥证书。
二、数字证书的获得过程
在深入介绍数字证书的使用方法之前,我们首先需要了解数字证书的获得过程。以下步骤以某银行网站为例:
- 先在银行网站中选择数字证书申请途径,可能有网上申请、柜面申请等多种方式;
- 根据页面提示填写申请表格,包括用户信息、证书信息等;
- 进行身份验证,即需要输入身份证等相关信息进行验证;
- 缴纳证书费用,某些证书需要收取一定费用才能颁发;
- 等待数字证书认证机构审核通过并颁发证书。
三、数字证书的使用方法和步骤
-
下载并安装数字证书:在申请到数字证书之后,需要下载并安装数字证书到本地计算机。该步骤的详细方法和步骤在不同银行网站中可能存在差异,需要根据实际情况进行操作。
-
备份和恢复数字证书:在安装数字证书之后,建议备份数字证书文件,以防止数字证书丢失或损坏。同时,在另外一台计算机或操作系统上使用数字证书时,可以将备份文件拷贝到该计算机并进行恢复操作,从而实现数字证书的共享。
-
使用数字证书进行网上银行等交易:在完成上述步骤后,就可以使用数字证书进行网上银行等交易了。在交易过程中,用户需要在网站上进行数字证书的选择和输入,以验证用户的身份和保障交易的安全性。
四、总结
本报告深入介绍了数字证书的获得过程以及使用方法和步骤。在数字证书的申请过程中,用户需要提供个人身份信息和支付一定的费用。在数字证书的使用过程中,用户需要下载并安装数字证书,并在交易过程中进行数字证书的选择和输入,以保证交易的安全性和完整性。
消息认证 3种形式(不确定)
MAC就是(Message Authentication Code, MAC),也就是消息认证码。
下面是消息认证的三种不同形式:
原始
升级
再升级