非对称加密 解密算法RSA的C 实现
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第 四 步 , 对 第 三 步 所 得 的 明 文 clear[MAXLENGTH] 进 行 加 密 。 遍 历 clear[size],对每一个整数用以下算法进行加密,并将加密后的密文保存在 Ciphertext[MAXLENGTH]中。
注意:此处不能用 m2[j] = clear[j] ^ e 整数的幂,因为当 e 和 clear[j]较大 时,会发生溢出,至使出现无法预料的结果。
行判断。
3 由于以上原因,当我们所用数据较大时,会出现错误,例如运行结果③。
4 当我们输入要进行加密的明文时,必须保证每个正整数小于 n,我们没有做 防范措施,也会出现错误结果。
【参考资料】1、
Page 6 of 8
2、百度文库:http://baike.baidu.com/view/539299.htm
信息安全技术实验报告
———非对称加密、解密算法 RSA 的 C++实现
计算机学院 2008 级 12 班 学号:53081224 姓名:胡守峰
非对称加密、解密算法 RSA 的 C++实现
【我的目的】根据课上老师所讲“非对称加密、解密算法 RSA”的有关知识,
编写其的 C++语言实现。
【我的加密思想】第一步,用户首先输入两个素数 p 和 q,并求出
cout << " 请输入要加密的小于 " << n << " 正整数(以-1 结束):" << endl; cout << " 加密前的明文为:"; for( i = 0; i < MAXLENGTH; i++)
Ciphertext[i] = 1; int count; for(int j = 0; j<MAXLENGTH; j++) {
n = p*q,然后再求出 n 的欧拉函数值 phi。 第二步,在[e,phi]中选出一个与 phi 互素的整数 e,并根据 e*d ≡1(mod
phi),求出 e 的乘法逆元。至此我们已经得到了公开密钥{e,n}和秘密密钥{d, n}。
第三步,让用户输入要进行加密的小于 n 一组正整数(个数不超过 MAXLENGTH=500),输入以-1 为结束标志,实际个数存入 size 中,正整数以 clear[MAXLENGTH]保存。
RSA 算法是第一个能同时用于加密和数字签名的算法,也易于理解和操作。 RSA 是被研究得最广泛的公钥算法,从提出到现在已近二十年,经历了各种攻击 的考验,逐渐为人们接受,普遍认为是目前最优秀的公钥方案之一。RSA 的安全性 依赖于大数的因子分解,但并没有从理论上证明破译 RSA 的难度与大数分解难度等 价。即 SA 的重大缺陷是无法从理论上把握它的保密性能如何,而且密码学界多数人
cout << " 加密前的明文为:"; for( k = 0; k < size; k++)
cout << clear[k] << " "; cout << endl; } void main() { Encryption(); char c; cout << endl; cout << "是否要解密(Y or N): "; cin >> c; if(c == 'y' || c == 'Y')
第五步,输出加密后的密文。
【我的解密思想】第一步,根据在以上算法中求出的解密密钥[d,phi],对加
密 后 的 密 文 Ciphertext[MAXLENGTH] 进 行 解 密 , 结 果 保 存 在 DecryptionText[MAXLENGTH]中,算法如下:
第二步,输出对加密前的明文和加密并解密后的密文进行比较,判断两个数组是 否一致,从而得知算法是否正确。
Page 8 of 8
int size = 0;//保存要进行加密的正整数的个数
int p, q; //两个大素数
int n, phi; //n = p * q,phi = (p-1) * (q-1) 是 n 的欧拉函数值
int e;
//{e, n}为公开密钥
int d;
//{d, n}为秘密密钥
int clear[MAXLENGTH], Ciphertext[MAXLENGTH];//分别用于存放加//密前的明
Decryption();
Page 4 of 8
else return ;
}
2、 运行结果: ①
②
③
Page 5 of 8
3、 实验分析:
1 输入两个大素数 p 和 q 时,没有进行判断所输入的是不是素数 2 对 phi 求解 e 的乘法逆元时,必须保证 e 和 phi 互素,在这里我们也没有进
保密级别 对称密钥长度(bit) RSA 密钥长度(bit) ECC 密钥长度(bit) 保密年限
80
80
1024
160
2010
百度文库
112
112
2048
224
2030
128
128
3072
256
2040
192
192
7680
384
2080
256
256
15360
512
2120
这种算法 1978 年就出现了,它是第一个既能用于数据加密也能用于数字签名的算 法。它易 于理解和操作, 也很流行。算 法的名字以发明 者的名字命名:Ron Rivest, AdiShamir 和 Leonard Adleman。早在 1973 年,英国国家通信总局的数学家 Clifford Cocks 就发现了类似的算法。但是他的发现被列为绝密,直到 1998 年才公诸于世。
RSA 算法是一种非对称密码算法,所谓非对称,就是指该算法需要一对密钥,使 用其中一个加密,则需要用另一个才能解密。
RSA 的算法涉及三个参数,n、e1、e2。 其中,n 是两个大质数 p、q 的积,n 的二进制表示时所占用的位数,就是所谓的 密钥长度。 e1 和 e2 是一对相关的值,e1 可以任意取,但要求 e1 与(p-1)*(q-1)互质;再选择 e2 , 要 求 (e2*e1)mod((p-1)*(q-1))=1。 (n 及 e1),(n 及 e2)就是密钥对。 RSA 加解密的算法完全相同,设 A 为明文,B 为密文,则:A=B^e1 mod n;B=A^e2 mod n; e1 和 e2 可以互换使用,即: A=B^e2 mod n;B=A^e1 mod n;
//以下为解密算法
void Decryption() {//解密算法
for(int i = 0; i < MAXLENGTH; i++) DecryptionText[i] = 1;
int count; for(int j = 0; j < size; j++) {
count = d; while(count > 0) {//对密文进行解密 DecryptionText =(Ciphertext)^ d (mod n)
//文和加密后的密文
int DecryptionText[MAXLENGTH];//存放解密后的明文
////////////////////////////////////////////////////////////
//以下为加密算法
void Encryption() {//加密算法
cout << " 请输入两个较大的素数:" ; cin >> p >> q ; cout << " p = " << p << ", q = " << q << endl; n = p * q;//求解 n, phi = (p - 1) * ( q - 1 );//求解 n 的欧拉函数值 cout << " n = " << n << ", phi = " << phi << endl; cout << " 请从[0," << phi - 1 << "]中选择一个与 " << phi << " 互 素的数 e:"; cin >> e; float d0; for( int i = 1; ; i++) {///求解乘法逆元 e * d ≡ 1 (mod phi)
Page 7 of 8
士倾向于因子分解不是 NPC 问题。 RSA 的缺点主要有:A)产生密钥很麻烦,受到素数产生技术的限制,因而难以
做到一次一密。B)分组长度太大,为保证安全性,n 至少也要 600bits 以上,使运算 代 价 很 高 ,尤 其 是 速 度 较 慢 ,较 对 称 密 码 算 法 慢 几 个 数 量 级 ;且 随 着 大 数 分 解 技 术 的 发展,这个长度还在增加,不利于数据格式的标准化。目前,SET(Secure Electronic Transaction)协议中要求 CA 采用 2048bits 长的密钥,其他实体使用 1024 比特的密钥。 C)RSA 密钥长度随着保密级别提高,增加很快。下表列出了对同一安全级别所对应 的密钥长度。
d0 = (float)(phi*i+1) / e; if( d0 - (int)d0 == 0 )
break; } d = (int)d0; cout << endl; cout << " e = " << e << ", d = " << d << endl; cout << " 公开密钥 Pk = {e,n} = {" << e << "," << n << "}" << endl; cout << " 秘密密钥 Sk = {d,n} = {" << d << "," << n << "}" << endl; cout << endl;
//加密算法
count-- ; } } cout << " 密文为:" ; size = j;//实际密文长度 for(int k=0; k<j; k ++) cout << Ciphertext[k] << " "; cout << endl ; } //////////////////////////////////////////////////////////////
Page 3 of 8
cin >> clear[j]; if( clear[j] == -1 )
break; count = e; while(count > 0) {//对明文进行加密 Ciphertext =(clear)^ e mod n
Ciphertext[j] = (Ciphertext[j] * clear[j]) % n;
【我的实验】 1、 RSA 加密、解密算法的 C++实现(可以在 VC6.0 上运行):
Page 2 of 8
#include<iostream> #include<cmath> using namespace std;
#define MAXLENGTH 500 //明文最大长度,即所允许最大整数个数
DecryptionText[j] = ((DecryptionText[j] * Ciphertext[j]) %n); count-- ; } }
cout << " 解密后的明文为:"; for( int k = 0; k < size; k ++)
cout << DecryptionText[k] << " "; cout << endl ;
注意:此处不能用 m2[j] = clear[j] ^ e 整数的幂,因为当 e 和 clear[j]较大 时,会发生溢出,至使出现无法预料的结果。
行判断。
3 由于以上原因,当我们所用数据较大时,会出现错误,例如运行结果③。
4 当我们输入要进行加密的明文时,必须保证每个正整数小于 n,我们没有做 防范措施,也会出现错误结果。
【参考资料】1、
Page 6 of 8
2、百度文库:http://baike.baidu.com/view/539299.htm
信息安全技术实验报告
———非对称加密、解密算法 RSA 的 C++实现
计算机学院 2008 级 12 班 学号:53081224 姓名:胡守峰
非对称加密、解密算法 RSA 的 C++实现
【我的目的】根据课上老师所讲“非对称加密、解密算法 RSA”的有关知识,
编写其的 C++语言实现。
【我的加密思想】第一步,用户首先输入两个素数 p 和 q,并求出
cout << " 请输入要加密的小于 " << n << " 正整数(以-1 结束):" << endl; cout << " 加密前的明文为:"; for( i = 0; i < MAXLENGTH; i++)
Ciphertext[i] = 1; int count; for(int j = 0; j<MAXLENGTH; j++) {
n = p*q,然后再求出 n 的欧拉函数值 phi。 第二步,在[e,phi]中选出一个与 phi 互素的整数 e,并根据 e*d ≡1(mod
phi),求出 e 的乘法逆元。至此我们已经得到了公开密钥{e,n}和秘密密钥{d, n}。
第三步,让用户输入要进行加密的小于 n 一组正整数(个数不超过 MAXLENGTH=500),输入以-1 为结束标志,实际个数存入 size 中,正整数以 clear[MAXLENGTH]保存。
RSA 算法是第一个能同时用于加密和数字签名的算法,也易于理解和操作。 RSA 是被研究得最广泛的公钥算法,从提出到现在已近二十年,经历了各种攻击 的考验,逐渐为人们接受,普遍认为是目前最优秀的公钥方案之一。RSA 的安全性 依赖于大数的因子分解,但并没有从理论上证明破译 RSA 的难度与大数分解难度等 价。即 SA 的重大缺陷是无法从理论上把握它的保密性能如何,而且密码学界多数人
cout << " 加密前的明文为:"; for( k = 0; k < size; k++)
cout << clear[k] << " "; cout << endl; } void main() { Encryption(); char c; cout << endl; cout << "是否要解密(Y or N): "; cin >> c; if(c == 'y' || c == 'Y')
第五步,输出加密后的密文。
【我的解密思想】第一步,根据在以上算法中求出的解密密钥[d,phi],对加
密 后 的 密 文 Ciphertext[MAXLENGTH] 进 行 解 密 , 结 果 保 存 在 DecryptionText[MAXLENGTH]中,算法如下:
第二步,输出对加密前的明文和加密并解密后的密文进行比较,判断两个数组是 否一致,从而得知算法是否正确。
Page 8 of 8
int size = 0;//保存要进行加密的正整数的个数
int p, q; //两个大素数
int n, phi; //n = p * q,phi = (p-1) * (q-1) 是 n 的欧拉函数值
int e;
//{e, n}为公开密钥
int d;
//{d, n}为秘密密钥
int clear[MAXLENGTH], Ciphertext[MAXLENGTH];//分别用于存放加//密前的明
Decryption();
Page 4 of 8
else return ;
}
2、 运行结果: ①
②
③
Page 5 of 8
3、 实验分析:
1 输入两个大素数 p 和 q 时,没有进行判断所输入的是不是素数 2 对 phi 求解 e 的乘法逆元时,必须保证 e 和 phi 互素,在这里我们也没有进
保密级别 对称密钥长度(bit) RSA 密钥长度(bit) ECC 密钥长度(bit) 保密年限
80
80
1024
160
2010
百度文库
112
112
2048
224
2030
128
128
3072
256
2040
192
192
7680
384
2080
256
256
15360
512
2120
这种算法 1978 年就出现了,它是第一个既能用于数据加密也能用于数字签名的算 法。它易 于理解和操作, 也很流行。算 法的名字以发明 者的名字命名:Ron Rivest, AdiShamir 和 Leonard Adleman。早在 1973 年,英国国家通信总局的数学家 Clifford Cocks 就发现了类似的算法。但是他的发现被列为绝密,直到 1998 年才公诸于世。
RSA 算法是一种非对称密码算法,所谓非对称,就是指该算法需要一对密钥,使 用其中一个加密,则需要用另一个才能解密。
RSA 的算法涉及三个参数,n、e1、e2。 其中,n 是两个大质数 p、q 的积,n 的二进制表示时所占用的位数,就是所谓的 密钥长度。 e1 和 e2 是一对相关的值,e1 可以任意取,但要求 e1 与(p-1)*(q-1)互质;再选择 e2 , 要 求 (e2*e1)mod((p-1)*(q-1))=1。 (n 及 e1),(n 及 e2)就是密钥对。 RSA 加解密的算法完全相同,设 A 为明文,B 为密文,则:A=B^e1 mod n;B=A^e2 mod n; e1 和 e2 可以互换使用,即: A=B^e2 mod n;B=A^e1 mod n;
//以下为解密算法
void Decryption() {//解密算法
for(int i = 0; i < MAXLENGTH; i++) DecryptionText[i] = 1;
int count; for(int j = 0; j < size; j++) {
count = d; while(count > 0) {//对密文进行解密 DecryptionText =(Ciphertext)^ d (mod n)
//文和加密后的密文
int DecryptionText[MAXLENGTH];//存放解密后的明文
////////////////////////////////////////////////////////////
//以下为加密算法
void Encryption() {//加密算法
cout << " 请输入两个较大的素数:" ; cin >> p >> q ; cout << " p = " << p << ", q = " << q << endl; n = p * q;//求解 n, phi = (p - 1) * ( q - 1 );//求解 n 的欧拉函数值 cout << " n = " << n << ", phi = " << phi << endl; cout << " 请从[0," << phi - 1 << "]中选择一个与 " << phi << " 互 素的数 e:"; cin >> e; float d0; for( int i = 1; ; i++) {///求解乘法逆元 e * d ≡ 1 (mod phi)
Page 7 of 8
士倾向于因子分解不是 NPC 问题。 RSA 的缺点主要有:A)产生密钥很麻烦,受到素数产生技术的限制,因而难以
做到一次一密。B)分组长度太大,为保证安全性,n 至少也要 600bits 以上,使运算 代 价 很 高 ,尤 其 是 速 度 较 慢 ,较 对 称 密 码 算 法 慢 几 个 数 量 级 ;且 随 着 大 数 分 解 技 术 的 发展,这个长度还在增加,不利于数据格式的标准化。目前,SET(Secure Electronic Transaction)协议中要求 CA 采用 2048bits 长的密钥,其他实体使用 1024 比特的密钥。 C)RSA 密钥长度随着保密级别提高,增加很快。下表列出了对同一安全级别所对应 的密钥长度。
d0 = (float)(phi*i+1) / e; if( d0 - (int)d0 == 0 )
break; } d = (int)d0; cout << endl; cout << " e = " << e << ", d = " << d << endl; cout << " 公开密钥 Pk = {e,n} = {" << e << "," << n << "}" << endl; cout << " 秘密密钥 Sk = {d,n} = {" << d << "," << n << "}" << endl; cout << endl;
//加密算法
count-- ; } } cout << " 密文为:" ; size = j;//实际密文长度 for(int k=0; k<j; k ++) cout << Ciphertext[k] << " "; cout << endl ; } //////////////////////////////////////////////////////////////
Page 3 of 8
cin >> clear[j]; if( clear[j] == -1 )
break; count = e; while(count > 0) {//对明文进行加密 Ciphertext =(clear)^ e mod n
Ciphertext[j] = (Ciphertext[j] * clear[j]) % n;
【我的实验】 1、 RSA 加密、解密算法的 C++实现(可以在 VC6.0 上运行):
Page 2 of 8
#include<iostream> #include<cmath> using namespace std;
#define MAXLENGTH 500 //明文最大长度,即所允许最大整数个数
DecryptionText[j] = ((DecryptionText[j] * Ciphertext[j]) %n); count-- ; } }
cout << " 解密后的明文为:"; for( int k = 0; k < size; k ++)
cout << DecryptionText[k] << " "; cout << endl ;