- 密码体制
1.对称加密
信息的加密和解密用的是相同的密匙。常见的对称加密算法有AES,DES等。
2.非对称加密
信息的加密和解密需要用两个密匙,分别为公开的公钥(Public Key)和私有的密钥(Private Key)。比较常见的非对称加密算法有RSA算法。
- 预备知识
1.互质
公约数只有1的两个整数构成互质关系。(注:不是质数也可构成互质关系)
2.欧拉函数
对于正整数n,欧拉函数f(n)是小于n的正整数中与n互质的数的个数。
3.模反元素
如果两个正整数a和n互质,那么一定可以找到一个整数b,使得a*b-1可以被n整除,即
(a * b) mod n = 1
以上即为了解RSA算法的一些必备知识,本文对RSA算法背后的数学原理不做解释(原谅笔者水平有限),仅仅从应用的角度去阐述在实际应用中如何使用RSA算法。
- RSA加密及解密
图1 RSA加密解密过程图解
1.加密及解密过程
甲:信息传递方
乙:信息接收方
(1)乙生成公钥和密钥,并且把公钥发送给甲
(2)甲使用公钥将信息进行加密,并将密文传递给乙
(3)乙用私钥对加密信息进行解密
2.密钥生成步骤
(1)随机选择两个不相等的质数p和q
(2)计算乘积n = p * q,n的长度就是密钥的长度
(3)计算欧拉函数f(n) = (p - 1) * (q - 1)(注:这里用了欧拉函数的性质,读者可以自行网上查阅)
(4)随机选取一个整数e,使其满足1 < e < f(n),且e要与f(n)互质
(5)计算e关于f(n)的模反元素d(选择一个符合条件的值即可):
e * d - 1 = k * f(n)
(6)得到公钥(Public Key)与私钥(Private Key)
公钥(Public Key):(e,n)
私钥(Private Key):(d,n)
3.加密及解密算法
明文:m
密文:c
加密:c = (m ^ e) mod n
解密:m = (c ^ d) mod n
4.RSA算法为什么具有可靠性
(1)对外公开的只有e和n
(2)根据模反元素计算公式:
e * d - 1 = k * f(n)
只有知道f(n)才能推导出d
(3)而f(n) = (p - 1) * (q - 1),只有知道了p和q才能计算出f(n)
(4)n = p * q,只有将n因数分解才可以计算出p和q
根据数论知识我们知道,大整数的因数分解是很困难的,所以这就决定了RSA算法的安全性。
RSA允许你选择公钥的大小。512位的密钥被视为不安全的;768位的密钥不用担心受到除了国家安全管理(NSA)外的其他事物的危害;1024位的密钥几乎是安全的。 百度百科
所以在实际应用中使用1024位及以上的密匙就可以保证信息的安全。
- 代码演示
注:本文只使用一个简单的示例来阐述RSA算法加密解密的过程,实际应用中读者可以找到RSA算法库进行代码移植。
代码语言:javascript复制#include <stdio.h>
#include <math.h>
/* Two prime */
#define P 3
#define Q 11
/* Product of prime numbers */
#define N (P * Q)
/* Euler function */
#define Z ((P - 1) * (Q - 1))
/* Random number,1 < E < N,coprime with Z */
#define E 3
/* Modulo Multiplicative Inverse:E * D - 1 = kZ */
#define D 7
#define MsgLen 1
/* Public Key:(E,N), Private Key:(D,N) */
/* m:Original Message, c:Encrypted Message */
int main()
{
int i;
int EncryptedMsg[MsgLen],DecryptedMsg[MsgLen];
int TransMsg[MsgLen] = {2};
/* Encryption Process */
printf("Encryption Process:n");
printf("Original MessagetEncrypted Messagen");
for(i = 0;i < MsgLen;i )
{
/* c = (m ^ E) mod N */
EncryptedMsg[i] = ((int)pow(TransMsg[i],E)) % N;
printf("%dttt%dn",TransMsg[i],EncryptedMsg[i]);
}
printf("n");
/* Decryption Process */
printf("Decryption Process:n");
printf("Encrypted MessagetOriginal Messagen");
for(i = 0;i < MsgLen;i )
{
/* m = (c ^ D) mod N */
DecryptedMsg[i] = ((int)pow(EncryptedMsg[i],D)) % N;
printf("%dttt%dn",EncryptedMsg[i],DecryptedMsg[i]);
}
getchar();
return 0;
}
代码运行结果如下:
图2 RSA简单代码演示
在VS Code中运行以上代码,可以看出对数字2进行RSA加密后变为数字8,用RSA解密后又得到原始的数字2。
以上是本期的所有内容,如果您对文章有疑问或者建议欢迎联系笔者。