<密码学入门>关于RSA算法的加密解密及代码实现
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算法的加密解密及代码实现的更多相关文章
- ios RSA 验签加密解密
关于公钥和私钥的生成,网上有很多本地生产的方法,我遇到的问题是,按照网上生产的方式生成7个文件,本地使用没有问题,但是和后台交互就不行了. 发现生成公钥和私钥的没有那么麻烦,使用在线生产工具就能使用, ...
- 使用DES算法实现加密解密
使用DES算法实现加密解密 我们常见的加密算法有DES.MD5.IDEA.AES等等,这篇随笔介绍使用DES算法实现加密解密 首先介绍一下DES算法: DES算法为密码体制中的对称密码体制,又被称为美 ...
- 使用PHP实现RSA算法的加密和解密
本文提供使用RSA算法加密解密数据的PHP程序类(签名和验签的实现方式可以查看使用PHP实现RSA算法的签名和验签 这篇文章),封装了格式化公钥和私钥文件的方法,这样无论使用什么格式的公钥或者私钥都可 ...
- RSA算法 JS加密 JAVA解密
有这样一个需求,前端登录的usernamepassword,password必需加密.但不可使用MD5,由于后台要检測password的复杂度,那么在保证安全的前提下将password传到后台呢,答案 ...
- Java使用AES算法进行加密解密
一.加密 /** * 加密 * @param src 源数据字节数组 * @param key 密钥字节数组 * @return 加密后的字节数组 */ public static byte[] En ...
- PHP 服务端 和 APP 客户端 实现 RSA+AES 双向加密解密
目的:服务端和移动端双向加密解密 共有七个文件 其中包括三个类文件 lib_aes.php aes对称加密解密类 server_rsa_crypt.php 服务端RSA公钥私钥非对称加密解密类 cli ...
- java使用RSA与AES加密解密
首先了解下,什么是堆成加密,什么是非对称加密? 对称加密:加密与解密的密钥是相同的,加解密速度很快,比如AES 非对称加密:加密与解密的秘钥是不同的,速度较慢,比如RSA 先看代码(先会用在研究) 相 ...
- iOS 3DES加密解密(一行代码搞定)
3DES(或称为Triple DES)是三重数据加密算法(TDEA,Triple Data Encryption Algorithm)块密码的通称.它相当于是对每个数据块应用三次DES加密算法.由于计 ...
- base64加密解密c++代码
关于base64加密解密代码: 程序运行功能请自行查看main函数: #include <stdio.h> #include <string.h> #include <a ...
随机推荐
- linux中脚本扑捉(trap)信号问题
扑捉ctrl+c信号: #!/bin/bash trap ; function trap() { echo "You press Ctrl+C."; echo "Exit ...
- xml 文件不给提示(以mybatis 的 mapper映射文件为例)
在xxx.xml 映射文件的头部可以看到 如下: (mybatis generate 自动生成) <!DOCTYPE mapper PUBLIC "-//mybatis.org//DT ...
- SVN切分支步骤
1.右键project选择Brankch/Tag 2.选择SVN路径并在改路径下填写project名称 3.选择最新版本号 4.填写必要的凝视备忘,方便日后查看 5.刷新父文件夹文件夹.下载被切出来的 ...
- React学习之事件绑定
React事件绑定有主要有三种方式 第一种官方推荐方式: class LoginControl extends React.Component { constructor(props) { ...
- Leetcode Array 11 Container With Most Water
题目: Given n non-negative integers a1, a2, ..., an, where each represents a point at coordinate (i, a ...
- C#高级编程---暂停计划
学了两个半月的C#高级编程这本书,看到了第三部分,说实话,我有点怂了,我认怂,临时先放一下,博客暂停,由于我的水平确实不会了,在写下去也是自欺欺人,我决定先研究研究我比較喜欢的脚本语言JS,開始写的, ...
- Canvas中图片翻转的应用
很多时候拿到的素材都是单方向的,需要将其手动翻转来达到需求,比如下面这张图片: 它是朝右边方向的,但还需要一张朝左边方向的,于是不得不打开PS将其翻转然后做成雪碧图.如果只是一张图片还好说,但通常情况 ...
- FTP匿名登录或弱口令漏洞及服务加固
漏洞描述 FTP 弱口令或匿名登录漏洞,一般指使用 FTP 的用户启用了匿名登录功能,或系统口令的长度太短.复杂度不够.仅包含数字.或仅包含字母等,容易被黑客攻击,发生恶意文件上传或更严重的入侵行为. ...
- ASP.NET页面间传值的几种方式
ASP.NET页面间传值的几种方式 1.使用QueryString 使用QuerySting在页面间传递值已经是一种很老的机制了,这种方法的主要优点是实现起来非常简单,然而它的缺点是传递的值是会显示在 ...
- delphi 解析Json格式(转自:http://blog.csdn.net/jayqiang/article/details/7066824)
SuperObject 是开源的 Delphi 的 JSON 工具包,可生成 JSON 数据以及进行 JSON 解析. unit Unit6; interface uses Windows, Mess ...