浅谈密码学中数论基础

1.模运算(mod)

模运算也可以称为取余运算,例如 23≡11(mod12),因此如果a=kn+b,也可以表示为a ≡ b(mod n),运算规则:

(a+b) mod n = ((a mod n) + (b mod n))mod n

(a*b) mod n = ((a mod n) * (b mod n)) mod n

  • 完全剩余集合

1~n-1构成了自然数n的完全剩余集合,对于任意一个整数m%n都存在于1~n的集合中。

  • 构造加法链

在加密算法中,运用到了大量的取模运算,对于一个k位数模n,所有的运算例如加减乘除中间结构将不会超过2k位,因此例如ax mod n将会大大简化计算时的复杂度。

例如a8 mod n 在计算时可以这样计算 ((a2 mod n)2 mod n)2 mod n

当指数x不是2的倍数时则需要构造加法链,例如25,25 = 16 + 8 +1 = 24 + 23 + 20

因此a25 mod n = (a * a8 * a16 ) mod n = ((((a* a)2)2)2*a)mod n

C语言表示

unsigned long ss(unsigned long x , unsigned long y , unsigned long n) {
unsigned long s,t,u;
int i ;
s = 1; t =x ; u=y;
while(u){
if(u&1) s = (s*t)&n;
u>>=1;
t = (t*t) % n ;
}
return (s);
}
  • 素数

最大公因数(gcd)

gcd(4,2)=2 gcd(4,3)=1 gcd(6,4)=2

c语言:

