RSA实现输出公钥和私钥 linuxc实现

这是一个使用C语言在Linux环境下实现RSA加密算法的示例,包括生成随机素数、计算最小公倍数、确定公钥和私钥等步骤。程序通过计算两个素数p和q的乘积N以及它们减一后的最小公倍数L,来确定公钥e和私钥d,确保e和L的最大公约数为1。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >



/*************************************************************************
    > File Name: 1.c
    > Author: wolf
    > Description:  
    > Created Time: 2015年05月07日 星期四 09时11分40秒
 ************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
//RSA
// 公钥对(e,N)  加密方法:  明文^e mod N=秘文
// 私钥对(d,N)  解密方法: 秘文^d mod N=明文
// 我们要计算出 e  d  N 的值
//N = p*q (q和p为两个素数) 
//L= (p-1)和(q-1)的最小公倍数,L用来生成e 和 d
//e为一个素数 这个素数和L的最大公约数为1
// e*d mod L = 1 (d满足此公式)

//过程综述
//1.如何生成随机素数
//  生成两个素数(在这作实验使用小的素数1000以内) p 和 q
//  (如何判断一个数是素数)
//2.求两个书的最小公倍数
//   先求出两个数的最大公约数(辗转相除) 
//   再用两个数的乘机除以最大公约数就是最小公倍数
// 
#define PRIME_RANGE_LEFT  5 
#define PRIME_RANGE_RIGHT 20  //素数范围


int gcd(int d1,int d2);  //生成两个数的最大公约数
int match(int e,int L); //匹配e和L的最大公约数为1
int isnprime(int d);
int prime(void); //产生素数
int lcm(int d1,int d2);//计算最小公倍数
int cal_e(int d);  //求出公钥中的 e
int cal_d(int e,int L); //求出私钥的d

int main(int argc,char *argv[])
{
 int p,q;
 int N,L;
 int e;
 int d;

 srand(time(NULL));

  p = prime();
  q = prime();
 
  N = q*p;
  L = lcm(p-1,q-1);
  e = cal_e(L);  
  d = cal_d(e,L);

  //printf("%d--%d--%d--%d--%d--%d\n",p,q,N,L,e,d);
 
  printf("公钥(%d,%d)\n",e,N);
  printf("私钥(%d,%d)\n",d,N);
  return 0;
}

//判断是否为素数
int isnprime(int d)
{
 int nu;
 int i;

 nu = (int)sqrt(d)+1;
 if(nu==2)
  return 0;

 for(i=2;i<nu;i++)
 {
  if(d%i==0)
   break;
 }
 if(i>=nu && i!=2)
  return 0;

 return 1;
}


int gcd(int d1,int d2)  //生成两个数的最大公约数
{
 int r;

 if(d1<d2)
 {
  r=d1^d2;
  d1 = r^d1;
  d2 = r^d1;
 }

 //计算最大公约数
 r = d1%d2;
 while(r!=0)
 {
  d1 = d2;
  d2 = r;
  r = d1%d2;
 }

 return d2;
}

int match(int e,int L) //匹配e和L的最大公约数为1
{
 int number;

 number = gcd(e,L);
 if(number==1)
  return 1;
 else
  return 0;
}

int cal_e(int L)
{
 int e;
 int stop=0;
    
 while(!stop)
 {
  do
  {
   e = rand()%15+2;
  }while(isnprime(e)); //判断是否为素数
  
  if(match(e,L)) //找e和L最大公约数为1的e
   return e;  
 } 
 return 0; //错误时返回0 
}

//求吃私钥中的d
int cal_d(int e,int L)
{
 int d;
 for(d=1;d<=L;d++)
 {
  if((e*d)%L==1)
   return d;
 }

 return 0;  //没找到返回0 
}

int prime(void)
{
 int number;

 do
 {
  number = rand()% PRIME_RANGE_RIGHT+PRIME_RANGE_LEFT; 
 }while(isnprime(number));

 return number;
}

int lcm(int d1,int d2) //最小公倍数
{
 int number;

 number  = d1*d2;
 return (number / gcd(d1,d2));
}

### 如何在Linux中生成使用SSH公钥私钥 #### 生成SSH密钥对 为了实现安全的无密码登录,可以利用`ssh-keygen`工具来创建一对SSH密钥。默认情况下,这会生成RSA类型的密钥,但也可以指定其他算法如ED25519或ECDSA。 ```bash ssh-keygen -t rsa -b 4096 -C "your_email@example.com" ``` 上述命令中的参数解释如下: - `-t rsa`: 指定要使用的加密类型,在这里是RSA。 - `-b 4096`: 设置密钥长度为4096位,提供更强的安全保障[^1]。 - `-C "your_email@example.com"`: 添加一个标签,通常用于识别密钥的所有者。 执行此命令后,系统将会提示选择保存位置,默认路径通常是用户的`.ssh`目录下,并询问是否设置访问密钥所需的密码短语(passphrase)。如果希望完全免密,则可以直接按回车跳过此项[^3]。 #### 将公钥复制至目标机器 一旦成功生成了密钥对,下一步就是把本地计算机上的公钥发送给远程服务器。可以通过多种方法完成这一操作;最简单的方式之一是通过`ssh-copy-id`命令自动处理整个过程。 ```bash ssh-copy-id user@remote_host ``` 这条指令能够有效地将当前用户的公钥追加到远端主机上相应账户下的`.ssh/authorized_keys`文件里,从而允许后续基于密钥的身份验证。 对于某些特定场景可能无法直接运行`ssh-copy-id`的情况下,还可以手动传输并添加公钥内容。具体做法是从源机读取公钥文件的内容并通过某种途径将其粘贴进目的设备对应的位置内。 #### 修改远程主机SSH配置 有时为了让新的认证方式生效,还需要调整远程系统的SSH服务配置。一般涉及编辑位于`/etc/ssh/sshd_config`内的设定项,确保启用了PubkeyAuthentication选项以及指定了正确的AuthorizedKeysFile路径。 ```bash PubkeyAuthentication yes AuthorizedKeysFile .ssh/authorized_keys ``` 更改完成后记得重启SSH守护进程使改动立即起效。 #### 使用私钥进行连接 最后当一切准备就绪之后,就可以尝试仅凭借之前建立好的私钥来进行远程登录测试了。假如已经设置了无保护措施的私钥(即未设passphrase),那么只需像平常一样发起SSH请求即可无缝接入目标节点。 ```bash ssh -i ~/.ssh/id_rsa user@remote_host ``` 这里-i标志用来显式指出所要用作身份证明的具体私钥文档所在之处[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值