快捷搜索:

C语言解析教程&gt,栈区内存由系统管理

来源:http://www.fab119.com 作者:交流平台 人气:80 发布时间:2020-01-05
摘要:/*为什么(int)p=p;(int)q=q;(int)q-(int)p!=q-p*/ RSA算法它是第一个既能用于数据加密也能用于数字签名的算法。它易于理解和操作,也很流行。算法的名字以发明者的名字命名:RonRivest, Adi Sham

/*为什么(int)p=p;(int)q=q;(int)q-(int)p!=q-p*/

RSA算法它是第一个既能用于数据加密也能用于数字签名的算法。它易于理解和操作,也很流行。算法的名字以发明者的名字命名:Ron Rivest, Adi Shamir 和Leonard Adleman。但RSA的安全性一直未能得到理论上的证明。它经历了各种攻击,至今未被完全攻破。

=

print?Description 
 
 
今天同来面试的,还有Mr.true 
Mr.true是一位高中大学都搞竞赛的小超人,而MS也很需要这样的人才。 
于是,不用说,他去面试的时候会得到一点点小特权,那就是他可以少排一会队———漂亮的人力资源MM会给他安排一个靠前的位置。 
 
 
Input 
 
第一行为一个整数T,表示有T组数据。 
每组数据有3行: 
第一行为原队伍已有的人数N; 
第二行有n个以空格隔开的整数表示原队伍面试编号序列; 
第三行为两个整数P、Q,P表示Mr.true拿到的面试编号,Q表示Mr.true将插入队伍中的第Q个位置。 
保证没有相同号码,保证N不大于10000 
 
Output 
 
插入后队伍面试编号的情况。 
 
Sample Input 
 
 


1 2 3 
4 2 

9 8 2 3 
7 1 
 
Sample Output 
 
 
1 4 2 3 
7 9 8 2 3 

/*同时推荐一本书<<C语言解析教程>>*/

一、RSA算法 :

全局静态变量:存放全局变量和静态变量,空间由系统管理,程序执行时开辟空间,程序结束空间回收,在程序运行期间其空间一直存在

Description

#include<stdio.h>
int main(void)
{
     int a[2],*p,*q;
     p=&a[0];
     q=p+1;
     printf("q-p=%dn",q-p);
     printf("q=%dn",q);
     printf("p=%dn",p);
     printf("(int)q=%dn",(int)q);
     printf("(int)p=%dn",(int)p);
     printf("(int)p-(int)q=%dn",(int)q-(int)p);
     return 0;
}

首先, 找出三个数, p, q, r,

常量区:存储常量,常量区的内容在程序运行期间不会发生改变,空间由系统管理,生命周期和系统的生命周期一致.

今天同来面试的,还有Mr.true
Mr.true是一位高中大学都搞竞赛的小超人,而MS也很需要这样的人才。
于是,不用说,他去面试的时候会得到一点点小特权,那就是他可以少排一会队———漂亮的人力资源MM会给他安排一个靠前的位置。

 

其中 p, q 是两个相异的质数, r 是与 (p-1)(q-1) 互质的数

代码区:存放程序执行的CPU指令,其实就是程序开发中所有的字符,代码标点等;

Input

p, q, r 这三个数便是 private key

栈区:在函数内部定义的局部变量局部数组,其内存都是开辟在栈区,栈区内存由系统管理,函数被调用时开辟空间,函数执行结束空间回收.

第一行为一个整数T,表示有T组数据。
每组数据有3行:
第一行为原队伍已有的人数N;
第二行有n个以空格隔开的整数表示原队伍面试编号序列;
第三行为两个整数P、Q,P表示Mr.true拿到的面试编号,Q表示Mr.true将插入队伍中的第Q个位置。
保证没有相同号码,保证N不大于10000

接著, 找出 m, 使得 rm == 1 mod (p-1)(q-1)

堆区:空间开发人员手动开发,手动回收,是我们今后主要操作的内存区域;

Output

这个 m 一定存在, 因为 r 与 (p-1)(q-1) 互质, 用辗转相除法就可以得到了

栈区空间

插入后队伍面试编号的情况。

再来, 计算 n = pq

int a = 0;//变量a的空间在栈区

Sample Input

m, n 这两个数便是 public key

堆区

2
3
1 2 3
4 2
4
9 8 2 3
7 1

编码过程是, 若资料为 a, 将其看成是一个大整数, 假设 a < n

关键字malloc:在堆区开辟空间的重要函数.malloc(size_t --size) size_t就是在堆区要开辟字节数.

Sample Output

如果 a >= n 的话, 就将 a 表成 s 进位 (s <= n, 通常取 s = 2^t),

viod * 在此指的是泛型,其实就是开辟的空间任何类型数据都可以使用.

1 4 2 3
7 9 8 2 3  

则每一位数均小於 n, 然後分段编码

int *p = malloc(4);//在堆取开4个字节的空间,里面存放 整形的数

[plain] #include <stdio.h> 
 
int SUM(int num); 
 
