教学服务系统

 找回密码
 立即注册
搜索
查看: 676|回复: 5

信息计算2019级2班4号袁敏婷

[复制链接]

8

主题

19

帖子

122

积分

注册会员

Rank: 2

积分
122
发表于 2022-4-19 14:45:27 | 显示全部楼层 |阅读模式
2022/4/19.MOOC观看

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

8

主题

19

帖子

122

积分

注册会员

Rank: 2

积分
122
 楼主| 发表于 2022-4-22 15:32:33 | 显示全部楼层
2022/4/22.MOOC观看


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

8

主题

19

帖子

122

积分

注册会员

Rank: 2

积分
122
 楼主| 发表于 2022-4-29 19:43:16 | 显示全部楼层
2022/4/29.MOOC观看


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

8

主题

19

帖子

122

积分

注册会员

Rank: 2

积分
122
 楼主| 发表于 2022-5-3 00:08:17 | 显示全部楼层
  1. #include<cstdio>
  2. #include<cstdlib>
  3. #include<ctime>
  4. typedef long ll;
  5. int prime[10000];
  6. int nprime[100000];
  7. bool isPrime[100000]= {false};
  8. int check_prime() {
  9.         int p=0;//p,q为两个质数且(p!=q)
  10.         for(int i=0;i<100000; ++i)
  11.                 isPrime[i]=true;
  12.         isPrime[0]=isPrime[1]=false;
  13.         for(int k=0; k<100000; ++k) {
  14.                 if(isPrime[k]) {
  15.                         prime[p++]=k;
  16.                         for(int j=2*k;j<100000;j+=k)
  17.                                 isPrime[j]=false;
  18.                 }
  19.         }
  20.         return p;
  21. }
  22. int gcd(int n,int m) {
  23.         return !m?n:gcd(m,n%m);
  24. }
  25. int check_Nprime(ll n) {
  26.         int c=0;
  27.         for(int i=2;i<n;++i)
  28.                 if(gcd(n,i)==1)
  29.                         nprime[c++]=i;
  30.         return c;
  31. }
  32. ll extgcd(ll a,ll b,ll &x,ll &y) {
  33.         ll d=a;
  34.         if(b) {
  35.                 d=extgcd(b,a%b,y,x);
  36.                 y-=(a/b)*x;
  37.         } else {
  38.                 x=1;
  39.                 y=0;
  40.         }
  41.         return d;
  42. }
  43. ll mod_pow(ll x,ll n,ll mod) {
  44.         ll res=1;
  45.         while(n>0) {
  46.                 if(n&1)
  47.                         res=res*x%mod;
  48.                 x=x*x%mod;
  49.                 n>>=1;
  50.         }
  51.         return res;
  52. }
  53. int main() {
  54.         srand((int)time(0));
  55.         check_prime();
  56.         int p=prime[rand()%100];
  57.         int q=prime[rand()%100];
  58.         ll n=p*q;//公钥n
  59.         printf("\n");
  60.         printf("p=%d,q=%d,n=%lld\n",p,q,n);
  61.         printf("\n");
  62.         ll m=(q-1)*(p-1);
  63.         ll e=nprime[rand()%check_Nprime(m)];
  64.         ll d,y;
  65.         ll gcd=extgcd(e,m,d,y);
  66.         d=d%(m/gcd)<0?d%(m/gcd)+m/gcd:d%(m/gcd);
  67.         printf("公钥:n=%d,e=%d\n",n,e);
  68.         printf("\n");
  69.         printf("私钥:n=%d,d=%d\n",n,d);
  70.         printf("\n");
  71.         printf("请输入明文:");
  72.         int s;
  73.         scanf("%d",&s);
  74.         ll C=mod_pow(s,e,n);
  75.         printf("\n");
  76.         printf("加密得到的密文为:%lld\n",C);
  77.         printf("\n");
  78.         printf("解密得到的明文为:%lld\n",mod_pow(C,d,n));
  79.         printf("\n");
  80.         return 0;
  81. }
复制代码

测试一:


测试二:


测试三:



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

8

主题

19

帖子

122

积分

注册会员

Rank: 2

积分
122
 楼主| 发表于 2022-5-3 12:50:41 | 显示全部楼层
2022/5/3.MOOC观看

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

8

主题

19

帖子

122

积分

注册会员

Rank: 2

积分
122
 楼主| 发表于 2022-5-8 15:19:34 | 显示全部楼层
