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. Linux下不重启永久修改hostname

    LINUX下不重启永久修改hostname 1.如果只是修改hostname可以通过如下命令 hostname newHostname   注意:这种修改方式只有当前有效,等服务器重启后hostnam ...

  2. 2016.8.19 在dialog上增加一个button出现错误:failed to execute setAttribute on Element...

    目标:想要在dialog上多加一个button. 语法来自: http://api.jqueryui.com/dialog/#option-buttons   可见新增在dialog上的button要 ...

  3. grep 精确匹配

    使用grep实现精确过滤的五种方法 (1)当被过滤的内容占据一行时 [root@MySQL scripts]# cat oldboy.log        200 0200 2000 [root@My ...

  4. Github css加载失败,样式混乱解决办法

    github被墙的解决办法 Github css加载失败,样式混乱解决办法   打开cmd,输入  nslookup github.com 8.8.8.8  ,下面就会显示出github的服务器地址列 ...

  5. maximal-rectangle——找出最大矩形的面积

    Given a 2D binary matrix filled with 0's and 1's, find the largest rectangle containing all ones and ...

  6. Shell脚本值:运算符

    算术运算符 原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr,expr 最常用. expr 是一款表达式计算工具,使用它能完成表达式的求值操作. 例如:实现两个 ...

  7. url删除指定字符

    var str = "http://www.xxx.com/?pn=0"; // 删除指定字符 pn=0 // 我将这个字符串里所可能想到的各种情况都列举出来 var a = [ ...

  8. 自定义带下划线文本的UIButton

    转载自 http://mobile.51cto.com/hot-404798.htm,略有改动 UnderLineButton.h代码 @interface UnderLineButton : UIB ...

  9. 性能测试框架Multi-Mechanize安装与使用

    python模块介绍- multi-mechanize 通用的性能测试工具 简介 Multi-Mechanize 是一个开源的性能和负载测试框架,它并发运行多个 Python 脚本对网站或者服务生成负 ...

  10. tf树

    tf变换(1)   TF库的目的是实现系统中任一个点在所有坐标系之间的坐标变换,也就是说,只要给定一个坐标系下的一个点的坐标,就能获得这个点在其他坐标系的坐标. 使用tf功能包,a. 监听tf变换:  ...