非对称性加密简介
非对称加密,也称为公钥加密,是一种加密方式,相对于对称加密,它使用两个不同的密钥,一个公钥和一个私钥。公钥可以公开,任何人都可以使用它来加密消息,但只有私钥的持有者才能将其解密。
在非对称加密中,公钥和私钥是一对密钥,它们是由数学算法生成的。公钥可以被广泛分发,而私钥则必须保密。当A想要给B发送加密消息时,A使用B的公钥对消息进行加密,然后将密文发送给B。B收到密文后,使用自己的私钥进行解密,得到原始的消息。
非对称加密具有以下特点:
- 安全性高:非对称加密使用不同的密钥进行加密和解密,相对于对称加密,更加安全,因为攻击者无法从公钥中推断出私钥。
- 公钥分发方便:公钥是公开的,任何人都可以使用它来加密消息,因此公钥的分发相对来说更加方便。
- 加密和解密速度慢:非对称加密的加密和解密速度相对于对称加密要慢得多,因为它需要进行更加复杂的数学计算。
目前,较为常见的非对称性加密算法有RSA、ECC(移动设备用)、Diffie-Hellman、El Gamal、DSA(数字签名用)Hash算法等等。
RSA算法简介
1、随机选择两个不相同的质数(素数)p和q
2、计算公共模数n=p*q
3、计算欧拉函数φ(n)=(p-1)(q-1)
4、计算随机整数公钥e,e要满足的条件有e大于一、小于欧拉函数φ(n)并和欧拉函数φ(n)互质。
5、计算模反元素密钥d,d要满足的条件是(d*e)%φ(n)=1
6、加密,密文数据c=明文数据m的e次幂再取余公共模数n,也就是c=(m^e)%n
7、解密,明文数据m=密文数据c的d次幂再取余公共模数n,也就是m=(c^d)%n
源码
AsymmetricEncryption.cpp
#ifndef ASYMMETRICENCRYPTION_CPP
#define ASYMMETRICENCRYPTION_CPP
#include "LargeNum.cpp"
#include <time.h>
#include <math.h>
//#define ASYMMETRICENCRYPTION_OUTPUT
typedef struct RSA{
LargeNum e ;
LargeNum n ;
LargeNum d ;
} RSA ;
//判断一个unsigned long long数是否是质数
bool is_prime(ull x){
if(x < 2)return false ;
if(x < 4)return true ;
if((x % 6) != 1 && (x % 6) != 5)return false ;
const ull last = sqrt(x) + 1 ;
for(ull i = 2;i < last;++ i)
if((x % i) == 0)return false ;
return true ;
}
/*
函数名称:GetKey
函数参数:取随机质数的最大值、所加密的数据的最大值
函数作用:返回一组RSA加密算法公钥、私钥组合结构体
*/
RSA GetKey(ull max,ull min_num){
srand(time(0)) ;
RSA key ;
LargeNum tn ;
ull q,p ;
while(tn <= min_num){
q = 0ULL ;
p = 0ULL ;
while(!is_prime(q))q = rand() % max ;
while(!is_prime(p) || q == p)p = rand() % max ;
tn = (q - 1) * (p - 1) ;
}
key.n = q * p ;
key.e = 2 ;
while(gcd(key.e,tn) != 1)++ key.e ;
key.d = 1 ;
while(((key.e * key.d) % tn) != 1)++ key.d ;
#ifdef ASYMMETRICENCRYPTION_OUTPUT
printf("取随机素数:q:%llu p:%llu n:",q,p) ;
key.n.output() ;
printf(" 欧拉函数:") ;
tn.output() ;
printf(" e:") ;
key.e.output() ;
printf(" d:") ;
key.d.output() ;
printf("\n") ;
#endif
return move(key) ;
}
//加密
ll encryption(ull m,RSA& key){
return (pow(LargeNum(m),key.e) % key.n).to_ll() ;
}
//解密
ll decrypt(ull c,RSA& key){
return (pow(LargeNum(c),key.d) % key.n).to_ll() ;
}
#endif
测试代码
#include <stdio.h>
#include "AsymmetricEncryption.cpp"
#include <string>
#include <iostream>
int main(){
RSA key = GetKey(20,255) ;
printf("原数据:") ;
std::string t ;
std::cin >> t ;
ull data[t.size()] ;
printf("加密后:") ;
for(int i = 0;i < t.size();++ i)printf("%llu ",data[i] = encryption(t[i],key)) ;
printf("\n") ;
printf("解密后:") ;
for(int i = 0;i < t.size();++ i)t[i] = decrypt(data[i],key) ;
std::cout << t ;
return 0 ;
}
其他
NUM_TYPE_def.cpp文件是我自己编写的大数乘法类,在我的首页置顶处,也在C++大整数类(上万位数秒算)-CSDN博客,编译时至于同一目录即可
开发环境:devc++
优化级别:自动
C++标准:ISOC++11
在头文件前定义宏ASYMMETRICENCRYPTION_OUTPUT,可以输出GetKey函数运行信息