RSA算法 是一种公钥加密算法,RSA算法相比别的算法思路非常清晰,但是想要破解的难度非常大。RSA算法基于一个非常简单的数论事实:两个素数相乘得到一个大数很容易,但是由一个大数分解为两个素数相乘却非常难。这种算法是在1978年首次亮相,它是第一个既能用于数据加密也可以用于数字签名的算法,而且理解起来简单容易。早在1973,就有密码学家发现了类似的算法,但是一直被列为绝密直到1998年才被正式公开出来。

RSA算法是一种非对称的算法,该算法需要一对密钥使用其中一个加密另一个就可以进行解密。首先我们来认识一下欧拉函数:

欧拉函数的通式形如:φ(x)=x(1-1/p1)(1-1/p2)(1-1/p3)(1-1/p4)…..(1-1/pn),计算出来的值是小于x的自然数中素数的个数,关于正确性数论上有严格的证明。

在RSA算法中我们的初始的两个素数是p和q,而欧拉函数的参数x就是p*q,那么欧拉函数就可以变形为:φ(p*q)=(p-1)*(q-1)

然后我们需要以下两个步骤来计算出一对可以用来进行加密和解密的密钥:

(1)找到任意一个数d,使得d和p*q互质,即gcd(d,p*q)=1(最大公约数 of greatest common divisor)

(2)计算出一个e,满足gcd(d*e,p*q)=1

比如举p=3,q=7为例子,那么假设使d=5满足gcd(21,5)=1,那么对应的e就应该满足gcd(5*e,21)=1,得e=17,这样一来我们就得到了一对公钥和密钥d,e。

假设要加密数据3,那么就有(3)^d mod p*q=243mod21=12 所以加密之后我们得到的数据就是

对于解密过程,我们对加密后的数据 (12)^e mod p*q=12^17mod21=(12^5)mod21 * (12^5)mod 21 * (12^5)mod21 * (12)^2mod21=((7^3)mod21)*3mod21=3

整个RSA加密解密算法的过程简单的有些令人担忧他的安全性,但是上图给了我们一个肯定的答复,随着RSA密钥长度的增加,保密的年限会加速增长,在当今现代如果不考虑量子计算机暴力破解的话,RSA算法的加密的安全是可以保证的,除非数学界会有发现新的方法可以快速算出一个大数(可以非常大)分为两个质数的乘积的算法。

有了以上的基础我们就可以对长的数据进行分组从而完成加密处理:

 #include<stdio.h>
#include<stdlib.h> #define KEY_LEN_LIMIT 1024 #define TRUE 1
#define FALSE 0 unsigned prime1,prime2;
char buf[KEY_LEN_LIMIT]={};
unsigned pub,sec=; void swap(unsigned*l,unsigned*r){
unsigned tmp=*l;
*l=*r;
*r=tmp;
} unsigned gcd(unsigned a,unsigned b){
if(a<b)swap(&a,&b);
if(b==)return a;
else return gcd(b,a%b);
} void encrypt(char*p,unsigned key,unsigned mod){
char tmp=*p;
for(unsigned i=;i<=key;i++){
tmp=(tmp*tmp)%mod;
}
*p=tmp;
} void decrypt(char*p,unsigned key,unsigned mod){
char tmp=*p;
for(unsigned i=;i<=key;i++){
tmp=(tmp*tmp)%mod;
}
*p=tmp;
} int main(int argc,char*argv[]){
printf("Input Your Primary Letter/Number 1st to Generate Key:");
scanf("%u",&prime1);
printf("Input Your Primary Letter/Number 2nd to Generate Key:");
scanf("%u",&prime2);
unsigned tmp1=(unsigned)prime1,tmp2=(unsigned)prime2;
unsigned mul=(tmp1-)*(tmp2-);
printf("Input Your 1st Public Key:");
scanf("%u",&pub);
while(gcd(pub,mul)!=){
printf("Input Your 1st Public Key:(Illegal)");
scanf("%u",&pub);
}
printf("Now The Secret Key is:");
while(((pub*sec)%mul)!=)sec++;
printf("%u\n",sec);
printf("Finally Input Your Plain Text to Encrypt:");
scanf("%s",buf);
printf("The Encrypted Text is:");
for(int i=;i<KEY_LEN_LIMIT;i++){
if(buf[i]==)break;
else{
encrypt(&buf[i],pub,mul);
printf("%u",buf[i]);
}
}putchar('\n');
printf("The Decrypted Text is:");
for(int i=;i<KEY_LEN_LIMIT;i++){
if(buf[i]==)break;
else{
decrypt(&buf[i],sec,mul);
printf("%c",buf[i]);
}
}putchar('\n');
return ;
}