一、RSA大数加密原理
RSA加密是一种非对称加密,通过对一极大整数做因数分解的困难性来保证信息的安全性。可以在不直接传递密钥的情况下完成解密,这避免了直接传递密钥所造成的被破解的风险,保证了信息的安全性。由一对密钥(公钥和私钥)来进行加解密的过程,两者之间是由数学关系来确定的,通常私钥由个人保存,公钥是公开的。

二、算法描述
1、随机生成两个数组,筛选出素数Pq,且pq互异;
2、计算n=p*q
3、筛选出与n互素的数;
4、r=(q-1)*(p-1);
5、找出ere = 1 mod (p-1)(q-1)
6、用欧几里得扩展算法计算私钥d;
7、得到公钥:ne;私钥:nd
8、对明文进行加密并输出加密后的密文和解密后的明文。

三、源代码
  1. #include<cstdio>
  2. #include<cstdlib>
  3. #include<ctime>
  4. typedef _int64 ll;
  5. int prime[10000];
  6. int nprime[100000];
  7. bool isPrime[100000]= {false};
  8. int check_prime() {//筛选出素数
  9.         int p=0;//p,q为两个质数且(p!=q)
  10.         for(int i=0;i<100000; ++i)
  11.                 isPrime[i]=true;//利用isPrime判断一个数是否为素数,先假定是一个素数
  12.         isPrime[0]=isPrime[1]=false;//若不是,则将isPrime的值改为false
  13.         for(int k=0; k<100000; ++k) {
  14.                 if(isPrime[k]) {
  15.                         prime[p++]=k;
  16.                         for(int j=2*k;j<100000;j+=k)
  17.                                 isPrime[j]=false;
  18.                 }
  19.         }
  20.         return p;//若为素数则返回该随机得到的值赋给p
  21. }
  22. int gcd(int n,int r) {
  23.         return !r?n:gcd(r,n%r);//求r和n的最大公约数
  24. }
  25. int check_Nprime(ll n) {//筛选与n互素的数
  26.         int c=0;
  27.         for(int i=2;i<n;++i)
  28.                 if(gcd(n,i)==1)
  29.                         nprime[c++]=i;
  30.         return c;
  31. }
  32. ll extgcd(ll a,ll b,ll &x,ll &y) {
  33.         ll d=a;
  34.         if(b) {
  35.                 d=extgcd(b,a%b,y,x);//用欧几里得扩展算法计算私钥d
  36.                 y-=(a/b)*x;
  37.         } else {
  38.                 x=1;
  39.                 y=0;
  40.         }
  41.         return d;
  42. }
  43. ll mod_pow(ll x,ll n,ll mod) {//快速幂取模
  44.         ll res=1;
  45.         while(n>0) {
  46.                 if(n&1)
  47.                         res=res*x%mod;
  48.                 x=x*x%mod;
  49.                 n>>=1;//移位
  50.         }
  51.         return res;
  52. }
  53. int main() {
  54.         srand((int)time(0));
  55.         check_prime();
  56.         int p=prime[rand()%100+200];
  57.         int q=prime[rand()%100+200];
  58.         ll n=p*q;
  59.         printf("\n");
  60.         printf("p=%I64d,q=%I64d,n=%lld\n",p,q,n);
  61.         printf("\n");
  62.         ll r=(q-1)*(p-1);
  63.         ll e=nprime[rand()%check_Nprime(r)];
  64.         ll d,y;
  65.         ll gcd=extgcd(e,r,d,y);
  66.         d=d%(r/gcd)<0?d%(r/gcd)+r/gcd:d%(r/gcd);
  67.         printf("公钥:n=%I64d,e=%I64d\n",n,e);
  68.         printf("\n");
  69.         printf("私钥:n=%I64d,d=%I64d\n",n,d);
  70.         printf("\n");
  71.         printf("请输入明文:");
  72.         int s;
  73.         scanf("%I64d",&s);
  74.         ll C=mod_pow(s,e,n);
  75.         printf("\n");
  76.         printf("加密得到的密文为:%lld\n",C);
  77.         printf("\n");
  78.         printf("解密得到的明文为:%lld\n",mod_pow(C,d,n));
  79.         printf("\n");
  80.         return 0;
  81. }
复制代码

四、运行截图

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

教学服务系统

GMT+8, 2025-4-30 11:40 , Processed in 0.016931 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表