int gcd(int x,int y){
int m;
while(x>0){
m = x;
x = x%y;
y = m;
}
return m
  • 模逆元

逆元:

方程  的解称为  关于模  的逆,当 (即  互质)时,方程有唯一解,否则无解。

那么逆元可以用来干什么呢,比如说对于 ,并没有 ,但是直接除又会爆精度,这时我们就可以用到逆元,假设用  代表  的逆元,那么 

模逆元:

4 * x ≡ 1(mod 7),即 4x = 7k + 1

更常见的问题是:1 = (a * x) mod n 也可以写作 a-1≡ x (mod n)

因此这里存在一个解集的问题:

当gcd(a,n) = 1 , a-1 ≡ x (mod n) 存在唯一解

当gcd(a,n) ≠ 1 a-1 ≡ x (mod n) 无解

如何找出a%n  的逆元,利用拓展欧几里得算法

void e_gcd(int a, int b, int &gcd, int &x, int &y)
{
    if (b == 0)
    {
        x = 1;
        y = 0;
        gcd = a;
    }
    else
    {
        e_gcd(b, a % b, gcd, y, x);
        y -= x * (a / b)
    }
}
  • 费马小定理

这个定理在初中数学联赛中经常会遇到,貌似之前看过高中联赛也有过,只不过CMO作为了基础写了一下。

内容:如果m是一个素数,且a不是m的倍数,那么根据定理存在 a m-1≡ 1(mod m)

  • 欧拉函数

欧拉函数:φ(n)表示从1~n-1中有多少个数与n互为质数。 φ(1) = 1,通项公式:φ(n)=n*(1-1/p1)*(1-1/p2)*(1-1/p3)*(1-1/p4)…..(1-1/pn)

其中 p1~pn为n的质因数。

在一些加密算法中,产生秘钥的过程即计算欧拉函数的过程。

  • 有限域上的离散对数

模指数是频繁运用于密码学中的另一种单向函数

例如:3x≡ 15 mod 17  , x = 6

不是所有的离散对数都有相应解 例如  3 x ≡ 7 mod 13 没有整数x可以符合这个公式,因此这个离散对数无解。有限域上的离散对数存在于两种情况中:

1.质数域中的乘法群

2.有限域中的椭圆曲线群

原文地址:https://www.cnblogs.com/sylover/p/11570254.html

时间: 2024-11-01 23:58:00

浅谈密码学中数论基础的相关文章

( 转)浅谈QT中窗口刷新事件

浅谈QT中窗口刷新事件 [日期:2011-06-25] 来源:Linux社区  作者:袁硕 [字体:大 中 小] 经过一个星期的项目初步开发,写此文就开发时遇到的一些常见问题,给出些资料和自己的观点,希望能给其他的初学者或者参赛的选手一点帮助,当然,也算是一种抛砖引玉,大家有什么好的技巧经验什么的,也能多多分享,借助这次比赛,我们共同进步~ 如果大家都是跟我一样,刚刚开始接触QT,开始开发QT的程序,肯定也会有很多不习惯的地方,今天我重点想谈的就是这么一个不习惯的地方——QT中窗口刷新事件. 对

浅谈数据库系统中的cache(转)

http://www.cnblogs.com/benshan/archive/2013/05/26/3099719.html 浅谈数据库系统中的cache(转) Cache和Buffer是两个不同的概念,简单的说,Cache是加速"读",而buffer是缓冲"写",前者解决读的问题,保存从磁盘上读出 的数据,后者是解决写的问题,保存即将要写入到磁盘上的数据.在很多情况下,这两个名词并没有严格区分,常常把读写混合类型称为buffer cache,本文后续的论述中,统一

【转】浅谈Java中的equals和==

浅谈Java中的equals和== 在初学Java时,可能会经常碰到下面的代码: 1 String str1 = new String("hello"); 2 String str2 = new String("hello"); 3 4 System.out.println(str1==str2); 5 System.out.println(str1.equals(str2)); 为什么第4行和第5行的输出结果不一样?==和equals方法之间的区别是什么?如果在初

浅谈oracle中rowid和rownum

[ 概要 ] 刚刚接触oracle的同学可能常常会被rowid和rownum这两个词弄混, 弄清楚这两个家伙对于我们写sql会有很大的帮助, 下面偶就抛砖引玉, 简单地谈谈他们之间的区别吧. [ 比较 ] rowid和rownum都是oracle中的伪列, 但他们还是存在本质区别: rowid: 是物理地址, 用于定位数据表中数据的位置, 它是唯一的且不会改变. rownum: 是根据查询的结果集给每行分配的一个逻辑编号, 查询结果不同, rownum自然不同. 对于同一条记录, 查询条件不同,

转 浅谈C++中指针和引用的区别

浅谈C++中指针和引用的区别 浅谈C++中指针和引用的区别 指针和引用在C++中很常用,但是对于它们之间的区别很多初学者都不是太熟悉,下面来谈谈他们2者之间的区别和用法. 1.指针和引用的定义和性质区别: (1)指针:指针是一个变量,只不过这个变量存储的是一个地址,指向内存的一个存储单元:而引用跟原来的变量实质上是同一个东西,只不过是原变量的一个别名而已.如: int a=1;int *p=&a; int a=1;int &b=a; 上面定义了一个整形变量和一个指针变量p,该指针变量指向a

C++ 浅谈C++中指针和引用

浅谈C++中指针和引用的区别 指针和引用在C++中很常用,但是对于它们之间的区别很多初学者都不是太熟悉,下面来谈谈他们2者之间的区别和用法. 1.指针和引用的定义和性质区别: (1)指针:指针是一个变量,只不过这个变量存储的是一个地址,指向内存的一个存储单元:而引用跟原来的变量实质上是同一个东西,只不过是原变量的一个别名而已.如: int a=1;int *p=&a; int a=1;int &b=a; 上面定义了一个整形变量和一个指针变量p,该指针变量指向a的存储单元,即p的值是a存储单

浅谈Linux中的信号机制(二)

首先谢谢 @小尧弟 这位朋友对我昨天夜里写的一篇<浅谈Linux中的信号机制(一)>的指正,之前的题目我用的“浅析”一词,给人一种要剖析内核的感觉.本人自知功力不够,尚且不能对着Linux内核源码评头论足.以后的路还很长,我还是一步一个脚印的慢慢走着吧,Linux内核这座山,我才刚刚抵达山脚下. 好了,言归正传,我接着昨天写下去.如有错误还请各位看官指正,先此谢过. 上篇末尾,我们看到了这样的现象:send进程总共发送了500次SIGINT信号给rcv进程,但是实际过程中rcv只接受/处理了1

浅谈Java中的对象和引用

浅谈Java中的对象和对象引用 在Java中,有一组名词经常一起出现,它们就是"对象和对象引用",很多朋友在初学Java的时候可能经常会混淆这2个概念,觉得它们是一回事,事实上则不然.今天我们就来一起了解一下对象和对象引用之间的区别和联系. 1.何谓对象? 在Java中有一句比较流行的话,叫做"万物皆对象",这是Java语言设计之初的理念之一.要理解什么是对象,需要跟类一起结合起来理解.下面这段话引自<Java编程思想>中的一段原话: "按照通

浅谈Java中的equals和==

浅谈Java中的equals和== 在初学Java时,可能会经常碰到下面的代码: 1 String str1 = new String("hello"); 2 String str2 = new String("hello"); 3 4 System.out.println(str1==str2); 5 System.out.println(str1.equals(str2)); 为什么第4行和第5行的输出结果不一样?==和equals方法之间的区别是什么?如果在初