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. JAVA实现EXCEL公式专题(四)——字符串函数

    直接上代码: /** * 项目名称: * 文件说明: ExCEL公式类型:字符串公式 * 主要特点: * 版本:1.0 * 制作人:刘晨曦 * 创建时间:2013-12-3 **/ package E ...

  2. CodeForces - 344B Simple Molecules (模拟题)

    CodeForces - 344B id=46665" style="color:blue; text-decoration:none">Simple Molecu ...

  3. JAVA Eclipse开发Android如何设置滚动条最大值最小值

    最小值默认为0,你最好在实现逻辑中修改 最大值为max 初始值为progress      <SeekBar      android:id="@+id/seekBarSpeedMov ...

  4. suid sgid sbit chattr lsattr find

    suid 一般用于二进制可执行文件不可用于shell脚本和目录,suid代表当用户执行此二进制文件时,暂时具有此文件所有者的权限 chmod 4xxx binfile sgid 一般用于目录,sgid ...

  5. mycat 分页慢原理解析、mycat跨事务解惑、mycat注解调用存储过程分析

    1结合Mycat日志,分析select * from travelrecord order by id limit100000,100 的运行过程,解释下当limit M,N中的M非常大的情况下.为什 ...

  6. WebService中获取request对象一例

    @WebService @Service public class WeiXinWebServiceImpl implements IWeiXinWebService { @Resource priv ...

  7. java个人感想

    java与c++相比,摒弃了c++的指针,把c++中的stl封装成一个库,而且改变了当中的某些方法,使用方法也产生了非常多不同,读者在编程过程中须要自己细细体会 个人觉得三大框架基于前端+领域逻辑+数 ...

  8. SQLServer待优化语句查询

    SELECT top 100 (total_elapsed_time / execution_count)/1000 N'平均时间ms' ,total_elapsed_time/1000 N'总花费时 ...

  9. LM339组成的双限比较器

    通常是上限电压值与电源电压Vcc接近,下限电压值靠近0V.

  10. android开发系列之数据存储

    在我们的android实际开发过程,必不可少的一种行为操作对象就是数据.有些数据,对于用户而言是一次性的,这就要求我们每次进到App的时候,都需要去刷新数据.有些数据,对于用户而言又是具有一定时效性的 ...