RSA算法介绍与C实现算法

什么是rsa:

RSA公开密钥密码体制。所谓的公开密钥密码体制就是使用不同的加密密钥与解密密钥,是一种“由已知加密密钥推导出解密密钥在计算上是不可行的”密码体制。

在在公开密钥密码体制中,加密密钥(即公开密钥)PK是公开信息,而解密密钥(即秘密密钥)SK是需要保密的。加密算法E和解密算法D也都是公开的。虽然解密密钥SK是由公开密钥PK决定的,但却不能根据PK计算出SK。

rsa的算法描述:
(1)选择一对不同的、足够大的素数p,q。
(2)计算n=pq。
(3)计算f(n)=(p-1)(q-1),同时对p, q严加保密,不让任何人知道。
(4)找一个与f(n)互质的数e,且1<e<f(n)。
(5)计算d,使得de≡1 mod f(n)。这个公式也可以表达为d ≡e-1 mod f(n)

(6)公钥KU=(e,n),私钥KR=(d,n)。
(7)加密时,先将明文变换成0至n-1的一个整数M。若明文较长,可先分割成适当的组,然后再进行交换。设密文为C,则加密过程为:
(8)解密过程为:

 

#include <stdio.h>
#include <math.h>
#include <stdlib.h>
int length = 0 ;
bool JudgeP (int prime)             //判断是不是素数
{
    int i=0;
    long double temp=0 ;
    if (prime == 0||prime == 2)
        return false;
    else
    {
    temp =sqrt((float)prime);
    for (i=2;i<=temp;i++)
    {
        if (prime%i == 0)
                return false;       //输入的不是素数
    }
    return true ;                    //输入的数是素数
    }

}
long int InputP ( )        //直到输入素数
{
    int num;
        scanf_s("%d",&num);
    while (!JudgeP(num))
    {
        printf("您输入的的不是素数,请重新输入!\n");
        scanf_s("%d",&num);
    }
    return num ;
}
int gcd(int a , int b){
    return b==0?a:gcd(b,a%b);
}
long int  CheckE (long int f_n )        //判断e是否符合要求  1<e <f_n且e 与f_n互素
{
    long int e ;
    int k ;
    printf("please enter e(1<e<f_n) :");
    scanf_s("%d",&e );
    while (e > f_n || e<= 1)                        //确定e的范围
    {
        printf("e is‘t fit ,enter again!(1<e<f_n)");
        scanf_s("%d",&e );
    }
    k =gcd(f_n,e) ;
    while (k != 1)
    {
        printf("e with f_n relatively prime,enter again!");
        scanf_s("%d",&e);
        k =gcd(f_n,e) ;
    }
    return e ;
}
long int  CalculateD(long int  f_n ,long  int e)     //辗转相除
{
    int i , j = 1 , t1 , t2= 1 , k = 0  , m ;

    int arry_1[30] = {f_n,e} ,arry_2[30] ={0} ;
    printf(" the Calculation:\n") ;
    for (i=1 ; (arry_1[i] != 0 )&&( arry_1[i] != 1); i ++)
    {
        arry_1[i+1] =arry_1[i-1]%arry_1[i] ;
        arry_2 [i-1] = arry_1[i-1]/arry_1[i] ;
        printf(" %d = %d*%d+%d\n",arry_1[i-1],arry_1[i],arry_2[i-1],arry_1[i+1] ) ;
    }
    t1 = 1 ;
    t2 = -arry_2[i-2] ;
    while((i -2)!= k )
    {
        m = t1 ;
        t1 = t2  ;
        if (j%2 != 0)
            t2 = (abs(m)+arry_2[i-3]*abs(t2) );
        else
            t2 = -(abs(m)+arry_2[i-3]*abs(t2) );

        i -- ;
        j++ ;
    }

    while(t2 < 0)
    {
        t2 = f_n + t2 ;
    }
    k = t2 ;
    while(t2 = t2/f_n)
    {
        k = t2%f_n      ;
    }
    printf("k = %d\n",k);

    return k ;
}
int * Dec2Bin(int e ) //转换为二进制
 {
  int i = 0 ;
 int str1[20] ,str2[20] ;

 while(e)
 {
  str1[i] = e%2 ;
  e = e/2 ;
   i++ ;
 }
 i -- ;
 printf("The binary is :");
 for (length = 0 ; i>=0 ; length ++)
 {
 str2[length] = str1[i] ;
 printf("%d",str2[length]);
 i -- ;
 }
 return str2 ;

 }
 int  Encrypt(int m , int e , int n)  //平方乘法
 {
     int  c =1  , i ;
    int *p =  Dec2Bin(e) ;

     for (i = 0  ; i < length;i ++)
     {
         c = c %n;
         c =c*c%n ;
          if (*(p+i) == 1)
         { c =c%n;
          c =c*m%n;
          }
     }
     return c ;
 }
int main(void)
{
    long int p,q ,n,f_n ,e ,d,m,c,l;
    printf("please enter p:");  //p,q输入
    p = InputP();
    printf("please enter q ");
    q = InputP();

    n = p*q ;                    //计算n,f_n
    f_n =(p-1)*(q-1);

    e = CheckE(f_n );            //计算e
    d=CalculateD(f_n,e);        //计算d

    printf("please enter m ");
    scanf_s("%d",&m) ;
    c =Encrypt(m,e,n);
    printf("c is %d\n",c );
    l=Encrypt(c,d,n);
    printf("l is %d\n",l );
system("pause");
return 0 ;
}
时间: 2024-08-10 16:58:29

RSA算法介绍与C实现算法的相关文章

数据结构与算法 介绍以及常见的算法排序