<密码学入门>关于RSA算法的加密解密及代码实现的更多相关文章

  1. ios RSA 验签加密解密

    关于公钥和私钥的生成,网上有很多本地生产的方法,我遇到的问题是,按照网上生产的方式生成7个文件,本地使用没有问题,但是和后台交互就不行了. 发现生成公钥和私钥的没有那么麻烦,使用在线生产工具就能使用, ...

  2. 使用DES算法实现加密解密

    使用DES算法实现加密解密 我们常见的加密算法有DES.MD5.IDEA.AES等等,这篇随笔介绍使用DES算法实现加密解密 首先介绍一下DES算法: DES算法为密码体制中的对称密码体制,又被称为美 ...

  3. 使用PHP实现RSA算法的加密和解密

    本文提供使用RSA算法加密解密数据的PHP程序类(签名和验签的实现方式可以查看使用PHP实现RSA算法的签名和验签 这篇文章),封装了格式化公钥和私钥文件的方法,这样无论使用什么格式的公钥或者私钥都可 ...

  4. RSA算法 JS加密 JAVA解密

    有这样一个需求,前端登录的usernamepassword,password必需加密.但不可使用MD5,由于后台要检測password的复杂度,那么在保证安全的前提下将password传到后台呢,答案 ...

  5. Java使用AES算法进行加密解密

    一.加密 /** * 加密 * @param src 源数据字节数组 * @param key 密钥字节数组 * @return 加密后的字节数组 */ public static byte[] En ...

  6. PHP 服务端 和 APP 客户端 实现 RSA+AES 双向加密解密

    目的:服务端和移动端双向加密解密 共有七个文件 其中包括三个类文件 lib_aes.php aes对称加密解密类 server_rsa_crypt.php 服务端RSA公钥私钥非对称加密解密类 cli ...

  7. java使用RSA与AES加密解密

    首先了解下,什么是堆成加密,什么是非对称加密? 对称加密:加密与解密的密钥是相同的,加解密速度很快,比如AES 非对称加密:加密与解密的秘钥是不同的,速度较慢,比如RSA 先看代码(先会用在研究) 相 ...

  8. iOS 3DES加密解密(一行代码搞定)

    3DES(或称为Triple DES)是三重数据加密算法(TDEA,Triple Data Encryption Algorithm)块密码的通称.它相当于是对每个数据块应用三次DES加密算法.由于计 ...

  9. base64加密解密c++代码

    关于base64加密解密代码: 程序运行功能请自行查看main函数: #include <stdio.h> #include <string.h> #include <a ...

随机推荐

  1. OpenCV头文件包含问题

    opencv从2.2版本以后<opencv root>include下有两个文件夹 opencv 和opencv2.从官方的意思来看,它逐渐喜欢用opencv2里面的那种包含头文件的方式. ...

  2. MAC - 命令行中用sublime打开指定文件,使用ln命令建立软链接

    眼下sublime是mac下最好的文本编辑软件.常常要使用它打开一些文件,比如html,js,txt,json等文件,可是sublime2默认不支持在命令行下调用.经过研究发现能够用建立软连接的方式调 ...

  3. apache的配置优化

    [APACHE的工作方式] prefork模式(默认)这个多路处理模块(MPM)实现了一个非线程型的.预派生的web服务器,它的工作方式类似于Apache 1.3.它适合于没有线程安全库,需要避免线程 ...

  4. fastJson 转换日期格式

    第一种方法: JSON.DEFFAULT_DATE_FORMAT = "yyyy-MM-dd"; String str = JSON.toJSONString(user,Seria ...

  5. Android 进程间通信——AIDL

    代码地址如下:http://www.demodashi.com/demo/12321.html 原文地址:http://blog.csdn.net/vnanyesheshou/article/deta ...

  6. Visual Studio 2015官方下载 秘钥破解

    微软刚刚为开发人员奉上了最新大礼Visual Studio 2015正式版.如果你是MSDN订阅用户,现在就可以去下载丰富的相关资源.如果你指向体验一把尝尝鲜,微软也是很慷慨的. Visual Stu ...

  7. Cloudera Manager 和 CDH 4 终极安装

    转载请注明出处:http://www.cnblogs.com/thinkCoding/p/3567408.html 系统环境 操作系统:CentOS 6.5 Cloudera Manager 版本:4 ...

  8. DNA分子结构3D模型

    生物信息资源更新越来越快,使用可视化的方法来分析DNA序列已成为生物信息学的一个研究热点,用图形表示DNA序列的方法也越来越成熟.2011年,著名杂志<Science>发表一篇引起轰动的文 ...

  9. intel电源管理技术中I2C和SVID

    1.I2C总线架构图: 2.Gemini Lake平台所支持的PMIC 是哪种类型? POR 是SVID PMIC, i2c PMIC 会影响性能. 3.SerialVID, 总共有三个信号线 时钟( ...

  10. 【Servlet与JSP】请求转发与重定向

    假设一个登录系统,要求用户输入用户名和密码: 用户在上面表单当中输入了信息之后,点击登录按钮(type="submit")将表单作为请求参数进行提交. 这一提交就有两种形式:get ...