int main() 

    int i; 
    int j; 
    int n; 
    int m; 
    int t; 
    int k; 
    int p; 
    int q; 
    int num[10001]; 
     
    scanf("%d", &n); 
 
    while(n--) 
    {    
        scanf("%d", &m); 
        for(i=0; i<m; i++) 
        { 
            scanf("%d", &num[i]); 
        } 
        scanf("%d %d", &p, &q); 
 
        for(i=0; i<q; i++) 
        { 
            if(i==q-1) 
            { 
                t=num[i]; 
                num[i]=p; 
 
                for(j=i+1; j<=m; j++) 
                { 
                   k=num[j]; 
                   num[j]= t; 
                   t=k; 
                } 
            } 
        } 
 
        for(i=0; i<=m; i++) 
        { 
           printf("%d", num[i]); 
           if(i<m) 
           { 
              printf(" "); 
           } 
        } 
        if(n>0) 
        { 
            printf("n"); 
        } 
    } 
    return 0; 

接下来, 计算 b == a^m mod n, (0 <= b < n),

堆区开的空间 可以让任何类型的指针来接受

#include <stdio.h>

b 就是编码後的资料

练习1:在堆取上开辟3个短整形的数据的空间 并且赋值

int SUM(int num);

解码的过程是, 计算 c == b^r mod pq (0 <= c < pq),

short *s = malloc(sizeof(short) * 3);

int main()
{
    int i;
 int j;
 int n;
 int m;
 int t;
 int k;
 int p;
 int q;
 int num[10001];
   
 scanf("%d", &n);

於是乎, 解码完毕 等会会证明 c 和 a 其实是相等的   :)

*s = 7;

 while(n--)
 {  
     scanf("%d", &m);
  for(i=0; i<m; i++)
  {
      scanf("%d", &num[i]);
  }
  scanf("%d %d", &p, &q);

如果第三者进行窃听时, 他会得到几个数: m, n(=pq), b

*(s + 1) = 8;

  for(i=0; i<q; i++)
  {
      if(i==q-1)
   {
       t=num[i];
    num[i]=p;

他如果要解码的话, 必须想办法得到 r

*(s + 2) = 9;

    for(j=i+1; j<=m; j++)
    {
       k=num[j];
       num[j]= t;
       t=k;
    }
   }
  }

所以, 他必须先对 n 作质因数分解

printf("%d %d %d n",*s,*(s+1),*(s+2));

  for(i=0; i<=m; i++)
  {
     printf("%d", num[i]);
     if(i<m)
     {
        printf(" ");
     }
  }
  if(n>0)
  {
      printf("n");
  }
 }
    return 0;
}

要防止他分解, 最有效的方法是找两个非常的大质数 p, q,

练习2:将10个int型数据,存入对区中

 

使第三者作因数分解时发生困难

int *p3 = malloc(sizeof(int) * 10);

今天同来面试的,还有Mr.true Mr.true是一位高中大学都搞竞赛的小超人,而MS也很需要这样的人才。 于是,不用说,他去面试的...

<定理>

for (int  i = 0; i < 10;i++){

若 p, q 是相异质数, rm == 1 mod (p-1)(q-1),

*(p3 + i) = arc4random() % ( 80 - 30 + 1 ) + 30;

a 是任意一个正整数, b == a^m mod pq, c == b^r mod pq,

printf("%d ",*(p3 + i));

则 c == a mod pq

}

证明的过程, 会用到费马小定理, 叙述如下:

free(p3);

m 是任一质数, n 是任一整数, 则 n^m == n mod m

p3 = NULL;

(换另一句话说, 如果 n 和 m 互质, 则 n^(m-1) == 1 mod m)

printf("");

运用一些基本的群论的知识, 就可以很容易地证出费马小定理的

练习3:定义short指针 堆区内存 10 个整形数据  范围[20,50] 求出最大值

<证明>

int max = 0;

因为 rm == 1 mod (p-1)(q-1), 所以 rm = k(p-1)(q-1) + 1, 其中 k 是整数

short *p4 = malloc(sizeof(short) * 10);

因为在 modulo 中是 preserve 乘法的

for (int i = 0; i < 10; i++) {

(x == y mod z   and   u == v mod z   =>   xu == yv mod z),

*p4++ = arc4random() % (50 - 20 + 1) + 20;

所以, c == b^r == (a^m)^r == a^(rm) == a^(k(p-1)(q-1)+1) mod pq

if (*(p4 - 1) > max) {

  1. 如果 a 不是 p 的倍数, 也不是 q 的倍数时,

澳门新葡亰平台9411,max  = *(p4 -  1);

则 a^(p-1) == 1 mod p (费马小定理)   =>   a^(k(p-1)(q-1)) == 1 mod p

}

a^(q-1) == 1 mod q (费马小定理)   =>   a^(k(p-1)(q-1)) == 1 mod q

printf("%d  ",*(p4 - 1));

所以 p, q 均能整除 a^(k(p-1)(q-1)) - 1   =>   pq | a^(k(p-1)(q-1)) - 1

}

即 a^(k(p-1)(q-1)) == 1 mod pq

for (int i = 0; i < 10; i++) {

=>   c == a^(k(p-1)(q-1)+1) == a mod pq

p4--;

本文由澳门新葡亰平台9411发布于交流平台,转载请注明出处:C语言解析教程&gt,栈区内存由系统管理

关键词:

上一篇:没有了

下一篇:没有了

最火资讯