介绍 数据结构: 计算机存储,组织数据的结构.指相互之间存在着一种或多种关系的数据元素的集合和该集合中数据元素之间的关系组成. 线性数据结构:数组,链表 应用:队列 栈 非线性数据结构:树,图 算法: 对数据结构中数据的操作 常见的算法排序 low B三件套 #冒泡排序 #时间复杂度:O(n2) #空间复杂度:O(1) def bubble_sort(li): for i in range(len(li)-1): flag = False for j in range(len(li)-i-1):

基于位置信息的聚类算法介绍及模型选择

百度百科 聚类:将物理或抽象对象的集合分成由类似的对象组成的多个类的过程被称为聚类.由聚类所生成的簇是一组数据对象的集合,这些对象与同一个簇中的对象彼此相似,与其他簇中的对象相异."物以类聚,人以群分",在自然科学和社会科学中,存在着大量的分类问题.聚类分析又称群分析,它是研究(样品或指标)分类问题的一种统计分析方法.聚类分析起源于分类学,但是聚类不等于分类.聚类与分类的不同在于,聚类所要求划分的类是未知的. 分类和聚类算法一直以来都是数据挖掘,机器学习领域的热门课题,因此产生了众多的

飞思卡尔智能车电磁组分区算法介绍

写在之前的话: 1.目前我是一名在校学生,这也是我第一次写博客,不周之处,请多谅解: 2.此算法并非原创,借鉴自山东德州学院第八届白杨队(PS:个人看法,对于一些人把别人的开源东西改头换面一下就说是自己的原创行为十分鄙视): 3.对于此算法的理解和说明并非纸上谈兵,算法已经被我运用到了小车比赛中并取得好的成绩(具体就不多说了,比赛时车莫名其妙坏了,比赛前调试的速度绝对能进国赛,比较遗憾),总之这算法是我尝试过的最好的算法: 4.这一次所介绍的只是路径算法和一些知识普及,后面有时间会介绍其余部分算

机器学习之Javascript篇: 近邻(k-nearest-neighbor) 算法介绍

原文:http://burakkanber.com/blog/machine-learning-in-js-k-nearest-neighbor-part-1/ 翻译:王维强 我的目的是使用一门通用语言来教授机器学习,内容涵盖基础概念与高级应用.Javascript是一个非常好的选择,最明显的优点就是对运行环境没有特殊要求.另外,因为该语言缺乏与机器学习相关的类库,也能迫使我们从基础编码写起. 先看一个实例. 今天我们将要开始近邻(k-nearest-neighbor)算法的学习,该算法在文章中

基于R语言的梯度推进算法介绍

通常来说,我们可以从两个方面来提高一个预测模型的准确性:完善特征工程(feature engineering)或是直接使用Boosting算法.通过大量数据科学竞赛的试炼,我们可以发现人们更钟爱于Boosting算法,这是因为和其他方法相比,它在产生类似的结果时往往更加节约时间. Boosting算法有很多种,比如梯度推进(Gradient Boosting).XGBoost.AdaBoost.Gentle Boost等等.每一种算法都有自己不同的理论基础,通过对它们进行运用,算法之间细微的差别

【数据结构&amp;&amp;算法系列】KMP算法介绍及实现(c++ &amp;&amp; java)

KMP算法如果理解原理的话,其实很简单. KMP算法简介 这里根据自己的理解简单介绍下. KMP算法的名称由三位发明者(Knuth.Morris.Pratt)的首字母组成,又称字符串查找算法. 个人觉得可以理解为最小回溯算法,即匹配失效的时候,尽量少回溯,从而缩短时间复杂度. KMP算法有两个关键的地方,1)求解next数组,2)利用next数组进行最小回溯. 1)求解next数组 next数组的取值只与模式串有关,next数组用于失配时回溯使用. 在简单版本的KMP算法中,每个位置 j 的 n

【算法】表达式求值--逆波兰算法介绍

逆波兰算法介绍 假定给定一个只 包含 加.减.乘.除,和括号的算术表达式,你怎么编写程序计算出其结果. 问题是:在表达式中,括号,以及括号的多层嵌套 的使用,运算符的优先级不同等因素,使得一个算术表达式在计算时,运算顺序往往因表达式的内容而定,不具规律性. 这样很难编写出统一的计算指令.使用逆波兰算法可以轻松解决.他的核心思想是将普通的中缀表达式转换为后缀表达式. 转换为后缀表达式的好处是:1.去除原来表达式中的括号,因为括号只指示运算顺序,不是完成计算必须的元素.2.使得运算顺序有规律可寻,计

BWT 压缩解压缩算法介绍 poj 1147

poj上1147题, 题意:任意一个长度为N的字符串,循环左移一个字符长度,这样形成N个新字符串,将这N个字符串按字典顺序排序,从上到下取得排序后的每行最后一列的的所有字符,求排序后的第一行字符串? 举个简单例子: 原串为: 0 0 0 1 1 那么循环左移排序后的矩阵为: 0 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 0 0 0 1 1 1 0 0 0 那么我们得到最后列的字符串为: 1 0 0 1 0 现在我们只知道最后列的字符串 1 0 0 1 0,让我们求循环左移排序后

FCM聚类算法介绍

FCM算法是一种基于划分的聚类算法,它的思想就是使得被划分到同一簇的对象之间相似度最大,而不同簇之间的相似度最小.模糊C均值算法是普通C均值算法的改进,普通C均值算法对于数据的划分是硬性的,而FCM则是一种柔性的模糊划分.在介绍FCM具体算法之前我们先介绍一些模糊集合的基本知识. 1 模糊集基本知识 首先说明隶属度函数的概念.隶属度函数是表示一个对象x隶属于集合A的程度的函数,通常记做μA(x),其自变量范围是所有可能属于集合A的对象(即集合A所在空间中的所有点),取值范围是[0,1],即0<=